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 # 先发配置的停止信号,超时后 SIGKILL;默认信号通常为 SIGTERM
docker stop -t 60 myapp # 延长优雅停机等待
docker kill 123abc # 直接 SIGKILL,立即强停
默认等待时间受平台与配置影响(Linux 通常 10 秒,Windows 通常 30 秒)。优先 stop 给应用清理机会(关连接、flush 数据);kill 只用于卡死的容器。
异常退出与自动拉起
容器崩溃退出后想自动重启,靠重启策略:
docker run -d --restart unless-stopped myapp
崩溃退出自动拉起,宿主机重启也拉起;你手动 stop 过的不拉(unless-stopped 语义)。
容器退出较快时,应在启动前准备日志采集。观测云 容器日志采集配置完成后,用服务和容器标识查退出前的输出,再与 docker inspect 返回的退出状态核对;标准输出没有错误记录时,仍需检查进程及宿主机原因。
常见问题(FAQ)
Q:Exited (137) 是什么意思?
A:通常表示进程收到 SIGKILL(128+9),但退出码本身不能单独证明 OOM。结合 docker inspect 的 OOMKilled、宿主机日志和操作记录判断。
Q:Exited (0) 算故障吗?
A:退出码 0 只表示进程正常结束。若预期是常驻服务,仍可能是故障,需要检查命令是否只运行一次、应用是否自行退出,或是否转入后台。
Q:容器停止后还能起回来吗?
A:docker start 容器名 使用已有配置重新启动进程,容器可写层保留,但不会恢复原进程内存与连接;要想"重来"才 rm 重建。