Docker官网

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

version: '2'
services:
# 基本环境
nginx:
container_name: "nginx"
image: nginx
build: ./nginx
command: nginx -g 'daemon off;'
restart: always
# 数据卷
volumes:
- "$PWD/nginx/code:/usr/share/nginx/html"
- "$PWD/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "$PWD/nginx/nginx_conf.conf:/etc/nginx/conf.d/default.conf"
ports:
- 80:80
networks:
ssrf:
ipv4_address: 10.10.1.3

php:
container_name: "php"
# build 该置顶目录下的dockerfile
build: ./php
# image指定build Dockerfile生成镜像的名称
image: php:7.0-fpm-mysqli
expose:
- 9000
volumes:
- "$PWD/php/code:/var/www/html"
- "$PWD/php/php.ini:/usr/local/etc/php/php.ini"
networks:
ssrf:
ipv4_address: 10.10.1.5

vuln-nginx:
container_name: "vuln-nginx"
image: nginx
build: ./vuln-nginx
command: nginx -g 'daemon off;'
restart: always
# 数据卷
volumes:
- "$PWD/vuln-nginx/code:/usr/share/nginx/html"
- "$PWD/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "$PWD/nginx/nginx_conf.conf:/etc/nginx/conf.d/default.conf"
expose:
- 80
networks:
ssrf:
ipv4_address: 10.10.1.6



networks:
# 配置docker network
ssrf:
driver: bridge
ipam:
config:
# 子网络
- subnet: 10.10.1.0/16

Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。

Image

image是指定服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。

1
2
3
services: 
web:
image: hello-world

build

服务除了可以基于指定的镜像,还可以基于一份Dockerfile,在使用up启动时执行构建任务,构建标签是build,可以指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器。
build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到Dockerfile。
build: ./dir
设定上下文根目录,然后以该目录为准指定Dockerfile。

1
2
3
build:
context: ../
dockerfile: path/of/Dockerfile

build都是一个目录,如果要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定。
如果同时指定image和build两个标签,那么Compose会构建镜像并且把镜像命名为image值指定的名字。

command

使用command可以覆盖容器启动后默认执行的命令。
command: bundle exec thin -p 3000

ports

ports用于映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

1
2
3
4
5
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"

当使用HOST:CONTAINER格式来映射端口时,如果使用的容器端口小于60可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER]格式,或者使用[HOST:CONTAINER:ro]格式,后者对于容器来说,数据卷是只读的,可以有效保护宿主机的文件系统。
Compose的数据卷指定路径可以是相对路径,使用 . 或者 … 来指定相对目录。
数据卷的格式可以是下面多种形式:

1
2
3
4
5
6
7
8
9
10
11
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
- /var/lib/mysql
// 使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
- ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
- datavolume:/var/lib/mysql

如果不使用宿主机的路径,可以指定一个volume_driver。
volume_driver: mydriver

链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 SERVICE:ALIAS),例如:

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

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

1
2
3
172.17.2.186  db
172.17.2.186 database
172.17.2.187 redis

net

设置网络模式。

1
2
3
net: "bridge"
net: "none"
net: "host"

参考资料