root@mysql-2:~# cat docker-composer.yaml
version: "3"
services:
redis:
# depends_on: 启动容器顺序
# - nginx
# - php-fpm
# - mysql
#image: hanye131/redis-4.0.11
build:
context: /data/soft/redis
dockerfile: Dockerfile
restart: always
hostname: redis
container_name: redis #指定容器名称
ports:
- "6800:6379"
volumes:
- "/etc/redis.conf:/etc/redis.conf:rw"
- "/etc/localtime:/etc/localtime:ro"
- "/usr/local/redis/var:/data/redis:rw"
#volumes_from: #调用其他容器的挂在盘
# - nginx
sysctls:
net.core.somaxconn: '1024'
extra_hosts: #写入数据到/ect/hosts文件
- "hanye.com:192.168.1.39"
- "redis.conf:192.168.1.39"
links: #,这个标签解决的是容器连接问题,与Docker client的--link一样效果,会连接到其它服务中的容器。
- nginx
- mysql
dns_search:
- 192.168.1.1
- 114.114.114.114
cap_add: # 指定容器具有那些内核功能
- ALL
cap_drop: #指定去掉那些内核能力
- NET_ADMIN
healthcheck: #健康检查
test: ["CMD","curl","http://localhost"]
timeout: 10s
retries: 3
interval: 60s
ulimits: #设置线程和打开文件数量
nproc: 65535
nofile:
soft: 20000
hard: 40000
logging: #设置log文件大小
driver: "json-file"
options:
max-size: "20m" #文件大小20m
max-file: "10" #文件保留10个
image
指定使用的镜像 同Dockerfile里面的FROM 如果此镜象不存在 会自己尝试拉去此镜象
image: hanye131:mysql57
image: hanye131:nginx172
build
服务除了可以基于指定的镜像,还可以指定目录下的Dockerfile构建。可以绝对路径和相对路径
相对路径
build: ./datadir
绝对路径
build: /path/to/datadir
如果想要指定目录下的Dockerfile:context
build:
context: /data/soft/redis
dockerfile: Dockerfile
environment 指定环境变量
# environment:
# - REDIS_CONF=on
# - REQUIREPASSWD=hanye131
# - MAXCLIENTS_NUM=6000
# - MAXMEMORY_SIZE=4096
这样在redis.conf里面可以调用此变量:
maxclients ${MAXCLIENTS_NUM}
maxmemory ${MAXMEMORY_SIZE}M
requirepass "${REQUIREPASSWD}"
container_name 指定构建后的容器名字
container_name: redis #指定容器名称 即构建后容器对完展示的名字
container_name: nginx
depends_on 指定构建容器 启动顺序 这样就不会应为存在依赖而报错出现问题
例如: 先启动redis 在启动mysql 最后启动nginx
# depends_on: 启动容器顺序
# - mysql
# - nginx
写法:
version: "3"
services:
redis:
image: redis:latest
depends_on:
- mysql
- nginx
container_name: redis
mysql:
image: mysql:5.7
container_name: mysql57
nginx:
image: nginx:1.17.2
container_name: nginx1172
ports 映射端口
使用主机端口:容器端口格式 或者 只是指定容器的端口,宿主机会随机映射端口。
注意:当使用主机端口:宿主机端口格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误得结果,因为YAML将会解析xx:yy这种数字格式为60进制,所以建议使用字符串格式
ports:
- "8080:80"
- "3309:3306"
- "192.168.1.39:6379:6379"
- "3000-3005" #暴漏容器3000-3005端口
v3.2新增参数
ports:
- target: 80 # 容器端口
published: 8080 # 宿主机端口
protocol: tcp # 协议类型
mode: host # host 在每个节点上发布主机端口, ingress 对于群模式端口进行负载均衡
links 这个标签解决的是容器连接问题
links: #,这个标签解决的是容器连接问题,与Docker client的--link一样效果,会连接到其它服务中的容器。
- nginx
- mysql
实例:
version: "3.2"
services:
redis:
image: fangxin:redis4.0.11
hostname: redis
container_name: link-redis4011
privileged: true
ports:
- "7000:6379"
cap_add:
- ALL
volumes:
- "/etc/redis.conf:/etc/redis/redis.conf:rw"
- "/etc/localtime:/etc/localtime:rw"
- "/mnt/redis:/data/redis:rw"
- "/data/soft/redis/startredis.sh:/startredis.sh:rw"
- "/data/soft/redis/supervisord.conf:/etc/supervisord.conf:rw"
restart: always
links:
- nginx:nginx
- php-fpm:php-fpm
sysctls:
net.core.somaxconn: '1024'
nginx:
image: hanye:nginx172
container_name: link-ginx
hostname: hanye_nginx
cap_add:
- ALL
ports:
- "8082:80"
- "8443:443"
volumes:
- "/data/soft/nginx_compose/html:/usr/local/nginx/html:rw"
- "/data/soft/nginx_compose/conf:/usr/local/nginx/conf:rw"
php-fpm:
image: bitnami/php-fpm
container_name: link-php-fpm
ports:
- "9000:9000"
volumes:
- "/data/soft/nginx_compose/html:/usr/local/nginx/html:rw"
- "/data/soft/nginx_compose/conf:/usr/local/nginx/conf:rw"
hostname: hanye_php-fpm
此处要注意 不能循环调用links:
例如:
redis:
links:
- mysql:link-mysql
- php-fpm:link-php-fpm
mysql:
links:
- redis:link-redis
- php-fpm:link-php-fpm
报错如下:
external_links 调用非compose构建的外部容器
external_links:
- redis-cluster4
- db:mysql
extra_hosts: #写入数据到/ect/hosts文件
extra_hosts: #写入数据到/ect/hosts文件
- "hanye.com:192.168.1.39"
- "redis.conf:192.168.1.39"
即在/etc/hosts里面添加:
192.168.1.39 hanye.com
192.168.1.39 redis.conf
dns和dns_search
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114
dns_search: #会在/etc/resolv.conf 添加解析域
- hanye.com
- 192.168.1.1
volumes 指定挂在目录
volumes:
- "/etc/redis.conf:/etc/redis.conf:rw"
- "/etc/localtime:/etc/localtime:ro"
- "/usr/local/redis/var:/data/redis:rw"
volumes_from 指定挂在容器的目录
volumes_from: #调用其他容器的挂在盘
- nginx
sysctls 指定开启内核参数 直接修改/etc/sysctl.conf
sysctls:
net.core.somaxconn: '1024'
fs.file-max: "1000000"
ulimits 设置容器打开文件线程数量
ulimits: #设置线程和打开文件数量
nproc: 65535
nofile:
soft: 20000
hard: 40000
cap_add 增加容器可以使用那些功能
cap_add: # 指定容器具有那些内核功能
- ALL
cap_dorp 删除容器可以使用的内核功能
cap_drop: #指定去掉那些内核能力
- NET_ADMIN
restart 容器出现问题是否重启
no是默认的重启策略,在任何情况下都不会重启容器。 指定为always时,容器总是重新启动。 如果退出代码指示出现故障错误,则on-failure将重新启动容器。
restart: “no”
restart: always
restart: on-failure
restart: unless-stopped
hostname 指定容器名称
hostname: redis 指定容器启动后的名字
healthcheck: #健康检查
healthcheck: #健康检查
test: ["CMD","curl","http://localhost"]
interval: 1m30s # 每次检查之间的间隔时间
timeout: 10s # 运行命令的超时时间
retries: 3 # 重试次数
start_period: 40s # v3.4 以上新增的选项, 定义容器启动时间间隔
disable: true # true 或 false, 表示是否禁用健康状态检测和 test: NONE 相同
logging: #设置log服务
driver: "json-file"
driver: "syslog"
driver: "none"
只有驱动程序 json-file 和 journald 驱动程序可以直接从 docker-compose up 和 docker-compose logs 获取日志。使用任何其他方式不会显示任何日志。
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.39" 日志发送到39的syslog服务,需要开启39的syslog对外访问
存放到文件
logging: #设置log文件大小
driver: "json-file"
options:
max-size: "20m" #单个文件大小20m
max-file: "10" #文件保留10个
extends 扩展原来的yaml文件 会覆盖原有配置
extends:
file: nginx.yml
service: nginx
deploy 设置资源限制
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
resources:
limits: # 设置容器的资源限制
cpus: '0.50' # 设置该容器最多只能使用 50% 的 CPU
memory: 50M #设置该容器最多只能使用 50M 的内存空间
reservations: # 设置为容器预留的系统资源(随时可用)
cpus: '0.25' # 为该容器保留 20% 的 CPU
memory: 20M # 为该容器保留 20M 的内存空间
network 将容器加入指定网络
networks # 将容器加入指定网络 (等同于 docker network connect 的作用), networks 可以位于 compose 文件顶级键和 services 键的二级键
aliases # 同一网络上的容器可以使用服务名称或别名连接到其中一个服务的容器
ipv4_address # IP V4 格式
ipv6_address # IP V6 格式