4. Docker容器生命周期:创建、启动、停止、重启、删除、进入与日志查看
Docker容器的生命周期管理是容器化运维的核心操作。理解容器从创建到销毁的完整流程,能够帮助开发者与运维人员精准控制任务实例的状态,避免资源泄漏与状态混乱。本章围绕容器的七个关键状态操作展开,涵盖命令用法、底层原理与常见陷阱。
4.1 容器生命周期全景
一个Docker容器通常经历以下状态流转:Created → Running → Paused/Unpaused → Stopped → Removed。其中,docker run 是 docker create + docker start 的快捷组合,而 docker restart 则等价于先停止再启动。
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 |
显示额外标签信息 | 低,仅附加元数据 |
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,这会重置容器内所有运行时状态,增加调度延迟。