Docker 三侠客

Docker 三侠客.

Posted by Rootclay on 2017-03-20

少侠:Docker

少侠:有内力修习,有趁手兵器,大多十分年轻便已经成名,侠之标准是【维护江湖道义,名声大振】

最简单的Docker命令教程网上一大堆了这里举几个经常用的就好

  • 安装:
    sudo apt-get install docker.io

  • 拉取:
    docker pull ubuntu:16.04

  • 运行:
    docker run -it ubuntu:16.04

  • 查看:

    1. 镜像查看
      docker images

    2. 容器查看
      docker ps | docker ps -a 查看所有容器包括已经停止的

    3. 容器内部详情查看
      docker inspect ID

  • 转储:
    sudo docker commit -m "Added nginx from ubuntu16.04" -a "${USER}" 79c761f627f3 ${USER}/ubuntu-nginx:v1

  • 一些小技巧:

    1. 添加国内源

      1. 国内阿里源添加教程
    2. 解决sudo问题

      1. 如果还没有docker group就添加一个:sudo groupadd docker

      2. 将用户加入该group内,然后退出并重新登录生效 sudo gpasswd -a ${USER} docker

      3. 重启docker sudo service docker restart

    3. 删除命令

      1. docker rm $(docker ps -a)
  • Transition:

    1. 从现有容器通过commit命令创建

      1. dockerfile中不方便的操作可以在容器中操作然后提交
      2. 没有批量启动容器的需要
      3. 自己学、习练习,不需要移植
    2. 利用Dockerfile构建

      1. 方便,灵活,可移植
      2. 适合部署大量的镜像和容器

侠尊:Dcokerfile

侠尊:内力高强,兵器使用出神入化,行走江湖,无人不知,侠之标准是【维护江湖道义,鼎鼎有名】

基本语法

  • #
1
1. 注释
  • FROM
1
2
3
4
1. FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。
2. FROM 一定是首个非注释指令 Dockerfile.
3. FROM 可以在一个 Dockerfile 中出现多次,以便于创建混合的images。
4. 如果没有指定 tag ,latest 将会被指定为要使用的基础镜像版本。
  • MAINTAINER
1
1. 这里是用于指定镜像制作者的信息
  • RUN
1
2
3
1. RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。
2. 层级 RUN 指令和生成提交是符合Docker核心理念的做法。它允许像版本控制那样,在任意一个点,对image 镜像进行定制化构建。
3. RUN 指令缓存不会在下个命令执行时自动失效。比如 RUN apt-get dist-upgrade -y 的缓存就可能被用于下一个指令. --no-cache 标志可以被用于强制取消缓存使用。
  • ENV
1
2
1. ENV指令可以用于为docker容器设置环境变量
2. ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env <key>=<value>来修改环境变量。
  • USER
1
1. USER 用来切换运行属主身份的。Docker 默认是使用 root,但若不需要,建议切换使用者身分,毕竟 root 权限太大了,使用上有安全的风险。
  • WORKDIR
1
2
3
1. WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。
2. Example: `WORKDIR /var/www/html/`
  • COPY
1
2
3
4
1. COPY 将文件从路径 <src> 复制添加到容器内部路径 <dest>。
2. <src> 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url,<dest> 是目标容器中的绝对路径。
3. 所有的新文件和文件夹都会创建UID 和 GID 。事实上如果 <src> 是一个远程文件URL,那么目标文件的权限将会是600。
4. 只是COPY指令不会做自动解压工作。
  • ADD
1
2
3
4
1. ADD 将文件从路径 <src> 复制添加到容器内部路径 <dest>。
2. <src> 必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url。<dest> 是目标容器中的绝对路径。
3. 所有的新文件和文件夹都会创建UID 和 GID。事实上如果 <src> 是一个远程文件URL,那么目标文件的权限将会是600。
4. Example: `ADD web/ /var/www/html/` PS:`注意这个最后的/`
  • VOLUME
1
2
3
1. 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
2. Example: `VOLUME /opt/data /data `
  • EXPOSE
1
2
3
1. EXPOSE 指令指定在docker允许时指定的端口进行转发。
2. Example: `EXPOSE 80`
  • CMD
1
2
3
1. Dockerfile.中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。
2. CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。
3. 当你使用shell或exec格式时, CMD 会自动执行这个命令。
  • ENTRYPOINT
1
1. 是指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。

构建命令

  • cd baseimage(构建上下文文件夹)

  • docker build -t="program/ubuntu:base_image" . PS .用来指定Dockerfile的位置,本目录下就是.

  • docker build-t表示指定容器的名字

  • program/ubuntuprogram表示仓库名(不允许大写),ubuntu表示镜像名。

  • ubuntu:base_image后面的base_image是标签,如果没有指定,默认的是latest

Example

这里以一个实际开发的例子来讲一下,实际开发为需要开发一个xssblind,需要用到的服务有apache、php、mysql、splash(headless browser)

  • 文件结构
1
2
3
4
5
6
7
8
9
10
11
12
.
├── baseimage
│ ├── Dockerfile
│ ├── README.md
│ ├── docker-entrypoint.sh
│ ├── dump.sql
│ ├── xss-protect.sh
│ ├── docker-compose.yaml
│ ├── web/
│ ├── ...
│ ├── ...
其中docker-compose.yaml会在下一节中介绍,本节不做介绍,也没有使用
  • Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
