5个生产级docker-compose实战案例,彻底告别“单机部署”焦虑

目录导读
- 为什么你需要docker-compose? —— 从手动
docker run到声明式编排的思维跃迁 - LNMP(Linux+Nginx+MySQL+PHP)全栈环境一键搭建
- 微服务链路监控(Prometheus + Grafana + cAdvisor)
- 高可用Redis集群(Sentinel模式)与数据持久化
- CI/CD流水线(Jenkins + SonarQube + Registry)本地化模拟
- 多环境隔离(开发/测试/生产)Compose文件拆分策略
- 高频问答精粹(Q1-Q4)
- 总结与SEO长尾词解析
为什么你需要docker-compose?
在生产环境,你几乎不可能只运行一个容器,数据库、缓存、消息队列、反向代理、应用服务……它们之间存在网络依赖、启动顺序、共享卷、环境变量传递等复杂关系。docker-compose(现已集成进Docker CLI,命令为docker compose)允许你用一份YAML文件定义整个应用栈,实现up一键拉起、down一键销毁。
核心优势:
- 可重复性:代码即配置,不再依赖“某台机器上曾经敲过的命令”。
- 网络自治:自动创建独立bridge网络,服务名即DNS域名。
- 原子管理:依赖
depends_on控制启动顺序,配合healthcheck实现真正的“就绪后启动”。
案例一:LNMP全栈环境一键搭建
应用场景:本地开发或小团队内部测试服务器,需要快速还原WordPress或ThinkPHP环境。
docker-compose.yml核心片段:
version: '3.8'
services:
nginx:
image: nginx:1.24-alpine
ports:
- "8080:80"
volumes:
- ./www:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
php-fpm:
condition: service_healthy
php-fpm:
image: php:8.2-fpm
volumes:
- ./www:/var/www/html
healthcheck:
test: ["CMD", "php-fpm", "-t"]
interval: 10s
timeout: 5s
retries: 3
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: appdb
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
细节亮点:condition: service_healthy确保PHP先通过配置检查,Nginx再启动,避免502。
案例二:微服务链路监控(Prometheus + Grafana + cAdvisor)
应用场景:容器化微服务的CPU、内存、磁盘IO实时监控。
关键配置:
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
privileged: true
expose: ["8080"]
prometheus:
image: prom/prometheus:v2.47.0
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prom_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
depends_on:
- cadvisor
grafana:
image: grafana/grafana:10.1.0
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
注意:cadvisor必须挂载宿主机根目录及docker socket,这是Linux下获取容器指标的硬性要求。
案例三:高可用Redis集群(Sentinel模式)与数据持久化
应用场景:防止缓存节点单点故障,自动主从切换。
构建思路:1个主节点 + 2个从节点 + 3个sentinel。
核心Compose配置(节选):
services:
redis-master:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redis_master_data:/data
redis-slave-1:
image: redis:7-alpine
command: ["redis-server", "--slaveof", "redis-master", "6379"]
depends_on:
- redis-master
sentinel-1:
image: redis:7-alpine
command: >
sh -c "echo 'sentinel monitor mymaster redis-master 6379 2' > /etc/redis/sentinel.conf
&& redis-sentinel /etc/redis/sentinel.conf"
depends_on:
- redis-master
注意:生产环境需将sentinel的quorum设为2,故障转移由sentinel选举完成,应用侧使用Sentinel客户端获取最新master地址。
案例四:CI/CD流水线本地化模拟(Jenkins + SonarQube + Registry)
应用场景:在开发机模拟Docker里跑Docker(DinD)的构建、静态扫描、镜像推送。
关键服务:
services:
jenkins:
image: jenkins/jenkins:lts-jdk17
volumes:
- jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock # 让Jenkins调用宿主Docker
ports:
- "8080:8080"
sonarqube:
image: sonarqube:10.1-community
environment:
- SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar
depends_on:
- db
registry:
image: registry:2
ports:
- "5000:5000"
避坑指南:Jenkins容器内要装docker-cli和docker-compose插件,且需将宿主socket映射进去,但生产环境建议使用docker:latest作为agent镜像(DinD)。
案例五:多环境隔离(开发/测试/生产)Compose文件拆分策略
不推荐用三个完全不同的YAML,推荐用基准文件 + 覆盖文件:
docker-compose.yml:基础服务,含镜像版本、端口、卷。docker-compose.dev.yml:开启调试模式,挂载源码热更新,使用本地MySQL。docker-compose.prod.yml:关闭端口映射(走内部负载均衡),使用外部持久卷,启用restart: always。
执行方式:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
高频问答精粹
Q1:depends_on能保证服务完全就绪吗?
A:不能,它只保证启动顺序(先启动依赖服务容器),但MySQL可能还在初始化,必须配合healthcheck,或者使用depends_on: condition: service_healthy(Compose v2.20+)。
Q2:如何在多个项目间复用公共网络?
A:在docker-compose.yml中定义networks: default: { external: true, name: shared_net },让不同项目接入同一bridge网络,实现服务名互访。
Q3:Compose文件中的version字段还有必要吗?
A:自Compose v2.20.0+,version已废弃并忽略,建议删除,不要使用version: '3.8'之类,避免新手困惑。
Q4:数据卷挂载目录权限导致访问拒绝(Permission denied)怎么办?
A:通常在容器内部以root运行服务,但挂载了宿主文件,解决方案:在Compose中指定user: "1000:1000"(宿主机用户ID),或先chown目录为容器内用户ID。
总结与SEO长尾词解析
通过以上5个案例,你已掌握Compose的高级用法:健康检查、环境覆盖、卷持久化、跨项目网络、DinD调度。动手写一遍胜过看十篇,请务必打开终端,将案例一跑通,再逐层叠加复杂度。
本文核心收录的长尾搜索词:
- docker-compose 生产环境 高可用
- docker compose depends_on healthcheck 用法
- docker-compose prometheus grafana 监控
- docker compose redis集群 sentinel 配置
- docker-compose 多环境 配置文件拆分
建议:将本文收藏为手册,遇到部署瓶颈时快速查询,后续如需了解Docker Swarm或K8s对Compose文件的兼容性,可参考官方kompose工具转换指南。