企业级 Docker Compose 高频命令与单机编排实战场景指南
在企业单机运维、持续集成(CI/CD)测试流水线以及中小型项目部署中,Docker Compose 是实现单机多容器精细化编排的标准工具。通过将复杂的网络、存储、环境变量和容器依赖关系写入一个声明式的 docker-compose.yml 配置文件,运维人员能够用极低的成本实现整套业务系统的“一键式”生命周期管理。
本篇 Wiki 博客将为你汇总 Docker Compose 日常运维最高频的命令行工具,并结合三大典型的企业应用场景给出可直接落地、带深度注释的编排配置文件。
一、 Docker Compose 高频运维命令速查表(CLI 篇)
注意:以下命令均采用现代 Compose V2 的标准语法
docker compose(中间为空格)。若你的环境使用的是旧版 V1,可替换为docker-compose(中间带横杠)。
1. 核心生命周期管理
| 命令语法 | 适用场景及底层行为 | 运维最佳实践建议 |
|---|---|---|
docker compose up -d |
解析 YAML 并在后台启动所有定义的服务、网络和卷。 | 生产/测试环境最常用的标准启动命令。 |
docker compose up -d --build |
在后台启动服务前,强制重新构建含有 build 声明的自定义镜像。 |
适用于代码变更后,需要重新打包部署的开发测试阶段。 |
docker compose down |
优雅停止运行中的容器,并物理删除容器和相关的虚拟网络。 | 安全释放单机内存与网卡资源,默认不删除命名卷数据。 |
docker compose down -v |
停止容器,删除网络,并物理清空关联的数据卷(Volumes)。 | 高危命令!常用于 CI 自动化测试流水线结束时的资源彻底大扫除。 |
docker compose stop |
优雅停止服务容器,但不进行物理删除。 | 适用于临时停机维护。 |
docker compose start |
重新启动已被停止的服务容器。 | 与 stop 配合使用,不重建容器层,保持容器状态。 |
2. 状态查看与故障排查
| 命令语法 | 适用场景及底层行为 | 运维最佳实践建议 |
|---|---|---|
docker compose ps |
列出当前项目组下所有容器的运行状态、端口映射和容器 ID。 | 快速审计当前服务栈的健康状态。 |
docker compose logs -f --tail=100 [service] |
实时跟踪(-f)指定服务最后 100 行的标准输出日志。 |
故障排查、监控业务报错的第一入口。 |
docker compose exec [service] /bin/sh |
进入指定服务的容器内部,与其标准输入输出进行交互。 | 临时进行容器内网络连通性调试或配置文件检查。 |
docker compose config |
校验本地 docker-compose.yml 的 YAML 语法合规性。 |
写入配置后、启动服务前的必经步骤,能提前发现缩进和拼写错误。 |
docker compose top |
展示当前项目组所有容器内运行的宿主机进程列表(PID)。 | 用于排查容器进程是否在宿主机上引发了死锁或高 CPU 消耗。 |
二、 三大企业级编排实战场景与 YAML 模板
以下针对标准微服务、运维监控栈、自动化集成测试三个典型场景,给出开箱即用的配置,并对关键参数进行了深度剖析。
场景 A:标准微服务业务栈(Nginx + Spring Boot + Redis + MySQL)
- 场景痛点:传统的微服务部署依赖关系混乱,API 常常因为数据库未初始化完成而连接超时崩溃。
- 编排策略:利用
healthcheck结合depends_on.condition控制拓扑启动顺序,并对各容器进行严格的内存配额限制,保障单机稳定性。
docker-compose.yml 模板:
version: '3.8'
networks:
microservice-net:
driver: bridge
ipam:
config:
- subnet: 172.29.0.0/16
volumes:
mysql-data:
driver: local
services:
# 1. 数据库持久化层
mysql-db:
image: mysql:8.0
container_name: microservice-mysql
networks:
- microservice-net
volumes:
- mysql-data:/var/lib/mysql:rw
environment:
MYSQL_ROOT_PASSWORD: My_Secret_DB_Password_2024
MYSQL_DATABASE: app_db
deploy:
resources:
limits:
cpus: '2.0' # 限制该容器最大使用 2 个 CPU 核心
memory: 2G # 限制该容器最大使用 2G 内存
healthcheck: # 关键:定义数据库的内部健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 8s # 每 8 秒检查一次
timeout: 5s # 单次检查超时 5 秒
retries: 3 # 连续失败 3 次判定为不健康
restart: unless-stopped
# 2. 缓存层
redis-cache:
image: redis:7.0-alpine
container_name: microservice-redis
networks:
- microservice-net
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
restart: unless-stopped
# 3. Java 业务服务层
api-service:
image: reg.enterprise.com/web/api-server:v1.2.0
container_name: microservice-api
networks:
- microservice-net
environment:
- SPRING_PROFILES_ACTIVE=prod
- DB_HOST=mysql-db
- REDIS_HOST=redis-cache
deploy:
resources:
limits:
cpus: '1.5'
memory: 1G
depends_on:
mysql-db:
condition: service_healthy # 仅在 mysql 判定为 healthy 后,才启动本服务
restart: unless-stopped
# 4. 前端反向代理网关
web-gateway:
image: nginx:1.25-alpine
container_name: microservice-nginx
ports:
- "80:80"
networks:
- microservice-net
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro # 只读挂载配置文件
depends_on:
- api-service
restart: unless-stopped
场景 B:Prometheus + Grafana 运维监控栈
- 场景痛点:运维监控系统需要读取宿主机的系统指标(CPU/磁盘),而容器网络默认是隔离的,导致监控端无法获取物理机真实指标。
- 编排策略:使用
network_mode: host将采集器直接暴露在宿主机网络中,同时以 只读(:ro) 方式安全挂载宿主机的/proc和/sys目录。
docker-compose.yml 模板:
version: '3.8'
networks:
monitor-net:
driver: bridge
volumes:
grafana-data:
driver: local
services:
# 1. Prometheus 监控核心(时序数据库)
prometheus:
image: prom/prometheus:v2.45.0
container_name: monitor-prometheus
ports:
- "9090:9090"
networks:
- monitor-net
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro # 只读挂载普罗米修斯抓取规则
restart: unless-stopped
# 2. 宿主机物理指标采集器
node-exporter:
image: prom/node-exporter:v1.6.0
container_name: monitor-node-exporter
network_mode: host # 直接使用宿主机网络,无需映射端口即可获取全局网络栈信息
pid: host # 共享宿主机 PID 命名空间,便于监控进程
volumes:
- /:/host:ro,rslave # 安全挂载整个宿主机根目录以读取系统指标
command:
- '--path.rootfs=/host'
restart: unless-stopped
# 3. Grafana 数据可视化面板
grafana:
image: grafana/grafana:10.0.0
container_name: monitor-grafana
ports:
- "3000:3000"
networks:
- monitor-net
volumes:
- grafana-data:/var/lib/grafana:rw # 持久化保存看板配置和仪表盘
environment:
- GF_SECURITY_ADMIN_PASSWORD=Admin_Secure_Pass_2024 # 更改默认初始密码
depends_on:
- prometheus
restart: unless-stopped
场景 C:CI/CD 自动化集成测试环境(临时拉起与清理)
- 场景痛点:在 Jenkins Pipeline 中执行端到端(E2E)测试时,测试环境必须保持纯净,且测试完成后不能留存任何垃圾数据占用宿主机磁盘。
- 编排策略:通过
-v命令在完成后物理删除卷,利用特定的网络配置限制测试流量,并通过临时环境变量实现灵活注入。
docker-compose.yml 模板:
version: '3.8'
# 定义临时测试网络
networks:
ci-test-net:
driver: bridge
services:
# 被测试的 API Web 应用
test-target-app:
image: reg.enterprise.com/qa/api-server:${GIT_COMMIT_ID} # 动态读取流水线注入的环境变量
container_name: ci-test-app-${BUILD_NUMBER} # 防止并发构建时容器重名冲突
networks:
- ci-test-net
environment:
- SPRING_PROFILES_ACTIVE=test
- MOCK_SERVER_URL=http://mock-service:8081
# Mock 服务(模拟第三方外部支付等外部接口)
mock-service:
image: reg.enterprise.com/qa/mock-server:latest
container_name: ci-mock-service-${BUILD_NUMBER}
networks:
- ci-test-net
🛠️ 在 Jenkins Pipeline 中的闭环执行命令:
# 1. 语法检查
docker compose config
# 2. 启动测试套件环境(注入环境变量)
export GIT_COMMIT_ID=${GIT_COMMIT}
export BUILD_NUMBER=${BUILD_NUMBER}
docker compose up -d
# 3. [此处执行你的集成测试自动化脚本,例如 run-pytest.sh]
# 4. 测试完毕,物理清空容器、网络以及测试期间产生的所有临时数据卷(-v)
docker compose down -v
三、 企业级单机容器编排规范总结
在使用 Docker Compose 进行单机容器编排时,为了保证系统的安全与稳定,建议遵循以下标准规范:
- 资源限额红线:生产环境中的每一个服务,务必显式声明
limits.memory和limits.cpus,防止因单个容器内存泄漏导致宿主机内核强杀(OOM)其他核心服务。 - 避免端口硬冲突:如果单机部署多套微服务(如
test1和test2),可以在运行docker compose up时,通过-p指定不同的项目名称,并结合环境变量动态改变ports映射的宿主机端口。 - 时区统一配置:企业业务系统通常要求时区一致,建议在全局配置中为需要对齐时间的服务挂载本地时区:
volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro
浙公网安备 33010602011771号