本文主要参考官方文档对目前最新的V3版docker-compose配置文件进行一个总结。都是一些概念性的内容,不涉及具体操作。
Docker Compose配置文件是一个用于定义服务、网络和数据卷的YAML文件。其中服务定义了该服务启动的每个容器的配置,就像将命令行参数传递给docker run一样,网络和数据卷的定义类似于docker network create和docker volume create。跟docker run一样,如果在Dockerfile中通过诸如CMD、EXPOSE、VOLUME和ENV这些指令指定了相关选项,那么在默认情况下,不需要在docker-compose.yml中再次指定它们。下面是从官网引过来的一个Compose配置文件的示例,可以先大致了解一下它的结构:
version: "3.8"
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:
顶层的version
、services
、networks
和volumes
将Compose配置文件分为四个部分,其中version
指定Compose配置文件的版本,services
定义服务,networks
定义网络,volumes
定义数据卷。
二、服务配置
服务定义了该服务启动的每个容器的配置,就像将命令行参数传递给docker run
一样。比如以下配置:
services:
redis:
image: redis:alpine
services
下的redis
是用户自定义的服务名称,redis
下的image
只是众多服务配置项中的其中一个,意思是指定镜像名称或id。下面就对服务的相关配置项进行一个总结。
1.build
在构建时应用的配置项。一般直接指定Dockerfile
所在文件夹路径,可以是绝对路径,或者相对于Compose配置文件的路径。可以指定为包含构建上下文(context)路径的字符串。例如:
version: "3.8"
services:
webapp:
build: ./dir
也可以使用context
指定上下文路径,使用dockerfile
基于上下文路径指定Dockerfile文件,使用args
指定构建参数。例如:
version: "3.8"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
如果同时指定了build
和image
。例如:
build: ./dir
image: webapp:tag
Compose会在./dir
目录下构建一个名为webapp
,标签为tag
的镜像。
使用
docker stack deploy
时的注意事项:在swarm mode下部署堆栈时,build
配置项被忽略。因为docker stack
命令不会在部署之前构建镜像。
(1)context
指定包含Dockerfile
的目录路径或git仓库url。该目录是发送给Docker守护进程(Daemon)的构建上下文(context)。当配置的值是相对路径时,它将被解释为相对于Compose配置文件的路径。例如:
build:
context: ./dir
指定上下文为Compose配置文件目录下的dir
目录。
(2)dockerfile
指定Dockerfile文件。Compose会使用指定的Dockerfile文件构建镜像,但必须要指定构建上下文路径。例如:
build:
context: .
dockerfile: Dockerfile-alternate
Compose会使用Compose配置文件所在目录下名为Dockerfile-alternate
的Dockerfile文件构建镜像。
(3)args
添加构建参数,这些只能在构建过程中访问的环境变量。首先在Dockerfile文件中指定参数:
ARG buildno
ARG gitcommithash
RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
然后build
中指定参数,以下两种写法都可以:
build:
context: .
args:
buildno: 1
gitcommithash: cdc3b19
build:
context: .
args:
- buildno=1
- gitcommithash=cdc3b19
这时构建过程中使用的参数的值为args
指定的值。在指定构建参数时也可以不指定值,在这种情况下,构建过程中使用的参数的值为运行Compose的环境中的值。例如:
args:
- buildno
- gitcommithash
使用布尔值时的注意事项:YMAL中布尔类型的值(
"true"
、"false"
、"yes"
、"no"
、"on"
、"off"
)必须用引号引起来,以便解析器将它们解释为字符串。
未完待续。。。