FROM php:apache
MAINTAINER CLAY whoisclay@outlook.com
# Configure /web folder with sample app
RUN rm -rf /var/www/html/*
ADD web/ /var/www/html/
# Add init SQL data
ADD ./dump.sql /var/dump.sql
# Add mirror source List
ADD ./sources.list /etc/apt/sources.list
# update & install
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install mariadb-client
# Install mysqlimport
RUN docker-php-ext-install mysqli
# expose 80 port
EXPOSE 80
# Permission
RUN chown www-data:www-data /var/www/html -R
# ADD .sh script
COPY ./docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
COPY ./xss-protect.sh /
RUN chmod +x /xss-protect.sh
# Config entrypoint
ENTRYPOINT /docker-entrypoint.sh
1
2
3
4
5
6
7
8
#!/bin/bash
echo "create database xssblind" | mysql --host mysql --user root -p$MYSQL_PASSWORD
mysql --host mysql --user root -p$MYSQL_PASSWORD xssblind < /var/dump.sql
apache2-foreground
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
curl -c /tmp/cookie_1.txt -d "username=admin&password=${BACK_PASSWD}" http://127.0.0.1/login.php
grep "[a-zA-Z0-9]\{20,\}" /tmp/cookie_1.txt > /tmp/cookie_2.txt
cat /tmp/cookie_2.txt|while read line; do
VALUE=`awk 'BEGIN {split("'"$line"'",arr);print arr[7]}'`
NAME = 'PHPSESSID='
session=${NAME}${VALUE}
curl -X POST -H 'content-type: application/json' -d '{"url":"http://127.0.0.1/admin.php","method":"GET","wait":1,"headers":{"cookie":"{${session}}"}}' 'http://127.0.0.1:8050/render.html'
done
1
2
3
4
5
6
7
8
9
10
## 部署规则
0. 开始之前如果您需要修改docker的镜像源请参考[Docker – 配置国内加速器加速镜像下载](http://www.rootclay.club/?p=151)
1. 首先进入php文件目录执行`docker build -t xssblind ./`等待build完成
2. 执行mysql容器构建`docker run --name xssblind-mysql -e MYSQL_ROOT_PASSWORD=xss -d mysql:5.6`
3. 执行splash服务的搭建`docker run --name splash -p 127.0.0.1:8050:8050 -d scrapinghub/splash`
4. 执行web服务搭建`docker run -p 8080:80 --link=xssblind-mysql:mysql -e MYSQL_PASSWORD=xss -e BACK_PASSWD=admin -d xssblind```BACK_PASSWD为环境变量,后台admin的密码,默认为admin
5. 设置crontab`crontab -e```然后输入下列内容,脚本内容为请求后台脚本`*/1 * * * * /xss-protect.sh `
如果你需要修改splash的问题,在xss-protect.sh文件中修改curl中的splash请求地址即可

侠圣:Docker-compose

侠圣:内力已由后天转为先天,迈入先天高手行列,能达到此等境界之人少之又少,侠之标准是【维护江湖道义,名垂青史】

概述

一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。

安装Docker Compose

安装docker-compose,依次输入下列命令apt-get install python-pip python-dev然后pip install -U docker-compose

配置文件

  1. Compose的配置文件是docker-compose.yml
  2. Compose的启动文件是docker-compose.yaml

基本语法

  1. image
    指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。
1
2
3
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
  1. build
    指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。

  2. links
    链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。

1
2
3
4
links:
- db
- db:database
- redis

使用的别名将会自动在服务容器中的 /etc/hosts 里创建。例如:

1
2
3
172.17.2.186 db
173.172.17.2.186 database
174.172.17.2.187 redis

相应的环境变量也将被创建。

  1. external_links
    链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的容器。参数格式跟 links 类似。
1
2
3
4
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
  1. ports
    暴露端口信息。
    使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
1
2
3
4
5
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
  1. expose
    暴露端口,但不映射到宿主机,只被连接的服务访问。
    仅可以指定内部端口为参数
1
2
3
expose:
- "3000"
- "8000"
  1. volumes
    卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)。
1
2
3
4
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
  1. environment
    设置环境变量。你可以使用数组或字典两种格式。
    只给定名称的变量会自动获取它在 Compose 主机上的值,可以用来防止泄露不必要的数据。
1
2
3
4
5
6
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
1
2
3
4
5
6
7
8
9
10
11
<?php
return array(
'host' => 'mysql',
'user' => 'root',
'password' => $_ENV['MYSQL_PASSWORD'],
'dbname' => 'xssblind',
'charset' => 'utf8',
'port' => '3306'
);
?>
  1. env_file
    从文件中获取环境变量,可以为单独的文件路径或列表。
    如果通过 docker-compose -f FILE 指定了模板文件,则 env_file 中路径会基于模板文件路径。
    如果有变量名称与 environment 指令冲突,则以后者为准。
1
2
3
4
5
6
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

1
2
# common.env: Set Rails/Rack environment
RACK_ENV=development
  1. dns
    配置 DNS 服务器。可以是一个值,也可以是一个列表。
1
2
3
4
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
  1. more

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
web:
build: .
links:
- db:mysql
ports:
- "8080:80"
environment:
# mysql密码
- MYSQL_PASSWORD=xss
# 后台密码
- BACK_PASSWD=admin
db:
image: mysql
expose:
- "3306"
environment:
# mysql--------root密码
- MYSQL_ROOT_PASSWORD=xss
browser:
image: scrapinghub/splash
expose:
- "8050"
ports:
- "127.0.0.1:8050:8050"

启动服务

一条命令行走江湖:) docker-compose up or docker-compose up -d

©版权为博主所有,转载请联系博主whoisclay#outlook.com并请注明来源