Docker Compose 是单机多容器编排的标配工具,这里整理一些用得上的技巧。

1. 多环境配置

用 docker-compose.override.yml 自动覆盖:

# docker-compose.yml
services:
  web:
    image: myapp
    ports:
      - "80:80"
# docker-compose.override.yml(开发时用)
services:
  web:
    ports:
      - "8080:80"
    volumes:
      - ./src:/app/src
    environment:
      DEBUG: "true"

docker-compose up 会自动合并两个文件。生产环境用 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up。

2. 健康检查

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

其他服务可以依赖健康状态:

services:
  web:
    depends_on:
      db:
        condition: service_healthy

3. 资源限制

防止某个容器吃光内存:

services:
  web:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M
        reservations:
          memory: 128M

注意 deploy 在 compose 单机模式下也生效(v2 之后)。

4. 日志管理

默认日志无限制会把磁盘撑爆:

services:
  web:
    image: myapp
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

5. 网络隔离

networks:
  frontend:
  backend:

services:
  web:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend  # 只在 backend 网络,外部访问不到

6. 环境变量

用 .env 文件管理:

# .env
POSTGRES_PASSWORD=secret
APP_PORT=8080
# docker-compose.yml
services:
  db:
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  web:
    ports:
      - "${APP_PORT}:80"

.env 不要提交到 git,加到 .gitignore。

7. Profile 按需启动

services:
  web:
    image: myapp
  debug-tools:
    image: busybox
    profiles:
      - debug

默认 docker-compose up 只启动 web,需要调试工具时:

docker-compose --profile debug up

8. 重启策略

services:
  web:
    restart: unless-stopped  # 总是重启,除非手动停止

选项:

  • no:默认,不重启
  • always:总是重启
  • on-failure:仅非零退出码重启
  • unless-stopped:总是重启,除非手动停止

9. 构建优化

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
      cache_from:
        - myapp:cache

配合 BuildKit:

DOCKER_BUILDKIT=1 docker-compose build

10. 常用命令速查

docker-compose up -d              # 后台启动
docker-compose down -v            # 停止并删除卷
docker-compose logs -f web        # 跟踪日志
docker-compose exec web bash      # 进入容器
docker-compose restart web        # 重启某服务
docker-compose ps                 # 查看状态
docker-compose config             # 校验+展开配置

小结

Compose 看着简单,但配置项很多。把上面这些用熟了,单机部署基本不用折腾。