https://docs.docker.com/compose/compose-file/compose-file-v3/#restart_policy
文件介绍
https://docs.docker.com/compose/compose-file/
https://github.com/compose-spec/compose-spec/blob/master/spec.md
文件名先后顺序 docker-compose.yaml 和 docker-compose.yml
version:指定 docker-compose.yml 文件的写法格式 (已弃用)
services:多个容器集合
build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
build: ./dir
---------------
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
command:覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
----------------------------------
command: [bundle,exec,thin,-p,3000]
dns:配置 dns 服务器,可以是一个值或列表
dns: 8.8.8.8
------------
dns:
- 8.8.8.8
- 9.9.9.9
dns_search:配置 DNS 搜索域,可以是一个值或列表
dns_search: example.com
------------------------
dns_search:
- dc1.example.com
- dc2.example.com
environment:环境变量配置,可以用数组或字典两种方式
environment:
RACK_ENV: development
SHOW: 'ture'
-------------------------
environment:
- RACK_ENV=development
- SHOW=ture
env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
env_file: .env
---------------
env_file:
- ./common.env
expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
expose:
- "3000"
- "8000"
image:指定服务所使用的镜像
image: java
network_mode:设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
ports:对外暴露的端口定义,和 expose 对应
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"
- "8763:8763"
- "8763:8763"
links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
links: # 指定服务名称:别名
- docker-compose-eureka-server:compose-eureka
volumes:卷挂载路径
volumes:
- /lib
- /var
logs:日志输出信息
--no-color 单色输出,不显示其他颜.
-f, --follow 跟踪日志输出,就是可以实时查看日志
-t, --timestamps 显示时间戳
--tail 从日志的结尾显示,--tail=200
version: "3.9"
services:
redis:
build: . #指定Dockerfile
build: #指定Dockerfile 目录
context: ./dir
dockerfile: Dockerfile-php
image: redis:6.2.7-alpine
user: root
user: 0:0 #同时设置用户和组
restart: always #重启策略
restart_policy: always #swarm 集群模式重启策略
network_mode: host #网络模式 host bridge none
container_name: redis #自定义容器名称
cap_add: #添加容器拥有的宿主机的内核功能
- ALL # 开启全部权限
cap_drop: #删除容器拥有的宿主机的内核功能
- SYS_PTRACE # 关闭 ptrace权限
cgroup_parent: m-executor-abcd #指定父 cgroup 组,意味着将继承该组的资源限制
volumes:
- "./redis.conf:/usr/local/etc/redis/redis.conf:rw"
- "./data:/data:ro"
- "/postgres.sock:/var/run/postgres.sock"
- type: volume #挂载卷
source: mydata
target: /data
volume:
nocopy: true
- type: bind #绑定本地文件
source: ./static
target: /opt/app/static
- type: tmpfs #挂载内存文件系统
target: /app
tmpfs:
size: "1G" #512M 定义大小 byte 1000*1000=1m
mode: 0777 # 读写权限给值
ports:
- "3000" # 暴露容器的 3000 端口, 宿主机随机映射一个没有被占用的端口
- "3000-3005" # 暴露容器的 3000 到 3005 端口, 宿主机随机映射没有被占用的端口
- "8000:8000" # 容器的 8000 端口和宿主机的 8000 端口建立映射关系
- "9090-9091:8080-8081"
- "127.0.0.1:8001:8001" # 指定映射宿主机的指定地址的
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp" # 指定协议
#command: ["bundle", "exec"]#覆盖容器启动的默认命令
command: bundle exec thin -p 3000
command: ["echo", "Hello"]
command: ["bundle", "exec", "thin", "-p", "3000"]
command: sh -c "yarn install && yarn run dev"
command: /bin/bash -c "redis-server /usr/local/etc/redis/redis.conf"
command: /bin/bash -c "cp xx.yml xx2.yml && python -u ./tcc.py"
command:
- /bin/bash
- -c
- |
while true;
do echo 1;
sleep 30;
done
command: # 或者
- "ping"
- "www.baidu.com"
command:
--default-authentication-plugin=mysql_native_password
--max_connections=5000
entrypoint: /code/entrypoint.sh #覆盖容器默认的 entrypoint
entrypoint:
- php
- -d
env_file: .env #文件添加环境变量
env_file:
- ./common.env
- ./apps/web.env
environment: #添加环境变量
- TZ=Asia/Shanghai
working_dir: /code
privileged:true
expose: #暴露端口,但不映射到宿主机
- "2049"
- "111/upd"
- "32765-32767/udp"
extra_hosts: #添加主机名映射
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
depends_on: #设置依赖关系
- db
devices: #设备映射列表
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns: #自定义 DNS 服务器
- 8.8.8.8
- 9.9.9.9
dns_search: #自定义 DNS 搜索域
- dc1.example.com
- dc2.example.com
logging:
driver: json-file #syslog none
options:
max-size: "5m" # 单个文件大小为200m 200k 2g
max-file: "5" # 最多10个文件
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
healthcheck: #检测 docker 服务是否健康运行
test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
sysctls: #设置容器中的内核参数
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
- net.ipv6.conf.all.disable_ipv6=1
tmpfs: /run
tmpfs: #在容器内安装一个临时文件系统 内存文件目录
- /run
- /tmp
ulimits: #覆盖容器默认的 ulimit
nproc: 65535
nofile:
soft: 20000
hard: 40000
deploy: #集群部署配置 只在swarm 模式下才会有用
mode:replicated/global #部署方式
replicas: 6 #部署数量
endpoint_mode: dnsrr 只能内部
endpoint_mode: vip(默认)/dnsrr #负载方式 虚拟ip/轮询
#vip # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
#dnsrr # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
labels: #服务上设置标签
description: "This redis service label"
resources: #配置服务器资源使用的限制
limits: #最大限制
cpus: '0.50'
memory: 50M #支持b k m g(或者kb,mb,gb
reservations: #预留配置
cpus: '0.25'
memory: 20M
restart_policy: #重启策略
condition: on-failure #可选 none,on-failure在容器非正常退出时(退出状态非0),才会重启容器 或者 any(默认值:any)
delay: 5s #设置多久之后重启
max_attempts: 3 #尝试重新启动容器的次数
window: 120s #设置容器重启超时时间
placement: #约束,部署在
#constraints:
# - node.role == manager |worker
#constraints: [node.role == worker ] #manager
#constraints: [node.hostname == node1 ]
#constraints: [node.labels.isgpu == true]
#constraints: [node.labels.mysql == true ]
init:ture # v3.7 中新增的参数, true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程
logging: # 设置容器日志服务
driver: 'json-file'# 指定日志记录驱动程序, 默认 json-file
options: # 指定日志的相关参数 (等同于 docker run --log-opt 的作用)
max-size # 设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
max-file # 日志文件保留的数量
networks:
- ml0-network
m10-network: #或者
aliases
ipv4_address: 10.0.0.3
ipv6_address: xxxff
networks:
ml0-network:
driver:bridge #bridge overlay host none
name: net123
external: true