docker介绍

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。可以模糊的理解为轻量级的虚拟机(其实不是虚拟机)。重要的是开源。。。

docker 架构

eUrYKs.png

docker 命令

查看docker的images

docker images

查看docker当前进程:

docker ps

docker运行image

docker run -p 8000:80 -d image的名字

docker run -it --name=ctf -p 5100:80 -d andreisamuilik/php5.5.9-apache2.4-mysql5.5

解释 docker的-p 是代表了端口映射,把image的80端口映射到本机的8000端口,-d是把这个进程当守护进程来执行。

向docker里边拷贝文件

docker cp 本机文件名 docker容器的id:docker容器里的路径

例: docker cp index.html 9b9cb95443b5:/usr/share/

停止docker容器

docker stop docker容器的id

在docker容器内做的改动,都是暂时的。没有被保存。

保存对docker容器的修改

docker commit -m '信息' docker容器的id 生成的image名字

删除image

docker rmi image的id

删除停止后的容器记录

docker rm 容器的id

进入容器

docker exec it 容器id /bin/bash

命令小结

命令 用途
docker pull 获取image
docker build 创建image
docker images 列出本地image
docker run 运行容器
docker rm 删除已经停止的容器
docker rmi 删除image
docker cp 主机和容器中拷贝文件
docker commit 保存改动过的容器为新的image

dockerfile

第一个dockerfile:

FROM alpine:latest
MAINTAINER alex
CMD echo "hello alex!"

解释:第一句是一个基础类,相当与c语言中的include <stdio.h>
第二句 后面的词代表了作者。

通过dockerfile来生成image

docker build -t hello_alex .

解释 -t 后面是标签名 
.代表的是包当前文件夹下的所有文件都送给docker demain来生成image。实际上就是路径

第二个dockerfile

FROM ubuntu
MAINTAINER alex
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 
RUN apt-get update
RUN apt-get install -y nginx-core
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g", "daemon off;"]
EXPOSE 80

第三句就是加速
最后一句是暴露端口
命令 用途
FROM 基础image
RUN 执行命令
ADD 添加文件(可以添加远程文件)
COPY 拷贝文件
CMD 执行命令
EXPOSE 暴露端口
WORKDIR 运行命令指定路径
MAINTAINER 维护者
ENV 设置环境变量
ENTRYPOINT 容器入口
USER 指定用户
VOLUME mount point(挂载卷)

镜像仓库

在镜像仓库搜索image

docker search 镜像名

下载镜像

docker pull 镜像名

本地复制docker镜像

docker tag 要复制的镜像名 新镜像的名字

向仓库传本地镜像

docker login 
登陆
docker push 要上上传的image名字

docker下ubuntu16.04上搭建lamp环境:
安装php
参考:ubuntu 使用apt-get install 安装php5.6–php7

安装apache2:

apt-get install -y apache2
service apache2 start //开启apache2服务

安装mysql:

apt-get -y install mysql-server mysql-client

然后存在几个问题。
1.dockerfile在执行的时候不接受任何需要输入的参数,所以我们需要把输入的东西写在dockerfile里,否则dockerfile在运行到需要接受参数的地方就是一直处于等待状态。这里用到了静默安装。请参考
Linux下实现软件的静默安装 debconf

2.CMD容器启动命令,执行完命令会自动退出。
解决的两种方法:
方法一

写在

dockerfile里写
CMD ["/run.sh"]
run.sh里写
source /etc/apache2/envvars
exec apache2 -D FOREGROUND

或者

ENTRYPOINT [ "/usr/sbin/apache2" ]
CMD ["-D", "FOREGROUND"]

我的理解就是把apache2当作守护进程,一直运行,保证容器不退出。
缺点:不能重启apache服务。

参考文章:
CMD 容器启动命令
方法二:

dockerfile里写
CMD ["/run.sh"]
run.sh里写
while true
do
 sleep 1
done

命令一直不退出,就能保证容器一直在运行。
参考文章:
dockerfile->LAMP
综上所述,dockerfile如下:

FROM ubuntu:16.04

MAINTAINER alex

RUN apt-get update && \
    apt-get install -y apache2 software-properties-common && \
    LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php && \
    apt-get update && \
    apt-get install -y \
    libapache2-mod-php5.6 \
    php5.6 \
    php5.6-cli \
    php5.6-curl \
    php5.6-dev \
    php5.6-gd \
    php5.6-imap \
    php5.6-mbstring \
    php5.6-mcrypt \
    php5.6-mysql \
    php5.6-pgsql \
    php5.6-pspell \
    php5.6-xml \
    php5.6-xmlrpc \
    php-apcu \
    php-memcached \
    php-pear \
    vim \
    && apt-get clean \
    && rm -fr /var/lib/apt/lists/*

RUN apt-get update && \
  echo 'mysql-server-5.7 mysql-server/root_password password root' |  debconf-set-selections && \
  echo 'mysql-server-5.7 mysql-server/root_password_again password root' | debconf-set-selections && \
  apt-get -y install mysql-server && \
  apt-get -y install mysql-client && \
  apt-get clean && \
  rm -fr /var/lib/apt/lists/*

COPY html/ /var/www/html/
COPY run.sh /run.sh
RUN chmod 755 /run.sh && \
    chmod 755 -R /var/www/html/
EXPOSE 80
CMD ["/run.sh"]

run.sh:

#!/bin/bash
chown www-data:www-data /var/www/html -R
## 关闭报错机制
if [ "$ALLOW_OVERRIDE" = "**False**" ]; then
    unset ALLOW_OVERRIDE
else
    sed -i "s/AllowOverride None/AllowOverride All/g" /etc/apache2/apache2.conf
    a2enmod rewrite
fi
## 指定端口
echo "ServerName localhost:80" >>/etc/apache2/apache2.conf
service mysql restart
service mysql stop
# initialize database
mysqld_safe --skip-grant-tables --skip-networking &
sleep 5
## change root password
mysql -uroot -e "use mysql;update user set authentication_string=PASSWORD('alex') where User='root';update user set plugin='mysql_native_password';flush privileges;"
## 解决mysql5.7的中文乱码问题
echo "no-auto-rehash
default-character-set=utf8
safe-updates">>/etc/mysql/conf.d/mysql.cnf

echo "character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES">>/etc/mysql/mysql.conf.d/mysqld.cnf
## restart mysql
service mysql restart

mysql -uroot -palex < /var/www/html/sql.sql
rm /var/www/html/sql.sql

## 解决vim汉语乱码问题
echo "set fileencodings=ucs-bom,utf-8,latin1,gbk,cp936,gb2312
set termencoding=utf-8
set fileformats=unix
set encoding=prc">>~/.vimrc

## 修改apache的一些配置
rm -rf /etc/apache2/apache2.conf /etc/apache2/mods-available/php5.6.conf
mv /var/www/html/apache2.conf /etc/apache2/
mv /var/www/html/php5.6.conf /etc/apache2/mods-available/

chomd 644 -R /etc/apache2/

service apache2 restart
rm -rf /var/www/html/index.html
## 防止容器退出
while true
do
 sleep 1
done

其他的tips:
安装 vim:

apt-get install -y vim 

echo "set fileencodings=ucs-bom,utf-8,latin1,gbk,cp936,gb2312
set termencoding=utf-8
set fileformats=unix
set encoding=prc">>~/.vimrc
#为了vim能显示中文

在shell中修改mysql密码写法:

mysql版本小于5.7

service mysql stop
# initialize database
mysqld_safe --skip-grant-tables&
sleep 5
## change root password
mysql -uroot -e "use mysql;UPDATE user SET password=PASSWORD('alex') WHERE user='root';FLUSH PRIVILEGES;"
## restart mysql
service mysql restart

mysql版本大于等于5.7

service mysql restart #dockerfile中刚安装好mysql的时候需要先重启
service mysql stop
# initialize database
mysqld_safe --skip-grant-tables --skip-networking &
sleep 5
## change root password
mysql -uroot -e "use mysql;update user set authentication_string=PASSWORD('alex') where User='root';update user set plugin='mysql_native_password';flush privileges;"
## restart mysql
service mysql restart

修改apache服务的配置:
apache目录权限控制
设置.phps,可以访问把

vim /etc/apache2/mods-available/php5.6.conf
把这部分添加注释
#<FilesMatch ".+\.phps$">
#   SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
#   Require all denied
#</FilesMatch>

重启apache服务

修改mysql5.7的默认编码:
参考:Linux mysql 5.7.22设置中文编码-解决乱码问题

echo "no-auto-rehash
default-character-set=utf8
safe-updates">>/etc/mysql/conf.d/mysql.cnf

echo "character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES">>/etc/mysql/mysql.conf.d/mysqld.cnf

重启mysql后有效。

show variables like 'character%'; #查看字符集

未完待续。。。

  • linux三剑客

    前言之前用一些脚本都经常用到grep,sed,awk。但是一直不太熟悉,今天来学习一下,做个备忘录。 grep格式: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTER...

    linux三剑客
  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup
  • 计算机组成原理学习

    计算机组成原理第一章 计算机系统概论计算机系统的层次结构 冯·诺依曼计算机的特点 计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成 指令(程序)和数据以二进制同等地位地存储在存储器中,可按址寻访 指令由操作码和地址码组...

    计算机组成原理学习
  • 2019安洵杯+2019广外比赛web部分题解

    2019安洵杯easy_web知识点:MD5强碰撞,命令执行这个题比较简单,看题目发现传入参数img和cmd,然而图片是传入的img参数控制,让我想到ddctf的一道题,然后发现img是通过把文件名进行转十六进制后两次base64编码...

    2019安洵杯+2019广外比赛web部分题解
  • bypass disfunction

    前言PHP 的 disabled_functions主要是用于禁用一些危险的函数防止攻击者执行系统命令。但是有一些绕过方法。这里做个总结。 基本思路有四种绕过 disable_functions 的手法:第一种,攻击后端组件,寻找存在...

    bypass disfunction
  • 2019极客大挑战RCE ME

    题目环境:http://114.116.44.23:40001/ 题目还是老样子。无字母数字rce。知识点其实都有写过,就不说了。详细参见:【RCE提高篇】题目源码: <?php ini_set("display_errors"...

    2019极客大挑战RCE ME
  • RCE提高篇

    前言首先,需要了解一下命令执行的函数,这里推荐几篇文章,来认识这些函数。浅谈eval和assert从底层分析eval和assert的区别命令执行与代码执行的小结巧用命令注入的N种方式命令注入绕过姿势我就不在说这几个东西,大牛们都说的很...

    RCE提高篇
  • buuctf刷题记录(序)

    love math知识点:代码审计,绕waf直接给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ sho...

    buuctf刷题记录(序)
  • phar拓展反序列化攻击面

    pharphar扩展提供了一种将整个php应用程序放入名为“phar”(php archive)的单个文件中的方法,以便于分发和安装。除了提供这个服务之外,phar扩展还提供了一个文件格式抽象方法,用于通过phardata类创建和操作...

    phar拓展反序列化攻击面
  • 基本工具使用

    常用工具nc/ncatnc被誉为网络界的瑞士军刀。它的功能可见一般。。。 侦听模式 / 传输模式 telnet / 获取banner信息 传输文本信息 传输文件/传输目录 加密传输文件 远程控制/木⻢ 加密所有流量 流...

    基本工具使用