Docker Compose 几个不常用但有用的配置

2025-04-10   Docker运维
Docker Compose 工作流示意

Docker Compose 工作流示意

1. depends_on + healthcheck

默认的 depends_on 只等容器启动(running),不等服务真正就绪。数据库容器启动了但还没完成初始化,应用容器就已经跑起来报连接失败——这个坑几乎每个人都踩过。

services:
  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 10s

  app:
    image: myapp:latest
    depends_on:
      db:
        condition: service_healthy  # 等 healthcheck 通过

2. profiles:只在需要时启动的容器

services:
  adminer:
    image: adminer
    profiles: [debug]   # 不加 --profile debug 就不会启动
    ports:
      - "8080:8080"
# 正常启动(不含 debug 服务)
docker compose up -d

# 需要调试时
docker compose --profile debug up -d adminer

这个对开发环境尤其有用,不用维护两份 compose 文件。

Docker Compose 进阶用法详解(B站)

3. network_mode: host 和桥接的区别

用 network_mode: host 时容器直接用宿主机网络栈,ports 映射无效,容器监听什么端口就是宿主机上的那个端口。适合对网络性能敏感(如代理软件)或需要监听宿主机所有接口的场景。

Mac 上的 Docker Desktop 不真正支持 host 模式,容器仍然在虚拟机里,只是忽略了端口映射,行为和 Linux 上不同。

Docker 网络模式对比示意图

Docker 网络模式对比示意图

4. 环境变量和 .env

# .env 文件(自动被 compose 读取,不要提交到 git)
POSTGRES_PASSWORD=supersecret
REDIS_PORT=6379

# docker-compose.yml 里引用
environment:
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?必须在 .env 里设置}
  # :? 表示如果未设置则报错退出

${VAR:?error} 这个语法能在启动时就发现缺少配置,比运行时才报错好多了。

5. 容器日志管理

默认日志驱动是 json-file,会无限增长。加一下 logging 限制:

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "5"   # 最多 5 个文件,共 250MB