在 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