跳至内容
docker-compose- 高阶技巧

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-abcd

Watch 模式

场景: 开发阶段修改一点内容就需要手动重新 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

复杂项目的工程管理

当有很多服务, 很多环境, 很多文件时的项目组织方式;

  1. 模板引用
  2. include 载入
  3. override 多文件组合
  4. extends 扩展
  5. 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: 202503131006

include 载入

载入另外一个 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.yaml

override 多文件方式

两种使用形式

  1. 命令行使用; 后面的优先级比前面高会覆盖前面的冲突部分;
  2. 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 up

docker-compose.override.yml 方式

这个文件是官方作为 docker-compose.yml 文件的补充来使用的; .override.yml 这个名字是约定的, 可以自动加载;

注意

  1. 执行结果是二者的并集
  2. 相同的部分, 并非简单的 override 的关系, 而是先后执行

类似于这种方式, 但是默认使用的

docker-compose \
    -f docker-compose.yml \
    -f docker-compose.override.yml \
    up

extends 扩展

也是一种抽出公共组件的方式


# 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: postgres

profiles

适合 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
最后更新于