Compose和Docker版本兼容性对应关系如下:
docker compose的顶级配置项有:
- version 定义了版本信息
- services 定义了服务的配置信息
services 的定义包含应用于为该服务启动的每个容器的配置,非常类似于将命令行的 docker container create - networks 定义了网络信息,提供给 services 中的 具体容器使用
networks 的定义类似于命令行的 docker network create - volumes 定义了卷信息,提供给 services 中的 具体容器使用
volumes 的定义类似于命令行的 docker volume create
services 常用相关配置
- container_name
指定容器名称。默认将会使用项目名称服务名称序号
container_name: nginx-front
#指定容器名称后,该服务将不允许进行扩展(scale),因为Docker不允许多个容器具有相同的名称。
- labels
定义容器的元数据(metadata)信息。例如可以为容器添加辅助说明信息
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "test department"
com.startupteam.release: "rc3 for v1.0"
3.构建过程中应用到的相关配置项
每个服务都必须通过 image 来指定镜像或 build 指令(需要 Dockerfile文件)等来自动构建生成镜像
如果使用 build 指令,那么在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置
image用法
指定镜像名称或镜像 ID。如果该镜像在本地不存在,Compose 将会拉取这个镜像
image: nginx:latest
image: 5673fdg8f9
build用法
类似于命令行的 docker build .
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 compose 将会利用它自动构建这个镜像,然后使用这个镜像
version: '3'
services:
nginx-front:
build: ./test
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。同时使用 dockerfile 指令指定 Dockerfile 文件 名
version: '3'
services:
nginx-front:
build:
context: ./test
dockerfile: Dockerfile-nginx
如果同时指定了 image和 build, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 会使用 build 指令中指定的 Dockerfile 构建的镜像,之后构建的镜像名称使用 image 中指定的名字 nginx-front:tag命名
build: ./test
image: nginx-front:tag
4 . command
command指令可以覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
也可以写成类似 Dockerfile 中的格式
command: [bundle, exec, thin, -p, 3000]
- depends_on
定于容器的依赖的其他容器及启动先后问题。以下例子中会先启动容器tomcat和redis再启动nginx
但是并不意味着nginx-front服务会等待redis和tomcat完全启动之后才启动
version: '3'
services:
nginx-front:
build: ./test
depends_on:
- tomcat
- redis
redis:
image: redis
tomcat:
image: tomcat
6.environment
设置环境变量。可以使用数组或字典两种格式
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据
environment:
DEV_ENV: test
SESSION_SECRET:
environment:
- DEV_ENV=test
- SESSION_SECRET
- ports
映射端口信息
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)
ports:
- "80"
- "80:80"
- "6379:6379"
- "127.0.0.1:8080:8080"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
- expose
暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定容器内部的端口为参数
expose:
- "80"
- "443"
- networks
容器需要要加入的网络,使用顶级networks 定义下的条目
services:
nginx-front:
networks:
- test-network-01
...
networks:
test-network-01:
driver: bridge #设置自定义网络的驱动, bridge(默认)/host/none
关于顶级配置项的networks:
1). 不显式声明网络环境
docker-compose.yml会创建一个$(basename ${PWD})_default命名的compose网络
version: '3'
services:
nginx:
image: nginx:latest
depends_on:
- db
ports:
- "8081:80"
links:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: X951068Zl@
[root@master jumpserver]# docker-compose up
[root@master jumpserver]# docker network ls
...
3c2b843a81e7 jumpserver_default bridge local
...
2).使用已存在的自定义网络:
networks:
default:
external:
name: jumpserver_default
3).创建一个bridge类型compose网络:
networks:
nginx-network
10.extra_hosts
类似Docker中的 --add-host 参数,指定container额外的host解析
extra_hosts:
- "registry.yun-ti.com:192.168.0.50"
- "code.yun-ti.com:192.168.0.50"
- healthcheck
通过命令检查容器是否健康运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 180s
timeout: 10s
retries: 3
- links
相较于解决容器启动顺序问题的depends_on,links标签用来解决的是容器连接问题,与Docker client的–link一样效果,会连接到其它服务中的容器
version: '3'
services:
nginx-front:
images: nginx:latest
depends_on:
- tomcat
- redis
links:
- tomcat
- redis
#使用的别名将会自动在服务容器中的/etc/hosts里创建:
172.1.0.2 tomcat
172.1.0.3 redis
- deploy
指定与部署和运行服务相关的配置
只有在集群方式部署的时候这个配置才有效
deploy # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
endpoint_mode # v3.3 版本中新增的功能, 指定服务暴露的方式
vip # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
dnsrr # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
labels # 指定服务的标签,这些标签仅在服务上设置
mode # 指定 deploy 的模式
global # 每个集群节点都只有一个容器
replicated # 用户可以指定集群中容器的数量(默认)
placement # 不知道怎么用
replicas # deploy 的 mode 为 replicated 时, 指定容器副本的数量
resources # 资源限制
limits # 设置容器的资源限制
cpus: "0.5" # 设置该容器最多只能使用 50% 的 CPU
memory: 50M # 设置该容器最多只能使用 50M 的内存空间
reservations # 设置为容器预留的系统资源(随时可用)
cpus: "0.2" # 为该容器保留 20% 的 CPU
memory: 20M # 为该容器保留 20M 的内存空间
restart_policy # 定义容器重启策略, 用于代替 restart 参数
condition # 定义容器重启策略(接受三个参数)
none # 不尝试重启
on-failure # 只有当容器内部应用程序出现问题才会重启
any # 无论如何都会尝试重启(默认)
delay # 尝试重启的间隔时间(默认为 0s)
max_attempts # 尝试重启次数(默认一直尝试重启)
window # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
update_config # 用于配置滚动更新配置
parallelism # 一次性更新的容器数量
delay # 更新一组容器之间的间隔时间
failure_action # 定义更新失败的策略
continue # 继续更新
rollback # 回滚更新
pause # 暂停更新(默认)
monitor # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
max_failure_ratio # 回滚期间容忍的失败率(默认值为0)
order # v3.4 版本中新增的参数, 回滚期间的操作顺序
stop-first #旧任务在启动新任务之前停止(默认)
start-first #首先启动新任务, 并且正在运行的任务暂时重叠
rollback_config # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
parallelism # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
delay # 每个组回滚之间的时间间隔(默认为0)
failure_action # 定义回滚失败的策略
continue # 继续回滚
pause # 暂停回滚
monitor # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
max_failure_ratio # 回滚期间容忍的失败率(默认值0)
order # 回滚期间的操作顺序
stop-first # 旧任务在启动新任务之前停止(默认)
start-first # 首先启动新任务, 并且正在运行的任务暂时重叠
volumes 常用相关配置
- volumes
该指令中路径支持相对路径。数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)
volumes:
- /etc/conf
- cache/:/tmp/cache
- ~/home/nginxlogs:/var/logs/nginx:ro
- 卷的 bind 和 volume 的混合使用示例
version: "3.2"
services:
nginx-front:
image: nginx:alpine
volumes:
# 卷 (volume)
- type: volume
source: ngx-cfg-data
target: /etc/nginx
volume:
nocopy: true
# 挂载 (bind)
- type: bind
source: /home/static
target: /usr/share/nginx/html
mysql:
image: mysql:5.7.3
volumes:
- "/var/run/mysql/mysql.sock:/var/run/mysql/mysql.sock"
- "msyql-data:/var/lib/mysql"
volumes:
ngx-cfg-data:
mysql-data
容器的限制的参数
- ulimits
指定容器的 ulimits 限制值。
e.g.指定最大进程数为 65535,指定文件句柄数为65535(软限制<=硬限制)
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
2.sysctl
配置容器内核参数
sysctls:
net.core.somaxconn: 10240
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=10240
- net.ipv4.tcp_syncookies=0
编写一个版本 3.6的docker-compose.yml示例
version: "3.6"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
mysql:
image: mysql:5.7.3
volumes:
- db-data:/var/lib/mysql
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: