docker run -d 之后容器会自动停止吗?
不会——-d 只是后台运行,容器会一直跑到主进程退出或被 docker stop;但主进程退出(如命令执行完)容器就停。本文解释容器生命周期与保活要点。
答案:-d(detached)只决定"后台运行、不占终端",不会让容器自动停止。容器会一直运行,直到:主进程自己退出、被 docker stop/docker kill 停掉、或宿主机重启(没配重启策略的话)。反过来,如果你 docker run -d 后容器"秒停",那是因为主进程执行完退出了**,而不是 -d 的问题。**
容器存活的本质:主进程在,容器在
容器生命周期绑定在 PID 1 主进程上:
docker run -d nginx # nginx 前台常驻 → 容器一直跑
docker run -d ubuntu echo hi # echo 执行完就退出 → 容器"秒停"
后者 docker ps 看不到,docker ps -a 里显示 Exited (0)——不是异常,是正常跑完了。
想让临时容器一直活着
调试时想留个空容器慢慢 exec:
docker run -dit ubuntu # -it 保持 stdin+tty
docker run -d ubuntu sleep infinity # 或挂个永驻命令
docker run -d ubuntu tail -f /dev/null # 常见占位写法
停止与强停
docker stop 123abc # 发 SIGTERM,等 10 秒(默认)再 SIGKILL
docker stop -t 60 myapp # 延长优雅停机等待
docker kill 123abc # 直接 SIGKILL,立即强停
优先 stop 给应用清理机会(关连接、flush 数据);kill 只用于卡死的容器。
异常退出与自动拉起
容器崩溃退出后想自动重启,靠重启策略:
docker run -d --restart unless-stopped myapp
崩溃退出自动拉起,宿主机重启也拉起;你手动 stop 过的不拉(unless-stopped 语义)。
观测云对照
容器"为什么停了"不该靠猜。 退出码、退出前的最后日志、OOM 事件——DataKit 采集容器事件与 stdout/stderr 后,在观测云里直接查退出原因,异常退出还有告警兜底。
常见问题(FAQ)
Q:Exited (137) 是什么意思?
A:被 SIGKILL 杀的(128+9)。常见于 OOM Killer 或 docker kill;查 docker inspect 的 OOMKilled 字段与内存限制。
Q:Exited (0) 算故障吗?
A:不算,主进程正常结束。但如果你的预期是常驻服务,说明主进程配置成了非前台模式(如 nginx 开了 daemon)。
Q:容器停止后还能起回来吗?
A:docker start 容器名 原样拉起,文件系统状态保留;要想"重来"才 rm 重建。