4. Docker容器生命周期:创建、启动、停止、重启、删除、进入与日志查看

Docker容器的生命周期管理是容器化运维的核心操作。理解容器从创建到销毁的完整流程,能够帮助开发者与运维人员精准控制任务实例的状态,避免资源泄漏与状态混乱。本章围绕容器的七个关键状态操作展开,涵盖命令用法、底层原理与常见陷阱。

4.1 容器生命周期全景

一个Docker容器通常经历以下状态流转:Created → Running → Paused/Unpaused → Stopped → Removed。其中,docker run 是 docker create + docker start 的快捷组合,而 docker restart 则等价于先停止再启动。

Docker容器生命周期状态流转图 docker create docker start Running Stopped Removed 生命周期关键路径 docker run = docker create + docker start;docker restart = docker stop + docker start

4.2 核心操作命令详解

下表汇总了容器生命周期中每个阶段对应的命令、常用参数及典型使用场景。建议在DAG任务调度环境中,将容器视为一次性执行单元,避免长期运行容器带来的资源碎片。

操作 命令示例 关键参数 典型场景
创建 docker create --name task1 nginx --name、--network、-v 预分配容器资源,延迟启动
启动 docker start task1 -i(交互模式) 启动已创建的容器
停止 docker stop -t 10 task1 -t(宽限秒数) 优雅关闭,发送SIGTERM
重启 docker restart task1 -t(停止宽限) 配置更新后重置状态
删除 docker rm -f task1 -f(强制)、-v(删卷) 任务完成后清理资源
进入 docker exec -it task1 bash -it(交互终端) 调试运行中的容器
日志 docker logs --tail 100 -f task1 --tail、-f(跟踪) 查看任务输出与错误
最佳实践:在DAG调度中,建议使用 docker run --rm 自动删除容器,避免大量已停止容器堆积。对于需要保留日志的任务,使用 docker logs 结合日志驱动(如 --log-driver json-file)将输出持久化到宿主机。

4.3 进入容器与调试

docker exec 是进入运行中容器最常用的方法。它不会启动新容器,而是在目标容器的命名空间中执行指定进程。对于DAG任务,通常用于以下场景:

  • 检查环境变量:docker exec task1 env
  • 查看进程状态:docker exec task1 ps aux
  • 临时修改配置:docker exec -it task1 vi /etc/app.conf
  • 手动触发任务:docker exec task1 python run.py --debug
注意:使用 docker exec -it 时,容器内必须包含 /bin/bash 或 /bin/sh。对于基于 scratch 或 alpine 的最小化镜像,建议使用 docker exec -it task1 sh。如果容器内没有shell,可使用 docker cp 复制文件进出容器。

4.4 日志查看与性能关联

日志是排查容器异常的核心手段。Docker默认使用 json-file 日志驱动,将 stdout/stderr 写入宿主机文件。在DAG任务调度中,日志查看需要关注以下维度:

日志命令 用途 性能影响
docker logs --tail 50 task1 查看最近50行日志 低,仅读取文件尾部
docker logs -f task1 实时跟踪日志输出 中,持续读取文件变化
docker logs --since 2025-01-01T00:00:00 task1 按时间戳过滤日志 中高,需扫描文件
docker logs --details task1 显示额外标签信息 低,仅附加元数据
日志查看与容器状态关联图 容器实例 (task1) 日志驱动 json-file 宿主机文件 /var/lib/docker/... docker logs --tail 100 -f 日志数据流:容器 stdout/stderr → json-file驱动 → 宿主机文件系统 → docker logs读取

4.5 生命周期管理避坑指南

在DAG任务调度场景中,容器生命周期管理容易遇到以下问题,需要提前规避:

  • 僵尸容器堆积:未使用 --rm 且未及时 docker rm,导致磁盘占用持续增长。建议在DAG调度器侧增加定期清理策略。
  • 停止超时:docker stop 默认等待10秒发送SIGKILL。对于需要长时间清理的任务,应通过 -t 参数增加宽限时间,或自定义 STOPSIGNAL。
  • 日志文件膨胀:默认json-file驱动无日志轮转,长时间运行容器可能导致日志文件占满磁盘。建议配置 --log-opt max-size=10m --log-opt max-file=3。
  • exec进入失败:容器内缺少shell或进程已崩溃时,docker exec 会返回错误。此时应使用 docker inspect 检查容器状态,或通过 docker cp 提取文件。
性能调优提示:在DAG任务调度中,建议将容器生命周期与任务状态机对齐:任务创建时 docker create,任务调度时 docker start,任务完成时 docker stop && docker rm。避免在任务运行期间频繁执行 docker restart,这会重置容器内所有运行时状态,增加调度延迟。