容器的生命周期总结
容器的生命周期与状态详解
容器从创建到销毁的完整生命周期涉及多个状态,不同容器运行时(如 Docker、containerd、Kubernetes)的管理方式略有差异,但核心流程一致。以下是详细分解:
一、容器的完整生命周期
1. 生命周期阶段
(1) 创建(Created)
-
触发条件:通过
docker create或kubectl apply创建容器,但未启动。 -
特点:
-
文件系统已初始化(基于镜像层)。
-
网络和存储配置完成,但进程未运行。
-
-
示例:
docker create --name my-nginx nginx:latest
(2) 运行(Running)
-
触发条件:通过
docker start或直接docker run启动容器。 -
特点:
-
主进程(PID 1)正在运行。
-
可对外提供服务(如监听端口)。
-
-
示例:
docker start my-nginx
(3) 暂停(Paused)
-
触发条件:通过
docker pause冻结容器。 -
特点:
-
进程被挂起(CPU 停止,内存保留)。
-
通常用于调试或节省资源。
-
-
示例:
docker pause my-nginx
(4) 停止(Exited)
-
触发条件:
-
主进程正常退出(退出码
0)。 -
手动停止(
docker stop)。 -
进程崩溃(退出码非
0)。
-
-
特点:
-
容器文件系统保留,可重新启动。
-
资源(CPU/内存)被释放。
-
-
示例:
docker stop my-nginx
(5) 重启(Restarting)
-
触发条件:
-
手动重启(
docker restart)。 -
配置了自动重启策略(如 Docker 的
--restart=always)。
-
-
特点:
-
容器从
Exited状态重新进入Running。
-
(6) 销毁(Deleted)
-
触发条件:通过
docker rm删除容器。 -
特点:
-
容器文件系统和元数据被清除。
-
不可恢复(需重新创建)。
-
二、容器状态的详细分类
1. Docker 容器状态
| 状态 | 描述 | 触发命令 |
|---|---|---|
Created |
容器已创建但未启动。 | docker create |
Running |
容器正在运行(主进程活跃)。 | docker start/docker run |
Paused |
容器进程被冻结(CPU 暂停,内存保留)。 | docker pause |
Restarting |
容器正在重新启动(可能因崩溃或策略触发)。 | docker restart |
Exited |
容器已停止(正常退出或错误)。 | docker stop/自然退出 |
Dead |
容器因致命错误无法恢复(需手动清理)。 | docker rm -f |
查看 Docker 状态
docker ps -a --format "table {{.ID}}\t{{.Status}}"
输出示例:
CONTAINER ID STATUS a1b2c3d4 Up 2 hours (Running) e5f6g7h8 Exited (0) 5 minutes ago
2. Kubernetes 容器状态
| 状态 | 描述 |
|---|---|
Waiting |
容器等待启动(如拉取镜像、挂载卷)。 |
Running |
容器正在运行。 |
Terminated |
容器已退出(含退出码)。 |
CrashLoopBackOff |
容器反复崩溃重启(通常因配置错误)。 |
查看 Kubernetes Pod 状态
kubectl get pods -o wide
输出示例:
NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 10m error-pod 0/1 CrashLoopBackOff 3 2m
三、关键状态转换机制
1. 退出码(Exit Code)
-
0:正常退出(如主进程完成任务)。 -
非
0:异常退出(常见代码):-
1:应用错误(如配置文件缺失)。 -
137:被SIGKILL强制终止(通常因内存不足)。 -
143:被SIGTERM优雅终止(docker stop触发)。
-
2. 自动重启策略
-
Docker:
docker run --restart=always nginx # 总是重启 docker run --restart=on-failure:5 nginx # 失败时重启最多5次 -
Kubernetes:
spec: containers: - name: nginx restartPolicy: Always # OnFailure, Never
四、状态异常处理指南
1. 容器持续崩溃(CrashLoopBackOff)
-
步骤:
-
查看日志:
kubectl logs <pod-name> --previous -
检查资源限制:
kubectl describe pod <pod-name> | grep -A 5 "Limits" -
验证环境变量和配置文件。
-
2. 容器处于 Dead 状态
-
解决方案:
docker rm -f <container-id> # 强制删除
3. 容器卡在 Created 状态
-
可能原因:
-
镜像拉取失败。
-
资源不足(如磁盘空间)。
-
-
排查命令:
docker logs <container-id> df -h # 检查磁盘空间
五、总结
生命周期流程图
核心要点
-
核心状态:
Created→Running→Exited→Deleted。 -
异常状态:
CrashLoopBackOff(K8s)、Dead(Docker)需重点关注。 -
调试工具:
-
Docker:
docker logs、docker inspect。 -
Kubernetes:
kubectl describe pod、kubectl logs。
-
掌握容器生命周期和状态转换,是高效管理云原生应用的基础!


浙公网安备 33010602011771号