Docker 容器生命周期有哪些状态和管理命令?
Docker 容器生命周期管理,核心就是管理一个容器从创建、运行、暂停、停止、重启到删除的全过程。常见状态包括 created、running、paused、exited、restarting 和 dead,对应的命令主要有 create、run、start、stop、kill、pause、unpause、restart、rm。
Docker 容器有哪些生命周期状态?
| 状态 | 含义 | 常见场景 |
|---|---|---|
created | 容器已创建,但还没有启动 | 执行 docker create 后 |
running | 容器正在运行 | 执行 docker start 或 docker run 后 |
paused | 容器进程被暂停 | 执行 docker pause 后 |
exited | 容器主进程已退出 | 程序运行结束、报错退出或被停止 |
restarting | 容器正在按重启策略重启 | 配置了 restart policy 后 |
dead | Docker 无法正常管理该容器 | 删除失败、底层资源异常等少见情况 |
可以用 docker ps 查看运行中的容器,用 docker ps -a 查看所有容器及其状态。
create 和 run 有什么区别?
docker create 只创建容器,不启动。容器创建后会停留在 created 状态,适合先准备配置、网络、挂载参数,再手动启动。
bashdocker create --name app nginx
docker run 更常用,它等价于“创建 + 启动”。如果加上 -d,容器会在后台运行。
bashdocker run -d --name app nginx
简单说:create 是先把容器准备好,run 是准备好以后立刻跑起来。
启动、停止和强制终止怎么用?
启动已创建或已停止的容器,用 docker start:
bashdocker start app
停止容器优先用 docker stop。它会先向容器内的 PID 1 进程发送 SIGTERM,给程序一个优雅退出的机会;如果超时仍未退出,再发送 SIGKILL 强制结束。
bashdocker stop app docker stop -t 30 app
docker kill 则是直接发送强制终止信号,默认是 SIGKILL:
bashdocker kill app
生产环境通常先用 stop,只有容器卡死、无法正常退出时才用 kill。尤其要注意,容器里的 PID 1 如果没有正确处理 SIGTERM,应用可能来不及关闭连接或刷盘,导致数据状态不一致。
pause、unpause 和 restart 分别做什么?
docker pause 会暂停容器中的所有进程,容器仍存在,但进程不会继续执行:
bashdocker pause app docker unpause app
它适合短时间冻结容器,比如临时排查资源占用。但它不是正常停机方式,不能替代 stop。
docker restart 相当于先停止再启动:
bashdocker restart app
如果应用需要平滑重启,要确认它能正确处理 SIGTERM,否则 restart 也可能变成一次粗暴中断。
如何查看容器运行情况?
生命周期管理不只是执行命令,还要能看懂容器发生了什么。
bashdocker logs app docker inspect app docker stats app docker events
docker logs 看容器标准输出和错误输出;docker inspect 看容器配置、网络、挂载、退出码等详细信息;docker stats 看 CPU、内存、网络、磁盘 IO;docker events 可以观察 Docker 守护进程记录的创建、启动、停止、销毁等事件。
如果容器异常退出,重点看 docker inspect 里的退出码。0 通常表示正常退出,非 0 往往表示程序异常、启动命令错误、权限问题或依赖服务不可用。
restart policy 怎么控制自动重启?
Docker 可以通过重启策略控制容器退出后的行为:
| 策略 | 含义 |
|---|---|
no | 默认策略,容器退出后不自动重启 |
on-failure | 只有非 0 退出码时才重启 |
always | 只要容器退出就自动重启,Docker 服务重启后也会拉起 |
unless-stopped | 类似 always,但如果容器被手动停止,Docker 重启后不会再自动拉起 |
示例:
bashdocker run -d --restart unless-stopped --name app nginx
服务型容器更常用 unless-stopped。它既能在异常退出后自动恢复,又不会和人工停机操作打架。
删除容器前要注意什么?
删除容器用 docker rm,但容器必须先停止:
bashdocker stop app docker rm app
如果确认不需要保留容器,也可以强制删除:
bashdocker rm -f app
不过要分清“容器数据”和“卷数据”。删除容器不会自动删除 Docker volume 中的数据,挂载到 volume 或宿主机目录里的文件通常还在。这是好事,也是坑:好处是数据不会因为容器重建就丢;坑是不用的 volume 会越积越多,需要定期清理。
常见清理命令包括:
bashdocker container prune docker volume prune docker system prune
清理前一定确认资源不再使用,尤其是 volume,误删后数据库、上传文件这类持久化数据可能无法恢复。
小结
Docker 容器生命周期可以理解为:先创建,再启动运行;运行中可以暂停、恢复、停止或重启;退出后根据退出码和重启策略决定是否自动拉起;不再需要时再删除容器并清理无用资源。日常管理时,stop 比 kill 更安全,inspect 和 logs 是排查退出问题的入口,volume 数据是否保留则要单独确认。