Docker容器状态管理
外观
Docker容器状态管理是Docker容器操作中的核心概念,指通过命令或API对容器的生命周期状态(创建、运行、暂停、停止、删除等)进行控制和监控的过程。理解容器状态及其转换关系对于高效使用Docker至关重要。
容器状态概述[编辑 | 编辑源代码]
Docker容器在其生命周期中会经历以下主要状态:
- Created:通过
docker create
创建的容器,但尚未启动 - Running:正在运行的容器
- Paused:被暂停的容器(进程挂起)
- Stopped:已停止的容器(进程终止)
- Deleted:已被删除的容器
基本状态操作命令[编辑 | 编辑源代码]
查看容器状态[编辑 | 编辑源代码]
使用docker ps
命令查看运行中的容器,添加-a
参数查看所有状态的容器:
# 查看运行中的容器
docker ps
# 查看所有状态的容器
docker ps -a
示例输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx:latest "nginx -g..." 2 minutes ago Up 2 minutes 80/tcp webserver f6e5d4c3b2a1 ubuntu:20.04 "/bin/bash" 5 days ago Exited (0) 5 days ago test-container
启动与停止容器[编辑 | 编辑源代码]
# 启动已创建的容器
docker start [容器ID或名称]
# 停止运行中的容器
docker stop [容器ID或名称]
# 强制立即停止容器(发送SIGKILL)
docker kill [容器ID或名称]
暂停与恢复容器[编辑 | 编辑源代码]
暂停会冻结容器进程而不释放资源:
# 暂停运行中的容器
docker pause [容器ID或名称]
# 恢复被暂停的容器
docker unpause [容器ID或名称]
高级状态管理[编辑 | 编辑源代码]
状态转换的底层机制[编辑 | 编辑源代码]
Docker使用Linux内核特性实现状态管理:
- 停止:发送SIGTERM信号,等待优雅终止(默认10秒后发送SIGKILL)
- 暂停:使用cgroups freezer子系统挂起所有进程
- 恢复:通过解析失败 (语法错误): {\displaystyle \text{thaw\_processes()}} 系统调用恢复进程
状态超时控制[编辑 | 编辑源代码]
可以自定义停止超时时间(单位:秒):
docker stop --time=30 [容器ID]
自动重启策略[编辑 | 编辑源代码]
通过--restart
指定容器退出时的行为:
# 总是重启(包括手动停止)
docker run --restart=always nginx
# 仅在非0退出码时重启(最多3次)
docker run --restart=on-failure:3 nginx
状态监控与调试[编辑 | 编辑源代码]
查看容器详细状态[编辑 | 编辑源代码]
docker inspect [容器ID] --format='{{json .State}}'
示例输出:
{ "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 1234, "ExitCode": 0, "Error": "", "StartedAt": "2023-05-20T08:12:33.123456789Z", "FinishedAt": "0001-01-01T00:00:00Z" }
实时资源监控[编辑 | 编辑源代码]
使用docker stats
查看运行中容器的实时资源占用:
docker stats [容器ID]
实际应用案例[编辑 | 编辑源代码]
案例1:Web服务的滚动更新[编辑 | 编辑源代码]
1. 启动新版本容器(状态:Running) 2. 暂停旧版本容器(状态:Paused)作为快速回滚准备 3. 验证新版本服务正常后,停止旧容器(状态:Stopped) 4. 最终删除旧容器(状态:Deleted)
案例2:批处理任务管理[编辑 | 编辑源代码]
# 创建任务容器(状态:Created)
docker create --name batch-job python:3.9 python /app/process.py
# 启动任务(状态:Running)
docker start batch-job
# 任务完成后自动停止(状态:Stopped)
# 查看退出状态确认是否成功
docker inspect batch-job --format='{{.State.ExitCode}}'
常见问题解答[编辑 | 编辑源代码]
Q:暂停和停止有什么区别?
- 暂停(Paused)保持容器进程的内存状态,CPU暂停执行
- 停止(Stopped)终止所有进程并释放资源
Q:如何优雅地停止容器?
最佳实践是:
1. 发送SIGTERM:docker stop
2. 等待应用处理完当前请求(建议设置适当的超时)
3. 必要时才使用docker kill
Q:容器状态异常如何排查? 检查关键字段:
OOMKilled
:是否因内存不足被终止ExitCode
:非0表示异常退出Error
:详细的错误信息
最佳实践[编辑 | 编辑源代码]
- 生产环境建议总是指定
--restart
策略 - 关键容器停止前应保留至少
30秒
的优雅退出时间 - 使用
docker update
可以动态修改运行中容器的资源限制和重启策略 - 通过
docker events
可以监听所有状态变更事件