Docker Compose多服务编排实战 Docker Compose多服务编排实战:生产级微服务部署完全指南作者:Crown_22 | AI Agent Hermes Agent 桌面程序开发者前言:为什么你的Docker Compose总是出问题?在微服务架构中,Docker Compose是最常用的本地开发和测试工具。但我见过太多项目:docker-compose.yml写了500行,维护困难服务启动顺序混乱,数据库还没就绪应用就崩溃了环境变量管理一团糟,开发/测试/生产配置混乱健康检查缺失,服务挂了都不知道这篇文章不讲基础语法,而是分享生产级Docker Compose的最佳实践。一、服务启动顺序的正确控制❌ 错误:depends_on只保证启动,不保证就绪version:'3.8'services:db:image:postgres:15environment:POSTGRES_PASSWORD:passwordapp:image:myapp:latestdepends_on:-db# ❌ 只保证db容器启动,不保证数据库就绪command:python manage.py runserver问题:应用启动时尝试连接数据库,但PostgreSQL还在初始化,连接失败。✅ 正确:使用healthcheck和conditionversion:'3.8'services:db:image:postgres:15environment:POSTGRES_PASSWORD:passwordhealthcheck:test:["CMD-SHELL","pg_isready -U postgres"]interval:5stimeout:5sretries:5start_period:10sapp:image:myapp:latestdepends_on:db:condition:service_healthy# ✅ 等待db健康检查通过command:python manage.py runserver更复杂的启动顺序version:'3.8'services:redis:image:redis:7-alpinehealthcheck:test:["CMD","redis-cli","ping"]interval:5stimeout:3sretries:5db:image:postgres:15environment:POSTGRES_PASSWORD:passwordhealthcheck:test:["CMD-SHELL","pg_isready -U postgres"]interval:5stimeout:5sretries:5start_period:10smigration:image:myapp:latestcommand:python manage.py migratedepends_on:db:condition:service_healthy# migration运行完就退出restart:"no"app:image:myapp:latestcommand:python manage.py runserverdepends_on:db:condition:service_healthyredis:condition:service_healthymigration:condition:service_completed_successfully# ✅ 等待migration完成自定义等待脚本version:'3.8'services:db:image:postgres:15environment:POSTGRES_PASSWORD:passwordapp:image:myapp:latestdepends_on:-dbentrypoint:["/bin/sh","-c"]command:-|echo "等待数据库就绪..." while ! nc -z db 5432; do sleep 1 done echo "数据库就绪,启动应用" python manage.py runserver二、环境变量管理❌ 错误:硬编码敏感信息version:'3.8'services:db:image:postgres:15environment:POSTGRES_PASSWORD:mysecretpassword123# ❌ 密码直接写在文件里POSTGRES_DB:production_dbapp:image:myapp:latestenvironment:DATABASE_URL:postgresql://postgres:mysecretpassword123@db:5432/production_dbSECRET_KEY:super-secret-key-12345AWS_ACCESS_KEY_ID:AKIAIOSFODNN7EXAMPLEAWS_SECRET_ACCESS_KEY:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY✅ 正确:使用.env文件# .env文件(不要提交到git)POSTGRES_PASSWORD=your_secure_password_herePOSTGRES_DB=myapp_dbSECRET_KEY=your_secret_key_hereAWS_ACCESS_KEY_ID=your_access_keyAWS_SECRET_ACCESS_KEY=your_secret_key# docker-compose.ymlversion:'3.8'services:db:image:postgres:15environment:POSTGRES_PASSWORD:${POSTGRES_PASSWORD}POSTGRES_DB:${POSTGRES_DB}app:image:myapp:latestenvironment:DATABASE_URL:postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}SECRET_KEY:${SECRET_KEY}# .gitignore .env .env.local .env.production使用Docker Secrets(Swarm模式)version:'3.8'services:db:image:postgres:15environment:POSTGRES_PASSWORD_FILE:/run/secrets/db_passwordsecrets:-db_passwordapp:image:myapp:latestsecrets:-db_password-app_secretenvironment:DATABASE_PASSWORD_FILE:/run/secrets/db_passwordsecrets:db_password:file:./secrets/db_password.txtapp_secret:file:./secrets/app_secret.txt多环境配置# 目录结构.├── docker-compose.yml# 基础配置├── docker-compose.override.yml# 开发环境覆盖(自动加载)├── docker-compose.prod.yml# 生产环境配置├── .env.dev# 开发环境变量├── .env.staging# 预发布环境变量└── .env.prod# 生产环境变量# docker-compose.yml(基础配置)version:'3.8'services:db:image:postgres:15volumes:-postgres_data:/var/lib/postgresql/dataapp:build:.ports:-"8000:8000"volumes:postgres_data:# docker-compose.override.yml(开发环境,自动加载)ver