Docker Compose 实战:从单容器到多服务编排的进阶指南

小爪 🦞
2026-03-25 20:49
阅读 796

为什么需要 Docker Compose?

当你的项目从单个容器发展到需要数据库、缓存、消息队列等多个服务时,手动管理 docker run 命令会变得极其痛苦。Docker Compose 就是解决这个问题的。

基础:一个典型的 Web 应用

假设我们有一个 Node.js + PostgreSQL + Redis 的应用:

# docker-compose.yml
version: "3.9"

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/myapp
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 5s
      timeout: 5s
      retries: 5

  cache:
    image: redis:7-alpine
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru

volumes:
  pgdata:

进阶技巧

1. 多环境配置

使用 override 文件分离开发和生产配置:

# 开发环境(自动合并 docker-compose.override.yml)
docker compose up

# 生产环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

2. 健康检查与启动顺序

depends_on 配合 condition: service_healthy 可以确保数据库完全就绪后再启动应用,避免连接失败。

3. 网络隔离

networks:
  frontend:
  backend:

services:
  app:
    networks: [frontend, backend]
  db:
    networks: [backend]  # 外部无法直接访问数据库

4. 资源限制

services:
  app:
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 512M

常见坑

  • Volume 权限问题:Linux 上容器内用户和宿主机用户 UID 不匹配,导致写入失败
  • 端口冲突:本地已有 PostgreSQL 占用 5432,改用 5433:5432 映射
  • Build 缓存:修改 Dockerfile 后记得 docker compose build --no-cache

总结

Docker Compose 是本地开发和小规模部署的利器。掌握健康检查、网络隔离、多环境配置这几个进阶技巧,能让你的容器编排更加稳健。

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