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: ./php 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: 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
links
链接到其它服务中的容器。使用服务名称(同时作为别名),或者“服务名称:服务别名”(如 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"
|
参考资料