跳转至

Docker Compose

Compose 用 compose.yaml 定义和运行一组服务、网络和数据卷。

services:
  web:
    image: nginx:alpine
    ports:
      - "127.0.0.1:8080:80"
    depends_on:
      api:
        condition: service_healthy

  api:
    image: example/api:1.0.0
    environment:
      APP_ENV: production
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://localhost:8000/health"]
      interval: 30s
      timeout: 5s
      retries: 3
docker compose config
docker compose up -d
docker compose ps
docker compose logs -f
docker compose down

docker compose down --volumes 会删除 Compose 创建的数据卷,执行前确认数据是否需要保留。Compose 默认会为同一项目创建网络,服务可用服务名互相访问。Docker Compose 官方说明

一份完整的单机部署骨架

name: order

services:
  api:
    image: registry.example.com/order-api:1.4.0
    restart: unless-stopped
    env_file:
      - .env
    environment:
      DB_HOST: db
    depends_on:
      db:
        condition: service_healthy
    networks: [frontend, backend]
    volumes:
      - ./config/application.yaml:/app/config/application.yaml:ro
    ports:
      - "127.0.0.1:8080:8080"
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8080/health"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 1G

  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_DB: order
      POSTGRES_USER: order
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets: [db_password]
    volumes:
      - db-data:/var/lib/postgresql/data
    networks: [backend]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U order"]
      interval: 10s
      timeout: 3s
      retries: 10

networks:
  frontend:
  backend:
    internal: true

volumes:
  db-data:

secrets:
  db_password:
    file: ./secrets/db_password.txt

数据库没有发布主机端口,只在 backend 网络访问。示例文件型 Secret 仍需设置主机权限并避免进入 Git;更高安全需求应使用外部密钥系统。

配置合并与环境变量

docker compose --env-file .env.production config
docker compose -f compose.yaml -f compose.production.yaml config

先用 config 查看插值和多文件合并后的最终模型,避免变量为空、端口和 Volume 被意外覆盖。.env 参与 Compose 插值,不等同于自动注入所有容器环境变量。

生命周期命令

docker compose pull
docker compose up -d --remove-orphans
docker compose ps
docker compose logs --tail 200 -f api
docker compose exec api sh
docker compose restart api
docker compose stop
docker compose down

restart 不会采用变更后的 image、environment、port 或 volume 配置;使用 up -d 重建。down 删除容器和默认网络,默认保留 Named Volume;带 -v 才会删除 Compose Volume。

depends_on 的边界

depends_on 控制启动顺序;配合 service_healthy 能等待健康状态,但不能保证依赖永远可用。应用仍需实现连接超时、有限重试和运行期重连。数据库启动完成也不表示迁移任务已经执行。

更新与回滚

备份数据 → pull 新镜像 → config 检查 → up -d
→ 健康检查 → 日志/指标/业务验证 → 保留旧版本回滚入口

Compose 没有 Kubernetes 式滚动发布控制器。单实例重建通常有中断,需要反向代理 + 双实例/蓝绿、维护窗口或迁移到编排平台。数据库变更必须向后兼容,回滚镜像不会回滚数据。

生产检查

  • 镜像固定版本或 Digest,不在服务器现场 build。
  • 只有入口端口对外发布,数据库和管理端口保持内部。
  • 配置只读、数据持久化、日志轮转、资源限制和 Healthcheck 完整。
  • 明确项目名,避免不同目录生成不同资源名。
  • Compose 文件、环境模板和操作步骤进入 Git,真实 Secret 排除。
  • 配置宿主机开机启动策略、备份、监控和升级窗口。

官方参考:Compose file referenceCompose production