Skip to main content

容器生命周期

容器从创建到删除会经历几种状态。文字版状态流转如下:
关键点:running 状态的容器不能直接删除,必须先停止,或者用 docker rm -f 强制删除。

docker run 常用参数

一个组合示例:
--rm 适合一次性任务和调试。生产环境的长期服务不要使用 --rm,否则容器退出后就找不回来了。

重启策略对比

设置示例:
表示非正常退出时最多重试 5 次。

进入运行中的容器

docker exec 在容器内执行命令。最常见的是打开一个交互式 Shell:
精简镜像(如 alpine)里没有 bash,改用 sh:
docker exec 启动的是容器内的附加进程。退出这个 Shell 不会影响容器主进程的运行。

查看与诊断

容器列表

-a 显示包括已停止在内的所有容器。

详细信息

docker inspect 输出容器的完整 JSON 配置。配合 jq 提取常用字段:

进程与资源

停止与删除

docker stopdocker kill 的区别:
  • docker stop 先发 SIGTERM,给应用优雅退出的机会。默认等待 10 秒后再发 SIGKILL 强杀。
  • docker kill 直接发送信号,默认是 SIGKILL,进程立即被杀掉。
批量清理所有已停止的容器:
docker container prune 会删除所有已停止的容器,且不可恢复。执行前确认没有还需要保留的现场。

容器内进程模型

容器主进程是 PID 1。PID 1 在 Linux 中有特殊语义:它默认不处理未注册的信号,也需要负责回收僵尸子进程。 直接用应用做 PID 1,可能出现收不到 SIGTERM、无法优雅退出的问题。 解决方案是在容器中使用轻量级 init 进程,例如 tinidumb-init:
--init 会让 Docker 自动注入 tini 作为 PID 1,应用成为其子进程,信号转发和僵尸进程回收都由 tini 处理。
配合 --init 使用 docker stop,绝大多数应用都能实现优雅退出,不需要修改代码。

延伸阅读