docker compose 在 Docker 容器运用中具有很大的学习意义,docker compose
是一个整合发布应用的利器。而使用 docker compose 时,懂得如何编排 docker compose
配置文件是很重要的。
一. 前言
关于 docker compose
技术可以查看官方文档 Docker Compose
以下的内容是确立在已经下载好 Docker 以及 Docker Compose,可参看 Docker Compose 的官方安装教程 Install Docker Compose
二. Docker Compose 配置文件的构建参数说明
首先,官方提供了一个 yaml
Docker Compose 配置文件的标准例子
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
此文件配置了多个服务,关于此配置文件的各个语句含义就需要弄懂配置选项的含义了
文件配置
compose 文件是一个定义服务、 网络和卷的 YAML
文件 。Compose 文件的默认路径是 ./docker-compose.yml
提示:可以是用
.yml
或.yaml
作为文件扩展名
服务定义包含应用于为该服务启动的每个容器的配置,就像传递命令行参数一样 docker container create
。同样,网络和卷的定义类似于 docker network create
和 docker volume create
。
正如 docker container create
在 Dockerfile 指定选项,如 CMD、 EXPOSE、VOLUME、ENV,在默认情况下,你不需要再次指定它们docker-compose.yml。
可以使用 Bash 类 ${VARIABLE}
语法在配置值中使用环境变量。
配置选项
1.bulid
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器
build: /path/to/build/dir
也可以是相对路径
build: ./dir
设定上下文根目录,然后以该目录为准指定 Dockerfile
build:
context: ../
dockerfile: path/of/Dockerfile
例子
version: '3'
services:
webapp:
build: ./dir
如果 context
中有指定的路径,并且可以选定 Dockerfile 和 args。那么 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
与 ENV
不同的是,ARG
可以为空值
args:
- buildno
- password
如果要指定 image
以及 build
,选项格式为
build: ./dir
image: webapp:tag
这会在 ./dir
目录生成一个名为 webaapp
和标记为 tag
的镜像
Note:当用(Version 3) Compose 文件在群集模式下部署堆栈时,该选项被忽略。因为
docker stack
命令只接受预先构建的镜像
2. context
context
选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的 url
当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context
build:
context: ./dir
3. dockerfile
使用此 dockerfile 文件来构建,必须指定构建路径
build:
context: .
dockerfile: Dockerfile-alternate
4. args
添加构建参数,这些参数是仅在构建过程中可访问的环境变量
首先, 在Dockerfile中指定参数:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
然后指定 build
下的参数,可以传递映射或列表
build:
context: .
args:
buildno: 1
password: secret
或
build:
context: .
args:
- buildno=1
- password=secret
指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值
args:
- buildno
- password
Note: YAML 布尔值(true,false,yes,no,on,off)必须使用引号括起来,以为了能够正常被解析为字符串
5. cache_from
编写缓存解析镜像列表
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
6. labels
使用 Docker标签
将元数据添加到生成的镜像中,可以使用数组或字典。
建议使用反向 DNS
标记来防止签名与其他软件所使用的签名冲突
build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
或
build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
7.shm_size
设置容器 /dev/shm
分区的大小,值为表示字节的整数值或表示字符的字符串
build:
context: .
shm_size: '2gb'
或
build:
context: .
shm_size: 10000000
8. target
根据对应的 Dockerfile 构建指定 Stage
build:
context: .
target: prod
9. cap_add、cap_drop
添加或删除容器功能,可查看 man 7 capabilities
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
Note:当用(Version 3) Compose 文件在群集模式下部署堆栈时,该选项被忽略。因为
docker stack
命令只接受预先构建的镜像
10. command
覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
该命令也可以是一个列表,方法类似于 dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]
</