1. 为什么需要Docker Compose模板在容器化部署的实践中我发现大多数开发者都会遇到一个共同痛点每次启动新项目时都要从头开始编写docker-compose.yml文件。这不仅浪费时间还容易因为配置不规范导致各种运行时错误。经过三年多的容器化部署实践我整理出了这套覆盖90%场景的标准化模板。Docker Compose作为定义和运行多容器应用的工具其配置文件的质量直接决定了部署的稳定性和可维护性。一个典型的反例是某次我在紧急部署时手写了一个compose文件结果因为缩进错误导致服务无法启动排查了两小时才发现是YAML格式问题。这种低级错误完全可以通过标准化模板避免。2. 5套黄金模板详解2.1 基础Web服务模板NginxPHP/Pythonversion: 3.8 services: web: image: nginx:alpine ports: - 80:80 volumes: - ./html:/usr/share/nginx/html - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - app networks: - backend app: build: . environment: - DB_HOSTdb - DB_USERroot volumes: - ./app:/app networks: - backend healthcheck: test: [CMD, curl, -f, http://localhost:5000] interval: 30s timeout: 10s retries: 3 networks: backend: driver: bridge关键设计点使用alpine基础镜像减小体积通过volumes实现代码热更新healthcheck确保服务可用性独立网络隔离环境实测中常见问题Nginx配置需要预先挂载健康检查端点要与应用实际端口一致开发环境建议添加restart: unless-stopped2.2 数据库集群模板MySQL主从Redisversion: 3.8 services: mysql-master: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORDrootpass - MYSQL_REPLICATION_USERrepl - MYSQL_REPLICATION_PASSWORDreplpass ports: - 3306:3306 volumes: - mysql-master-data:/var/lib/mysql command: - --server-id1 - --log-binmysql-bin - --binlog-formatROW - --gtid-modeON - --enforce-gtid-consistencyON mysql-slave: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORDrootpass depends_on: - mysql-master volumes: - mysql-slave-data:/var/lib/mysql command: - --server-id2 - --log-binmysql-bin - --binlog-formatROW - --gtid-modeON - --enforce-gtid-consistencyON - --skip-slave-start - --relay-logmysql-relay-bin redis: image: redis:alpine ports: - 6379:6379 volumes: - redis-data:/data command: redis-server --appendonly yes volumes: mysql-master-data: mysql-slave-data: redis-data:避坑经验MySQL主从需要server-id唯一生产环境务必设置volume持久化Redis启用AOF持久化首次启动后需手动配置主从关系2.3 微服务模板Spring CloudGatewayversion: 3.8 services: config-server: image: springcloud/config-server ports: - 8888:8888 environment: - SPRING_PROFILES_ACTIVEnative volumes: - ./config:/config gateway: image: springcloud/gateway ports: - 8080:8080 depends_on: - config-server environment: - SPRING_CLOUD_CONFIG_URIhttp://config-server:8888 service-a: image: your-service-a depends_on: - config-server environment: - SPRING_CLOUD_CONFIG_URIhttp://config-server:8888 service-b: image: your-service-b depends_on: - config-server environment: - SPRING_CLOUD_CONFIG_URIhttp://config-server:8888 zipkin: image: openzipkin/zipkin ports: - 9411:9411关键配置统一配置中心先行启动服务间通过服务名通信链路追踪独立部署建议添加deploy.replicas实现高可用2.4 机器学习训练环境模板version: 3.8 services: jupyter: image: tensorflow/tensorflow:latest-gpu-jupyter ports: - 8888:8888 volumes: - ./notebooks:/tf/notebooks - ./data:/data deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] environment: - NVIDIA_VISIBLE_DEVICESall mlflow: image: mlflow/mlflow ports: - 5000:5000 volumes: - ./mlruns:/mlruns command: - mlflow - server - --host - 0.0.0.0 postgres: image: postgres:13 environment: - POSTGRES_PASSWORDmlflow - POSTGRES_USERmlflow - POSTGRES_DBmlflow volumes: - pg-data:/var/lib/postgresql/data volumes: pg-data:GPU使用要点需要NVIDIA Container Toolkit显存资源需要显式声明数据卷挂载路径避免权限问题MLflow需配置数据库后端2.5 监控告警全家桶模板version: 3.8 services: prometheus: image: prom/prometheus ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - --config.file/etc/prometheus/prometheus.yml grafana: image: grafana/grafana ports: - 3000:3000 volumes: - grafana-data:/var/lib/grafana depends_on: - prometheus alertmanager: image: prom/alertmanager ports: - 9093:9093 volumes: - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml node-exporter: image: prom/node-exporter ports: - 9100:9100 volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - --path.procfs/host/proc - --path.sysfs/host/sys - --collector.filesystem.ignored-mount-points^/(sys|proc|dev|host|etc)($$|/) volumes: grafana-data:监控系统注意事项Prometheus配置需预先准备Grafana数据源需手动配置生产环境建议添加认证告警规则需要定期维护3. 避坑指南那些年我踩过的坑3.1 环境变量管理的最佳实践新手常犯的错误是直接在compose文件硬编码敏感信息。正确的做法是services: db: image: mysql env_file: - .env.db environment: - TZ${TIMEZONE}配套的.env.db文件MYSQL_ROOT_PASSWORDcomplex_password MYSQL_DATABASEapp_db经验总结敏感信息必须通过env_file管理通用配置可使用环境变量传参不同环境使用不同env文件禁止将.env提交到版本控制3.2 健康检查的合理配置我曾遇到服务假死的情况——容器在运行但应用已崩溃。有效的健康检查应这样配置healthcheck: test: [CMD-SHELL, curl -f http://localhost:8080/actuator/health || exit 1] interval: 30s timeout: 5s retries: 3 start_period: 40s关键参数说明interval检查间隔不要小于30秒timeout根据接口响应时间调整start_period给应用留出启动时间retries避免偶发失败导致误判3.3 网络配置的进阶技巧当需要连接多个compose项目时可以创建外部网络docker network create shared-network然后在各compose文件中networks: default: external: name: shared-network常见问题解决方案服务发现用服务名而非IP跨项目通信需要相同网络避免使用默认的bridge网络生产环境建议配置网络别名4. 模板的定制与扩展4.1 多文件组合技巧大型项目建议拆分配置docker-compose.yml # 基础配置 docker-compose.override.yml # 开发环境扩展 docker-compose.prod.yml # 生产环境配置启动时指定文件docker-compose -f docker-compose.yml -f docker-compose.prod.yml up4.2 参数化模板设计通过环境变量实现配置动态化services: app: image: ${APP_IMAGE:-default-image} ports: - ${HOST_PORT}:${CONTAINER_PORT}配套的.env文件APP_IMAGEyour-registry/app:v1.2 HOST_PORT8080 CONTAINER_PORT804.3 版本控制策略推荐的文件结构project/ ├── docker/ │ ├── templates/ # 标准模板库 │ ├── environments/ # 各环境配置 │ └── scripts/ # 部署脚本 ├── .env.example # 环境变量示例 └── docker-compose.yml # 主入口文件版本管理要点模板与项目代码分离环境配置按分支管理重要变更记录CHANGELOG定期同步模板更新5. 实战案例电商系统部署5.1 架构设计典型电商栈组合前端Nginx Vue.js后端Spring Boot MySQL Redis辅助Elasticsearch RabbitMQ5.2 完整compose配置version: 3.8 services: nginx: image: nginx:alpine ports: - 80:80 - 443:443 volumes: - ./frontend/dist:/usr/share/nginx/html - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/certs:/etc/nginx/certs depends_on: - gateway gateway: build: ./gateway ports: - 8080:8080 environment: - SPRING_PROFILES_ACTIVEdocker depends_on: - product-service - order-service - user-service product-service: build: ./services/product environment: - DB_HOSTmysql - REDIS_HOSTredis depends_on: - mysql - redis mysql: image: mysql:8.0 environment: - MYSQL_ROOT_PASSWORDroot - MYSQL_DATABASEecommerce volumes: - mysql-data:/var/lib/mysql healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] timeout: 20s retries: 10 redis: image: redis:alpine ports: - 6379:6379 volumes: - redis-data:/data volumes: mysql-data: redis-data:5.3 部署流程准备环境变量cp .env.example .env # 编辑实际配置构建并启动docker-compose build docker-compose up -d验证服务docker-compose ps curl http://localhost/health生产环境扩展docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d