容器状态有哪些
面试题
Docker 容器有哪些生命周期状态?各状态之间如何转换?
标准答案
Docker 容器的状态机相对简洁,理解容器的状态转换是诊断容器异常的基础。
核心状态一览
| 状态 | 含义 | 检查命令 |
|---|---|---|
created |
已创建,未启动 | docker ps -a |
running |
正在运行 | docker ps |
paused |
已暂停 | docker ps |
restarting |
重启中 | docker ps |
exited |
已退出 | docker ps -a |
dead |
异常状态,无法操作 | docker ps -a |
状态转换图
docker create
│
▼
┌──────────┐
│ created │
└─────┬─────┘
│ docker start
▼
┌──────────┐ docker pause ┌──────────┐
│ running │──────────────────▶ │ paused │
└─────┬─────┘ └─────┬─────┘
│ │
│ docker stop / kill │ docker unpause
│ 或进程退出 │
▼ │
┌──────────┐ │
│ exited │◀───────────────────────────┘
└─────┬─────┘
│ docker restart
│ (start → stop → start)
▼
┌──────────────┐
│ restarting │ → running
└──────────────┘
dead ← docker kill 无法停止时
各状态详解
created(已创建)
# 创建容器但不启动
docker create --name myapp nginx:alpine
docker ps -a --filter status=created
docker start myapp # 进入 running 状态
特点: 容器的文件系统、网络等资源已就绪,但进程未启动。此时可以修改容器配置(如 --restart),但无法 exec 进入。
running(运行中)
# 容器主进程正在运行
docker run -d --name web nginx:alpine
docker ps # 只显示 running 的容器
docker inspect --format='{{.State.Status}}' web # "running"
paused(已暂停)
# 使用 SIGSTOP 暂停容器进程
docker pause web
# 查看暂停中的容器
docker ps --filter status=paused
# 恢复运行
docker unpause web
特点:
– 使用 cgroups freezer 子系统实现
– 暂停后容器进程保留在内存中,但不被 CPU 调度
– 类似于虚拟机”挂起”但更轻量
– 适合数据库备份等需要瞬间冻住写操作的场景
与 stopped 的区别:
– paused:进程仍在内存中,快速恢复
– stopped:进程已销毁,恢复需要重新创建进程
restarting(重启中)
# 执行 docker restart 或重启策略触发
docker restart web
# 短暂显示 restarting,然后变为 running
docker ps --filter status=restarting
特点: 这是一个过渡状态,通常持续几秒钟。Docker 会停止容器主进程(发送 SIGTERM,超时后 SIGKILL),然后重新启动。
exited(已退出)
# 容器主进程已终止
# 原因可能是:
# 1. 正常退出(exit 0)
# 2. 异常退出(exit 非 0)
# 3. 被 docker stop/kill 停止
# 4. 被 OOM Killer 杀死
# 查看退出码
docker inspect --format='{{.State.ExitCode}}' myapp
退出码含义:
| 退出码 | 含义 |
|---|---|
| 0 | 正常退出 |
| 1 | 应用错误 |
| 125 | Docker 启动错误 |
| 126 | 命令不可执行 |
| 127 | 命令未找到 |
| 137 | SIGKILL(128+9) |
| 139 | SIGSEGV(段错误,128+11) |
| 143 | SIGTERM(128+15) |
| 255 | 退出码超出范围 |
dead(不可操作的异常状态)
# 极少出现,通常是存储驱动问题或系统级错误
# 处于 dead 状态的容器无法被任何操作恢复
# 只能 docker rm 删除
docker rm -f dead-container # 强制删除
状态检查与过滤
# 查看所有容器(包括已退出)
docker ps -a
# 按状态过滤
docker ps --filter status=running
docker ps --filter status=exited
docker ps --filter status=paused
# 批量操作特定状态的容器
docker start $(docker ps -aq --filter status=created)
docker rm $(docker ps -aq --filter status=exited)
状态相关常见问题
Q:容器状态显示 Up 但应用不可用?
状态 Up / running 只代表容器主进程在运行,不代表应用健康。需要通过健康检查判断:
docker inspect --format='{{.State.Health.Status}}' myapp
# 可能显示:starting / healthy / unhealthy
Q:容器在 running 和 restarting 之间反复跳?
# 通常是应用频繁崩溃,触发重启策略
# 查看重启次数
docker inspect --format='{{.RestartCount}}' myapp
# 检查原因
docker logs --tail 50 myapp
Q:docker pause 的实际用途?
# 场景1:数据库在运行中,需要做文件系统快照
docker pause mysql
# 做快照...
docker unpause mysql
# 场景2:临时冻结某个容器排查问题
docker pause problem-container
# 排查...
docker unpause problem-container
Q:如何区分正常退出和异常退出?
# 查看退出码和时间
docker inspect --format='{{json .State}}' myapp
# "ExitCode": 0 + "Error": "" = 正常退出
# "ExitCode": 137 + "Error": "" = 被 OOM Kill
总结
六个核心状态:created、running、paused、restarting、exited、dead。重点掌握状态之间的转换关系和 docker pause 的特殊用途。面试中常问的”退出码 137″其实就是被 OOM 杀掉,”退出码 143″是被 SIGTERM 终止。理解状态机 = 理解容器生命周期。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容