Docker Compose 多服务编排:从开发到部署的完整流程

Alex Chen | 2026-08-27T20:54:22 | DevOps

使用 Docker Compose 编排 Spring Boot + MySQL + Redis + Nginx 四个服务,涵盖网络隔离、数据卷持久化和环境变量管理。

# Docker Compose 多服务编排完整流程 ## 项目结构 ``` my-app/ docker-compose.yml docker-compose.prod.yml .env backend/ Dockerfile nginx/ nginx.conf ``` ## docker-compose.yml ```yaml version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_DATABASE: app_db volumes: - mysql_data:/var/lib/mysql - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - backend-net healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s retries: 5 redis: image: redis:7-alpine command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - redis_data:/data networks: - backend-net app: build: context: ./backend dockerfile: Dockerfile environment: DB_HOST: mysql DB_PASSWORD: ${DB_ROOT_PASSWORD} REDIS_HOST: redis REDIS_PASSWORD: ${REDIS_PASSWORD} depends_on: mysql: condition: service_healthy redis: condition: service_started networks: - backend-net restart: unless-stopped nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - app networks: - backend-net volumes: mysql_data: redis_data: networks: backend-net: driver: bridge ``` ## 环境变量管理 ```bash # .env 文件(不要提交到 Git) DB_ROOT_PASSWORD=your_secure_password REDIS_PASSWORD=your_redis_password ``` ## 常用命令 ```bash # 启动所有服务(后台运行) docker compose up -d # 查看日志 docker compose logs -f app # 仅重建应用服务 docker compose up -d --build app # 进入容器调试 docker compose exec mysql mysql -u root -p # 清理所有容器和数据卷 docker compose down -v ``` ## 生产环境覆盖文件 ```yaml # docker-compose.prod.yml services: app: deploy: replicas: 3 resources: limits: cpus: '1.0' memory: 512M logging: driver: json-file options: max-size: "10m" max-file: "3" ``` 启动命令:`docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d` ## 注意事项 1. `depends_on` 只保证启动顺序,不保证服务就绪,要配合 `healthcheck` 2. 数据卷在 `docker compose down` 时不会删除,需要 `-v` 显式清理 3. 服务间通过服务名(如 `mysql`)访问,Docker 内置 DNS 解析

← Back to Blog