Docker Compose

Date
Created
Jul 24, 2025 09:36 AM
Descrption
不断优化
Tags
工具
DevOps

notion image
在 Docker Compose 中管理应用的启停有多种方式,熟练的掌握可以大大加速应用上线和调试:

1. 核心操作命令对比

场景
命令
效果
适用情况
暂停容器
docker compose pause
冻结容器内所有进程(CPU/IO停止,内存保留)
临时释放CPU资源
恢复暂停
docker compose unpause
恢复被暂停的容器
需要继续运行
优雅停止
docker compose stop
发送SIGTERM信号,等待容器优雅关闭(默认10秒超时)
正常关闭场景
强制立即停止
docker compose kill
发送SIGKILL信号立即终止
容器无响应时
停止并移除资源
docker compose down
停止容器+删除网络/卷(默认保留卷)
需要清理环境
停止保留网络/卷
docker compose down --volumes
停止并删除所有资源(包括匿名卷)
彻底清理测试环境

2. 详细使用示例

(1) 暂停与恢复(适合临时调试)

# 暂停所有服务 docker compose pause # 暂停指定服务 docker compose pause nginx redis # 恢复运行 docker compose unpause
效果
  • 使用docker ps会看到状态变为Paused
  • 容器文件系统保持原状,调试后可以精确恢复现场

(2) 优雅停止与强制停止

# 优雅停止(触发SIGTERM和stop_grace_period) docker compose stop --timeout 30 # 自定义超时30秒 # 强制停止(立即杀死进程) docker compose kill -s SIGKILL # 发送KILL信号
应用场景
  • stop:数据库等需要完成事务的应用
  • kill:前端无状态服务快速重启

(3) 完全移除资源

# 标准清理(保留命名卷) docker compose down # 彻底清理(包括匿名卷) docker compose down --volumes --remove-orphans # 带超时的清理(避免卡住) docker compose down --timeout 30
注意
  • -volumes 会删除docker compose.yml中未明确声明的匿名卷
  • 生产环境慎用-volumes,可能造成数据丢失

3. 特殊场景处理

(1) 仅停止部分服务

# 停止web服务但保留db docker compose stop web # 停止并移除指定服务 docker compose rm -fsv redis
参数说明
  • f 强制删除运行中的容器
  • s 停止容器(隐含)
  • v 删除关联的匿名卷

(2) 组合操作(重启服务)

# 完整重启流程 docker compose stop web docker compose rm -f web docker compose up -d --build web

(3) 使用超时控制

# 在compose.yml中定义优雅停止超时 services: mysql: stop_grace_period: 2m # 自定义2分钟超时

4. 状态查询与验证

# 查看所有容器状态 docker compose ps # 检查暂停的容器 docker compose ps | grep Paused # 查看资源占用(验证是否真正释放) docker stats $(docker compose ps -q)

5. 自动化脚本示例

#!/bin/bash # 安全停止脚本 echo "Stopping services gracefully..." docker compose stop --timeout 60 || { echo "Graceful stop failed, forcing..." docker compose kill } # 清理资源(保留数据卷) docker compose down --remove-orphans echo "Cleanup complete. Run 'docker compose up -d' to restart."

6. 常见问题解决

Q: 停止后端口仍被占用?

# 查找占用进程 sudo lsof -i :8080 # 强制释放端口 sudo kill -9 <PID>

Q: 数据卷未正确清理?

# 查看残留卷 docker volume ls -f dangling=true # 批量清理 docker volume prune

Q: 停止操作卡住?

# 增加详细日志 docker compose --verbose down # 跳过hooks直接停止 docker compose down --timeout 1