容器的生命周期总结

容器的生命周期与状态详解

容器从创建到销毁的完整生命周期涉及多个状态,不同容器运行时(如 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)

  • 步骤:

    1. 查看日志:

      kubectl logs <pod-name> --previous
    2. 检查资源限制:

      kubectl describe pod <pod-name> | grep -A 5 "Limits"
    3. 验证环境变量和配置文件。

2. 容器处于 Dead 状态

  • 解决方案:

    docker rm -f <container-id>  # 强制删除

3. 容器卡在 Created 状态

  • 可能原因:

    • 镜像拉取失败。

    • 资源不足(如磁盘空间)。

  • 排查命令:

    docker logs <container-id>
    df -h  # 检查磁盘空间

五、总结

生命周期流程图

核心要点

  1. 核心状态:Created → Running → Exited → Deleted

  2. 异常状态:CrashLoopBackOff(K8s)、Dead(Docker)需重点关注。

  3. 调试工具:

    • Docker:docker logsdocker inspect

    • Kubernetes:kubectl describe podkubectl logs

掌握容器生命周期和状态转换,是高效管理云原生应用的基础!

posted @ 2025-06-27 11:47  郭慕荣  阅读(67)  评论(0)    收藏  举报