容器状态有哪些

容器状态有哪些

面试题

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
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容