一. Docker-compose简介
1. Docker-compose简介
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
2. Docker-compose的安装
安装环境查看
安装
apt install python-pip
pip install docker-compose
PS:centos使用命令yum -y install python-pip安装pip
查看安装的版本
# docker-compose --version
docker-compose version 1.24.0, build 0aa5906
3.Docker-compose卸载
pip uninstall docker-compose
二. Docker-compose常用命令
1. Docker-compose命令格式
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
命令选项如下
-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose 输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
2. docker-compose up
docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]
选项包括:
-d 在后台运行服务容器
-no-color 不是有颜色来区分不同的服务的控制输出
-no-deps 不启动服务所链接的容器
--force-recreate 强制重新创建容器,不能与-no-recreate同时使用
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–build 在启动容器前构建服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
3. docker-compose ps
docker-compose ps [options] [SERVICE...]
列出项目中所有的容器
4. docker-compose stop
docker-compose stop [options] [SERVICE...]
选项包括
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
docker-compose stop
停止正在运行的容器,可以通过docker-compose start 再次启动
5. docker-compose -h
docker-compose -h
查看帮助
6. docker-compose down
docker-compose down [options]
停止和删除容器、网络、卷、镜像。
选项包括:
–rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans,删除服务中没有在compose中定义的容器
docker-compose down
停用移除所有容器以及网络相关
7. docker-compose logs
docker-compose logs [options] [SERVICE...]
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。
docker-compose logs
查看服务容器的输出
-f 跟踪日志输出
8. docker-compose bulid
docker-compose build [options] [--build-arg key=val...] [SERVICE...]
构建(重新构建)项目中的服务容器。
选项包括:
–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg key=val为服务设置build-time变量
服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务
9. docker-compose pull
docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像。
选项包括:
–ignore-pull-failures,忽略拉取镜像过程中的错误
–parallel,多个镜像同时拉取
–quiet,拉取镜像过程中不打印进度信息
docker-compose pull
拉取服务依赖的镜像
10. docker-compose restart
docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项包括:
-t, –timeout TIMEOUT,指定重启前停止容器的超时(默认为10秒)
docker-compose restart
重启项目中的服务
11. docker-compose rm
docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。
选项包括:
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
docker-compose rm
删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。
12. docker-compose start
docker-compose start [SERVICE...]
docker-compose start
启动已经存在的服务容器。
13. docker-compose run
docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。
docker-compose run ubuntu ping www.baidu.com
在指定容器上执行一个ping命令。
14. docker-compose scale
docker-compose scale web=3 db=2
设置指定服务运行的容器个数。通过service=num的参数来设置数量
15. docker-compose pause
docker-compose pause [SERVICE...]
暂停一个服务容器
16. docker-compose kill
docker-compose kill [options] [SERVICE...]
通过发送SIGKILL信号来强制停止服务容器。
支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号:
docker-compose kill -s SIGINT
17. docker-compose config
docker-compose config [options]
验证并查看compose文件配置。
选项包括:
–resolve-image-digests 将镜像标签标记为摘要
-q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
–services 打印服务名,一行一个
–volumes 打印数据卷名,一行一个
18. docker-compose create
docker-compose create [options] [SERVICE...]
为服务创建容器。
选项包括:
–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
–no-build:不创建镜像,即使缺失
–build:创建容器前 ,生成镜像
19. docker-compose exec
docker-compose exec [options] SERVICE COMMAND [ARGS...]
选项包括:
-d 分离模式,后台运行命令。
–privileged 获取特权。
–user USER 指定运行的用户。
-T 禁用分配TTY,默认docker-compose exec分配TTY。
–index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器
20. docker-compose port
docker-compose port [options] SERVICE PRIVATE_PORT
显示某个容器端口所映射的公共端口。
选项包括:
–protocol=proto,指定端口协议,TCP(默认值)或者UDP
–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)
21,docker-compose push
docker-compose push [options] [SERVICE...]
推送服务依的镜像。
选项包括:
–ignore-push-failures 忽略推送镜像过程中的错误
22. docker-compose stop
docker-compose stop [options] [SERVICE...]
停止运行的容器
23. docker-compose uppause
docker-compose unpause [SERVICE...]
恢复处于暂停状态中的服务。
三. Docker-compose模板文件
Docker-compose模板文件简介
Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。
举例
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
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"]
11. configs
使用服务 configs 配置为每个服务赋予相应的访问权限,支持两种不同的语法。
Note: 配置必须存在或在
configs
此堆栈文件的顶层中定义,否则堆栈部署失效
11.1 SHORT 语法
SHORT 语法只能指定配置名称,这允许容器访问配置并将其安装在 /<config_name>
容器内,源名称和目标装入点都设为配置名称。
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
以上实例使用 SHORT
语法将redis
服务访问授予 my_config
和 my_other_config
,并被 my_other_config
定义为外部资源,这意味着它已经在 Docker 中定义。可以通过 docker config create
命令或通过另一个堆栈部署。如果外部部署配置都不存在,则堆栈部署会失败并出现 config not found
错误。
Note: config 定义仅在 3.3 版本或在更高版本的撰写文件格式中受支持,YAML 的布尔值(true, false, yes, no, on, off)必须要使用引号引起来(单引号、双引号均可),否则会当成字符串解析。
11.2 LONG 语法
LONG 语法提供了创建服务配置的更加详细的信息
- source:Docker 中存在的配置的名称
- target:要在服务的任务中装载的文件的路径或名称。如果未指定则默认为
/<source>
- uid 和 gid:在服务的任务容器中拥有安装的配置文件的数字
UID
或GID
。如果未指定,则默认为在Linux上。Windows不支持。 - mode:在服务的任务容器中安装的文件的权限,以八进制表示法。例如,0444 代表文件可读的。默认是 0444。如果配置文件无法写入,是因为它们安装在临时文件系统中,所以如果设置了可写位,它将被忽略。可执行位可以设置。如果您不熟悉 UNIX 文件权限模式,Unix Permissions Calculator
下面示例在容器中将 my_config 名称设置为redis_config
,将模式设置为0440
(group-readable)并将用户和组设置为103
。该redis
服务无法访问my_other_config
配置。
version: "3.3"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config
target: /redis_config
uid: '103'
gid: '103'
mode: 0440
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
可以同时授予多个配置的服务相应的访问权限,也可以混合使用 LONG
和SHORT
语法。定义配置并不意味着授予服务访问权限。
12. cgroup_parent
可以为容器选择一个可选的父 cgroup
cgroup_parent: m-executor-abcd
注意:当 使用(Version 3)Compose 文件在群集模式下部署堆栈时,忽略此选项
13. container_name
为自定义的容器指定一个名称,而不是使用默认的名称
container_name: my-web-container
因为 docker 容器名称必须是唯一的,所以如果指定了一个自定义的名称,不能扩展一个服务超过 1 个容器
14. credential_spec
为托管服务账户配置凭据规范,此选项仅适用于 Windows
容器服务
在 credential_spec 上的配置列表格式为 file:// 或 registry://
使用 file: 应该注意引用的文件必须存在于CredentialSpecs
,docker 数据目录的子目录中。在 Windows
上,该目录默认为 C:\ProgramData\Docker\
。以下示例从名为C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json
的文件加载凭证规范 :
credential_spec:
file: my-credential-spec.json
使用 registry: 将从守护进程主机上的 Windows
注册表中读取凭据规范。其注册表值必须位于:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
下面的示例通过 my-credential-spec
注册表中指定的值加载凭证规范:
credential_spec:
registry: my-credential-spec
15. deploy
指定与部署和运行服务相关的配置
version: '3'
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
这里有几个子选项
15.1 endpoint_mode
指定连接到群组外部客户端服务发现方法
- endpoint_mode:vip :Docker 为该服务分配了一个虚拟
IP
(VIP),作为客户端的 “前端“ 部位用于访问网络上的服务。 - endpoint_mode: dnsrr : DNS轮询(DNSRR)服务发现不使用单个虚拟 IP。Docker为服务设置 DNS 条目,使得服务名称的 DNS 查询返回一个 IP 地址列表,并且客户端直接连接到其中的一个。如果想使用自己的负载平衡器,或者混合 Windows 和 Linux 应用程序,则 DNS 轮询调度(round-robin)功能就非常实用。
version: "3.3"
services:
wordpress:
image: wordpress
ports:
- 8080:80
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
mysql:
image: mysql
volumes:
- db-data:/var/lib/mysql/data
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: dnsrr
volumes:
db-data:
networks:
overlay:
相关信息:Swarm
模式 CLI
命令 、Configure
服务发现
15.2 labels
指定服务的标签,这些标签仅在服务上设置。
version: "3"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
通过将 deploy
外面的 labels
标签来设置容器上的labels
version: "3"
services:
web:
image: web
labels:
com.example.description: "This label will appear on all containers for the web service"
15.3 mode
global:每个集节点只有一个容器
replicated:指定容器数量(默认)
version: '3'
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global
15.4 placement
指定 constraints
和 preferences
version: '3'
services:
db:
image: postgres
deploy:
placement:
constraints:
- node.role == manager
- engine.labels.operatingsystem == ubuntu 14.04
preferences:
- spread: node.labels.zone
15.5 replicas
如果服务是 replicated(默认),需要指定运行的容器数量
version: '3'
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6
15.6 resources
配置资源限制
version: '3'
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
此例子中,redis 服务限制使用不超过 50M 的内存和 0.50(50%)可用处理时间(CPU),并且 保留 20M 了内存和 0.25 CPU时间
15.7 restart_policy
配置容器的重新启动,代替 restart
- condition:值可以为
none
、on-failure
以及any
(默认) - delay: 尝试重启的等待时间,默认为
0
- max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功
window
,则此尝试不计入配置max_attempts
值。例如,如果max_attempts
值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。 - windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。
version: "3"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
15.8 update_config
配置更新服务,用于无缝更新应用(rolling update)
- parallelism:一次性更新的容器数量
- delay:更新一组容器之间的等待时间。
- failure_action:如果更新失败,可以执行的的是
continue
、rollback
或pause
(默认) - monitor:每次任务更新后监视失败的时间(
ns
|us
|ms
|s
|m
|h
)(默认为0) - max_failure_ratio:在更新期间能接受的失败率
- order:更新次序设置,
top-first
(旧的任务在开始新任务之前停止)、start-first
(新的任务首先启动,并且正在运行的任务短暂重叠)(默认stop-first
)
version: '3.4'
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first
不支持 Docker stack desploy 的几个子选项
build、cgroup_parent、container_name、devices、tmpfs、external_links、inks、network_mode、restart、security_opt、stop_signal、sysctls、userns_mode
16. devices
设置映射列表,与 Docker 客户端的 --device
参数类似 :
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
17. depends_on
此选项解决了启动顺序的问题
在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是
depends_on
,这个标签解决了容器的依赖、启动先后的问题。
指定服务之间的依赖关系,有两种效果
docker-compose up
以依赖顺序启动服务,下面例子中 redis
和 db
服务在 web
启动前启动docker-compose up SERVICE
自动包含 SERVICE
的依赖性,下面例子中,例如下面容器会先启动 redis
和 db
两个服务,最后才启动 web 服务:
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意的是,默认情况下使用 docker-compose up web
这样的方式启动 web
服务时,也会启动 redis
和 db
两个服务,因为在配置文件中定义了依赖关系
18. dns
自定义 DNS
服务器,与 --dns
具有一样的用途,可以是单个值或列表
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
19. dns_search
自定义 DNS
搜索域,可以是单个值或列表
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
20. tmpfs
挂载临时文件目录到容器内部,与 run
的参数一样效果,可以是单个值或列表
tmpfs: /run
tmpfs:
- /run
- /tmp
21. entrypoint
在 Dockerfile 中有一个指令叫做 ENTRYPOINT
指令,用于指定接入点。在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:
entrypoint: /code/entrypoint.sh
entrypoint 也可以是一个列表,方法类似于 dockerfile
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
21. env_file
从文件中添加环境变量。可以是单个值或是列表
如果已经用 docker-compose -f FILE
指定了 Compose 文件,那么 env_file
路径值为相对于该文件所在的目录
但 environment 环境中的设置的变量会会覆盖这些值,无论这些值未定义还是为 None
env_file: .env
或者根据 docker-compose.yml 设置多个:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
环境配置文件env_file
中的声明每行都是以 VAR=VAL
格式,其中以 # 开头的被解析为注释而被忽略
注意环境变量配置列表的顺序*,例如下面例子
docker_compose.yml
services:
some-service:
env_file:
- a.env
- b.env
a.env 文件
# a.env
VAR=1
1
2
b.env文件
对于在文件a.env
中指定的相同变量但在文件 b.env
中分配了不同的值,如果 b.env
像下面列在 a.env
之后,则刚在 a.env
设置的值被 b.env
相同变量的值覆盖,此时 $VAR
值为 hello
。此外,这里所说的环境变量是对宿主机的 Compose 而言的,如果在配置文件中有 build 操作,这些变量并不会进入构建过程中,如果要在构建中使用变量还是首选 arg 标签
22. environment
添加环境变量,可以使用数组或字典。与上面的 env_file
选项完全不同,反而和 arg
有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置,这是与 arg
最大的不同。
一般 arg
标签的变量仅用在构建过程中。而 environment
和 Dockerfile 中的 ENV
指令一样会把变量一直保存在镜像、容器中,类似 docker run -e
的效果
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
或
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
23. expose
暴露端口,但不映射到宿主机,只被连接的服务访问。这个标签与 Dockerfile 中的 EXPOSE
指令一样,用于指定暴露的端口,但是只是作为一种参考,实际上 docker-compose.yml
的端口映射还得 ports
这样的标签
expose:
- "3000"
- "8000"
24. external_links
链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 项目文件管理的容器。参数格式跟 links 类似
在使用Docker过程中,会有许多单独使用
docker run
启动的容器的情况,为了使 Compose 能够连接这些不在docker-compose.yml
配置文件中定义的容器,那么就需要一个特殊的标签,就是external_links
,它可以让Compose 项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。
格式如下
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
25. extra_hosts
添加主机名的标签,就是往 /etc/hosts
文件中添加一些记录,与 Docker 客户端 中的 --add-host
类似:
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
具有 IP 地址和主机名的条目在 /etc/hosts
内部容器中创建。启动之后查看容器内部 hosts
,例如:
162.242.195.82 somehost
50.31.209.229 otherhost
26.healthcheck
用于检查测试服务使用的容器是否正常
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
interval
,timeout
以及 start_period
都定为持续时间
test
必须是字符串或列表,如果它是一个列表,第一项必须是 NONE
,CMD
或 CMD-SHELL
;如果它是一个字符串,则相当于指定CMD-SHELL
后跟该字符串。
# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]
# As above, but wrapped in /bin/sh. Both forms below are equivalent.
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
如果需要禁用镜像的所有检查项目,可以使用 disable:true
,相当于 test:["NONE"]
healthcheck:
disable: true
27. image
从指定的镜像中启动容器,可以是存储仓库、标签以及镜像 ID
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果镜像不存在,Compose 会自动拉去镜像
28. isolation
Linux 上仅仅支持 default
值
29. labels
使用 Docker 标签将元数据添加到容器,可以使用数组或字典。与 Dockerfile 中的 LABELS
类似:
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
30.links
链接到其它服务的中的容器,可以指定服务名称也可以指定链接别名(SERVICE:ALIAS)
,与 Docker
客户端的 --link
有一样效果,会连接到其它服务中的容器
web:
links:
- db
- db:database
- redis
使用的别名将会自动在服务容器中的 /etc/hosts
里创建。例如:
172.12.2.186 db
172.12.2.186 database
172.12.2.187 redis
相应的环境变量也将被创建
31. logging
配置日志服务
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
该 driver值是指定服务器的日志记录驱动程序,默认值为 json-file
,与 --log-diver
选项一样
driver: "json-file"
driver: "syslog"
driver: "none"
注意:只有驱动程序 json-file
和 journald
驱动程序可以直接从 docker-compose up
和 docker-compose logs
获取日志。使用任何其他方式不会显示任何日志。
对于可选值,可以使用 options
指定日志记录中的日志记录选项
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
默认驱动程序 json-file
具有限制存储日志量的选项,所以,使用键值对来获得最大存储大小以及最小存储数量
options:
max-size: "200k"
max-file: "10"
上面实例将存储日志文件,直到它们达到max-size:200kB
,存储的单个日志文件的数量由该 max-file 值指定。随着日志增长超出最大限制,旧日志文件将被删除以存储新日志
docker-compose.yml
限制日志存储的示例
services:
some-service:
image: some-service
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
32. network_mode
网络模式,用法类似于 Docke 客户端的 --net
选项,格式为:service:[service name]
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
可以指定使用服务或者容器的网络
33. networks
加入指定网络
services:
some-service:
networks:
- some-network
- other-network
34. aliases
同一网络上的其他容器可以使用服务器名称或别名来连接到其他服务的容器
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
下面实例中,提供 web
、worker
以及db
服务,伴随着两个网络 new
和 legacy
。
version: '2'
services:
web:
build: ./web
networks:
- new
worker:
build: ./worker
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
相同的服务可以在不同的网络有不同的别名
35. ipv4_address、ipv6_address
为服务的容器指定一个静态 IP
地址
version: '2.1'
services:
app:
image: busybox
command: ifconfig
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
-
subnet: 172.16.238.0/24
-
subnet: 2001:3984:3989::/64
36. PID
pid: "host"
将 PID
模式设置为主机 PID
模式,可以打开容器与主机操作系统之间的共享 PID
地址空间。使用此标志启动的容器可以访问和操作宿主机的其他容器,反之亦然。
37. ports
映射端口
37.1 SHORT 语法
可以使用 HOST:CONTAINER
的方式指定端口,也可以指定容器端口(选择临时主机端口),宿主机会随机映射端口
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
注意:当使用
HOST:CONTAINER
格式来映射端口时,如果使用的容器端口小于60
可能会得到错误得结果,因为YAML
将会解析xx:yy
这种数字格式为60
进制,所以建议采用字符串格式。
37.2LONG 语法
LONG 语法支持 SHORT 语法不支持的附加字段
- target:容器内的端口
- published:公开的端口
- protocol: 端口协议(
tcp
或udp
) - mode:通过host 用在每个节点还是哪个发布的主机端口或使用 ingress 用于集群模式端口进行平衡负载,
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
38. secrets
通过 secrets
为每个服务授予相应的访问权限
38.1 SHORT 语法
version: "3.1"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- my_secret
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
38.2 LONG 语法
LONG 语法可以添加其他选项
source:secret 名称
target:在服务任务容器中需要装载在 /run/secrets/
中的文件名称,如果 source
未定义,那么默认为此值
uid&gid:在服务的任务容器中拥有该文件的 UID
或 GID
。如果未指定,两者都默认为 0。
mode:以八进制表示法将文件装载到服务的任务容器中 /run/secrets/
的权限。例如,0444
代表可读。
version: "3.1"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- source: my_secret
target: redis_secret
uid: '103'
gid: '103'
mode: 0440
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
39. security_opt
为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签,比如设置全部服务的 user
标签值为 USER
security_opt:
- label:user:USER
- label:role:ROLE
40. stop_grace_period
在发送 SIGKILL 之前指定 stop_signal ,如果试图停止容器(如果它没有处理 SIGTERM(或指定的任何停止信号)),则需要等待的时间
stop_grace_period: 1s
stop_grace_period: 1m30s
默认情况下,stop
在发送SIGKILL
之前等待10秒钟容器退出
41. stop_signal
设置另一个信号来停止容器。在默认情况下使用的 SIGTERM
来停止容器。设置另一个信号可以使用 stop_signal 标签:
stop_signal: SIGUSR1
42. sysctls
在容器中设置的内核参数,可以为数组或字典
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
43. ulimits
覆盖容器的默认限制,可以单一地将限制值设为一个整数,也可以将soft/hard
限制指定为映射
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
44. userns_mode
userns_mode: "host"
45. volumes
挂载一个目录或者一个已存在的数据卷容器,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统
version: "3.2"
services:
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
volumes:
mydata:
dbdata:
Compose 的数据卷指定路径可以是相对路径,使用 . 或者 … 来指定相对目录。
数据卷的格式可以是下面多种形式:
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
45.1 SHORT 语法
可以选择在主机(HOST:CONTAINER)或访问模式(HOST:CONTAINER:ro)上指定路径。
可以在主机上挂载相对路径,该路径相对于正在使用的 Compose 配置文件的目录进行扩展。相对路径应始终以 . 或 … 开头
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
45.2 LONG 语法
LONG 语法有些附加字段
- type:安装类型,可以为
volume
、bind
或tmpfs
- source:安装源,主机上用于绑定安装的路径或定义在顶级 volumes密钥中卷的名称 ,不适用于 tmpfs 类型安装。
- target:卷安装在容器中的路径
- read_only:标志将卷设置为只读
- bind:配置额外的绑定选项
- propagation:用于绑定的传播模式
- volume:配置额外的音量选项
- nocopy:创建卷时禁止从容器复制数据的标志
- tmpfs:配置额外的
tmpfs
选项 - size:
tmpfs
的大小,以字节为单位
version: "3.2"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
networks:
webnet:
volumes:
mydata:
46. volumes_from
从其它容器或者服务挂载数据卷,可选的参数是 :ro
或 :rw
,前者表示容器只读,后者表示容器对数据卷是可读可写的(默认情况为可读可写的)。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
47. 用于服务、群集以及堆栈文件的卷
在使用服务,群集和 docker-stack.yml
文件时,请记住支持服务的任务(容器)可以部署在群集中的任何节点上,并且每次更新服务时都可能是不同的节点。
在缺少指定源的命名卷的情况下,Docker 为支持服务的每个任务创建一个匿名卷。关联的容器被移除后,匿名卷不会保留。
如果希望数据持久存在,请使用可识别多主机的命名卷和卷驱动程序,以便可以从任何节点访问数据。或者,对该服务设置约束,以便将其任务部署在具有该卷的节点上。
下面一个例子,Docker Labs 中 votingapp 示例的 docker-stack.yml
文件中定义了一个称为 db 的服务。它被配置为一个命名卷来保存群体上的数据, 并且仅限于在节点上运行。下面是来自该文件的部分内容:db postgres manager
version: "3"
services:
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
48. restart
默认值为 no
,即在任何情况下都不会重新启动容器;当值为 always
时,容器总是重新启动;当值为 on-failure
时,当出现 on-failure
报错容器退出时,容器重新启动。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
49. 其他选项
关于标签:cpu_shares、cpu_quota、 cpuse、domainname、hostname、 ipc、 mac_address、privileged、 read_only、 shm_size、stdin_open、tty、 user、 working_dir
上面这些都是一个单值的标签,类似于使用 docker run
的效果
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: true
read_only: true
shm_size: 64M
stdin_open: true
tty: true
50. 持续时间
某些配置选项如 check
的子选项interval
以及timeout
的设置格式
2.5s
10s
1m30s
2h32m
5h34m56s
支持的单位有 us
、ms
、s
、m
以及 h
51. 指定字节值
某些选项如 bulid
的子选项 shm_size
2b
1024kb
2048k
300m
1gb
支持的单位是 b
,k
,m
以及 g
,或 kb
, mb
和 gb
。目前不支持十进制值
52. extends
这个标签可以扩展另一个服务,扩展内容可以是来自在当前文件,也可以是来自其他文件,相同服务的情况下,后来者会有选择地覆盖原有配置
extends:
file: common.yml
service: webapp
用户可以在任何地方使用这个标签,只要标签内容包含 file
和 service
两个值就可以了。file
的值可以是相对或者绝对路径,如果不指定 file
的值,那么 Compose 会读取当前 YML 文件的信息。