固定容器
compose会查找之前的容器,把旧容器的volume-data拷贝到容器中。除非手动用docker rm命令删除容器,否则CONTAINER ID不会发生改变。
版本
Compose file format | Docker Engine |
---|---|
1 | 1.9.0+ |
2.0 | 1.10.0+ |
2.1 | 1.12.0+ |
2.2, 3.0, 3.1, 3.2 | 1.13.0+ |
2.3, 3.3, 3.4, 3.5 | 17.06.0+ |
2.4 | 17.12.0+ |
3.6 | 18.02.0+ |
3.7 | 18.06.0+ |
文件结构说明
根节点
- version 定义了版本信息
- services 定义了服务的配置信息
- networks 定义了网络信息,提供给 services 中的 具体容器使用
- volumes 定义了卷信息,提供给 services 中的 具体容器使用
- services 的定义包含应用于为该服务启动的每个容器的配置,非常类似于将命令行的 docker container create
- networks 的定义类似于命令行的 docker network create
- volumes 的定义类似于命令行的 docker volume create
顶级配置
container_name
指定容器名称。Compose 的容器默认名称格式是:<项目名称><服务名称><序号>序号>服务名称>项目名称>
注意: 指定容器名称后,该服务将无法进行扩展(scale),因为 Docker 不允许多个容器具有相同的名称
labels
为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息
1 | labels: |
构建时应用的配置选项
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像
如果使用 build 指令,那么在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置
build
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
类似于命令行的 docker build .
1 | version: '3' |
context
指定 Dockerfile 所在文件夹的路径
dockerfile
指定 Dockerfile 文件名
args
类似Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后消失
context
指定 Dockerfile 所在文件夹的路径
一个build配置的示例:
1 | version: '3' |
image
指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像
如果同时指定了 image和 build,, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 构建的镜像则使用 image 中指定的名字webapp:tag命名
command
使用 command 可以覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
也可以写成类似 Dockerfile 中的格式:
command: [bundle, exec, thin, -p, 3000]
depends_on
解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web
1 | version: '3' |
注意:web 服务不会等待redis和db完全启动之后才启动,它是容器启动后就启动,里面的服务有可能还没有起来。
解决办法:
一个方面是在连接层面使用自动重连策略,比如mysql jdbc可以有auto reconnect自动重连参数。或者使用下面建议的用一个脚本(wait-for-it.sh)来探测依赖服务已经完全准备好,或者自己编写一个health check脚本来检测依赖服务的健康状况来判断依赖服务是否启动完成。
1 | !/bin/bash |
command: [“./wait-for-postgres.sh”, “db”, “python”, “app.py”]
注意如果你使用wait-for-it.sh脚本,如果你的基础镜像不包含bash命令(比如alpine镜像)需要安装bash,不然没法执行wait-for-it.sh脚本导致容器启动失败。
如果Dockerfile的基础镜像用的是alpine相关的基础镜像的话,记得添加如下指令安装bash:
1 | RUN apk update |
environment
设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
1 | version: '3.5' |
YAML中如果变量名称或者值中用到 true|false,yes|no 等表达布尔 含义的词汇,最好放到引号(单双均可)里,避免 YML 自动解析某些内容为对应的布尔语义。这些特定词汇,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定容器内部的端口为参数
1 | expose: |
ports
暴露端口信息
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以
1 | ports: |
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。暴露给连接的服务,而不暴露给主机
1 | expose: |
env_file
从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
如果在配置文件中有build操作,变量并不会进入构建过程中。
1 | env_file: .env |
links
将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
1 | links: # 指定服务名称:别名 |
volumes卷挂载路径
设置网络模式
1 | volumes: |
dns
配置 dns 服务器,可以是一个值或列表
1 | dns: 8.8.8.8 |
extra_hosts
添加主机名的标签,会在/etc/hosts文件中添加一些记录。
1 | extra_hosts: |
volumes_from
从另一个服务或容器挂载其数据卷
1 | volumes_from: |
entrypoint
在Dockerfile中有一个指令叫做ENTRYPOINT指令,用于指定接入点。
在docker-compose.yml中可以定义接入点,覆盖Dockerfile中的定义:
entrypoint: /code/entrypoint.sh
cap_add
增加指定容器的内核能力(capacity)。
让容器具有所有能力可以指定
1 | cap_add: |
cap_drop
去掉指定容器的内核能力(capacity)。
去掉NET_ADMIN能力可以指定:
1 | cap_drop: |
cgroup_parent
创建了一个cgroup组名称为cgroups_1:
cgroup_parent: cgroups_1
devices
指定设备映射关系,例如:
1 | devices: |
extends
基于其它模板文件进行扩展。例如,对于webapp服务定义了一个基础模板文件为common.yml
1 | # common.yml |
再编写一个新的development.yml文件,使用common.yml中的webapp服务进行扩展
1 | # development.yml |
后者会自动继承common.yml中的webapp服务及环境变量定义。
extends限制如下:
A、要避免出现循环依赖
B、extends不会继承links和volumes_from中定义的容器和数据卷资源
推荐在基础模板中只定义一些可以共享的镜像和环境变量,在扩展模板中具体指定应用变量、链接、数据卷等信息
external_links
链接到docker-compose.yml外部的容器,可以是非Compose管理的外部容器。
1 | external_links: |
labels
为容器添加Docker元数据(metadata)信息。例如可以为容器添加辅助说明信息
1 | labels: |
log_driver
指定日志驱动类型。目前支持三种日志驱动类型
1 | log_driver: "json-file" |
log_opt
日志驱动的相关参数
1 | log_driver: "syslog"log_opt: |
network_mode
设置网络模式
1 | network_mode: "bridge" |
net
设置网络模式
1 | net: "bridge" |
security_opt
指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。例如,配置标签的用户名和角色名
1 | security_opt: |
环境变量
环境变量可以用来配置Docker-Compose的行为。
COMPOSE_PROJECT_NAME
设置通过Compose启动的每一个容器前添加的项目名称,默认是当前工作目录的名字。
COMPOSE_FILE
设置docker-compose.yml模板文件的路径。默认路径是当前工作目录。
DOCKER_HOST
设置Docker daemon的地址。默认使用unix:///var/run/docker.sock。 DOCKER_TLS_VERIFY
如果设置不为空,则与Docker daemon交互通过TLS进行。
DOCKER_CERT_PATH
配置TLS通信所需要的验证(ca.pem、cert.pem 和 key.pem)文件的路径,默认是 ~/.docker
指令部分整理自以下网友,感谢
https://www.jianshu.com/p/ba77c7bdf03e