docker-compose- 高阶技巧
也就是不常用的, 和特殊场合有用的;
高阶配置注解
services:
web:
# 设置为主机 PID 模式, 跟主机系统共享进程命名空间
# 容器使用这个标签将能够访问和操纵其他容器和宿主机的名称空间
pid: "host"
# 服务的用户命名空间; host 表示使用主机的用户名命名空间
userns_mode: "host"
# 更换容器的停止信号, 默认是 SIGTERM
stop_signal: SIGUSR1
# 在容器内运行一个 pid=1 的 init 进程, 用于接收和转发信号
# 使用的 init 二进制文件是特定于平台的
init: true
# 指定符合 oci 规范的运行时
runtime: runc
# 使用只读文件系统创建的服务容器, 这个容器不能写任何文件
read_only: true
# 设置当使用 docker-compose up -d 时不包含 指定的 容器
# 只有 docker-compose --profile abc up -d 可以启动它, 也可以用于忽略某些检查
profiles: ["abc"]
# 为所有容器覆盖默认的标签; 简单说来就是给大家都设置一个标签
security_opt:
- label:user:USER
- label:role:ROLE权限和内核
services:
web:
# 特权模式
privileged: true
# 运行进程的身份, 容器内的用户名
# 默认是 root 用户
# 注意如果挂载文件系统时, 这个 uid 所对应的宿主机 uid 的关系
# user: "1000:1000"
# user: postgresql
user: nginx:nginx
# 声明容器内的运行用户必须属于某个组, 以保障在读写外部文件时具有权限
# 暂不清楚是否会自动附加组的权限
group_add:
- mail
# 设置容器中的内核参数, 可以使用数组或字典格式
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
# sysctls:
# - net.core.somaxconn=1024
# - net.ipv4.tcp_syncookies=0
# Capabiliity 添加或放弃容器的 Linux 能力
# 严格一点则先 drop 全部规则, 再添加需要的规则
cap_drop:
# - ALL
- NET_ADMIN
- SYS_ADMIN
cap_add:
- ALL
- CHOWN
- DAC_OVERRIDE
- NET_BIND_SERVICE # 绑定 1024 以下端口
- SETGID
- SETUID
# 指定要加入的 cgroup 命名空间, 支持 host 和 private
cgroup: host
cgroup_parent: m-executor-abcdWatch 模式
场景: 开发阶段修改一点内容就需要手动重新 build 镜像, 再启动, 操作繁琐;
Compose V2 的 watch 功能能自动检测变化; 非常适合本地开发环境;
services:
web:
build: .
ports:
- "3000:3000"
develop:
watch:
# 源代码变, 直接同步进容器(热加载)
- action: sync
path: ./src
target: /app/src
# package.json 变了, 重新构建镜像
- action: rebuild
path: ./package.json
# 配置文件变了, 重启容器就行
- action: sync+restart
path: ./config
target: /app/config需要单独一个窗口启动 watch 命令进行持续监听
docker compose watch复杂项目的工程管理
当有很多服务, 很多环境, 很多文件时的项目组织方式;
- 模板引用
- include 载入
- override 多文件组合
- extends 扩展
- profiles
模板引用
定义一个模板后, 其它地方进行引用, 可复用很多重复性配置;
x-insight-template: &insight-template
restart: unless-stopped
image: harbor.chenwx.top/cwx/insight-${SERVICE_NAME}:${TAG}
services:
insight-admin:
<<: *insight-template
environment:
SERVICE_NAME: admin
TAG: 202503131006
insight-api:
<<: *insight-template
environment:
SERVICE_NAME: api
TAG: 202503131006include 载入
载入另外一个 yaml 文件, 方便大型项目的拆分, 注意冲突;
# 简单引用
include:
- my-compose-include.yaml
# 多文件引用和附加参数
include:
- path: ../commons/compose.yaml
# compose.yaml 文件内的相对路径
project_directory: ..
# 指定解析这个 compose 文件时使用的 .env 文件, 默认为 project_directory/.env
env_file: ../another/.env
- path:
- ../commons/compose.yaml
- ./commons-override.yamloverride 多文件方式
两种使用形式
- 命令行使用; 后面的优先级比前面高会覆盖前面的冲突部分;
- docker-compose.override.yml 文件的方式
命令行使用
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
docker-compose -f docker-compose.yml -f docker-compose.pro.yml updocker-compose.override.yml 方式
这个文件是官方作为 docker-compose.yml 文件的补充来使用的; .override.yml 这个名字是约定的, 可以自动加载;
注意
- 执行结果是二者的并集
- 相同的部分, 并非简单的 override 的关系, 而是先后执行
类似于这种方式, 但是默认使用的
docker-compose \
-f docker-compose.yml \
-f docker-compose.override.yml \
upextends 扩展
也是一种抽出公共组件的方式
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
# development.yml
web:
extends:
file: common.yml
service: webapp # 继承这个文件内的 webapp 服务
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true # 覆盖
db:
image: postgresprofiles
适合 1 个文件内的多个服务 要适应 不同的组合场景时; 例如 A 环境启用 2 个, B 环境启用 3 个这种场景;
services:
app:
image: app:1.1
db:
image: postgres:16
redis:
image: redis:7-alpine
# 只在测试时启动
selenium:
image: selenium/standalone-chrome:latest
profiles:
- testing
# 只在需要监控时启动
prometheus:
image: prom/prometheus:latest
profiles:
- monitoring
grafana:
image: grafana/grafana:latest
profiles:
- monitoring使用方式
# 只启动核心服务
docker compose up
# 跑集成测试, 带上 selenium
docker compose --profile testing up
# 需要监控
docker compose --profile monitoring up
# all
docker compose --profile testing --profile monitoring up
最后更新于