Docker Compose 多服务编排实践

为什么用 Docker Compose

手动启动多个容器不仅繁琐,而且容易出错。Docker Compose 用一个 YAML 文件定义所有服务及其依赖关系,一条命令就能完成全部部署。

docker compose up -d

实际案例:博客平台部署

以一个典型的博客平台为例,需要三个服务:Nginx 反向代理、WordPress 应用、MySQL 数据库。

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: blog-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - blog_net

  wordpress:
    image: wordpress:latest
    container_name: blog-wp
    restart: always
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - blog_net

  nginx:
    image: nginx:alpine
    container_name: blog-nginx
    restart: always
    depends_on:
      - wordpress
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/nginx/certs:ro
    networks:
      - blog_net

volumes:
  db_data:
  wp_data:

networks:
  blog_net:
    driver: bridge

环境变量管理

敏感信息不要硬编码在 compose 文件中。使用 .env 文件:

MYSQL_ROOT_PASSWORD=your_secure_root_password
MYSQL_PASSWORD=your_secure_password

常用命令

# 启动所有服务
docker compose up -d

# 查看日志
docker compose logs -f wordpress

# 重启某个服务
docker compose restart nginx

# 停止并删除所有容器
docker compose down

# 停止并删除容器+数据卷(危险操作!)
docker compose down -v

# 更新镜像并重新部署
docker compose pull && docker compose up -d

踩坑记录

1. 数据库连接失败

WordPress 连不上 MySQL。原因:depends_on 只保证启动顺序,不保证服务就绪。

解决:使用 healthcheck 确保数据库就绪后再启动应用。

  db:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 10

  wordpress:
    depends_on:
      db:
        condition: service_healthy

2. 数据卷权限问题

挂载本地目录后容器内无权写入。

解决:确保本地目录的 UID/GID 与容器内运行用户匹配。

3. 端口冲突

Error: port is already allocated

解决:用 docker psss -tlnp 查看端口占用情况。

总结

Docker Compose 是多服务部署的利器。核心要点:

  • 服务之间用自定义网络通信,不需要暴露端口
  • 敏感数据用环境变量管理
  • healthcheck 确保依赖服务就绪
  • 数据持久化用 volumes