Docker容器后台运行疑问:Nginx正常运行Ubuntu容器却退出?
Why Your Ubuntu Docker Container Exits Immediately in Detached Mode
这问题我日常折腾Docker时碰到过好多次,其实核心逻辑很简单——Docker容器的生命周期完全绑定它的主进程:只要主进程退出,容器就会立刻停止。
先看Nginx容器能正常运行的原因
当你执行docker container run -d nginx时,Nginx镜像的默认启动命令会启动Nginx的主服务进程,这个进程的设计就是一直在前台运行(哪怕你用了-d后台模式)。只要这个主进程不退出,Docker就会维持容器的运行状态,所以docker container ls能看到它。
再看Ubuntu容器自动退出的原因
Ubuntu镜像的默认启动命令是bash(或者sh,取决于镜像版本)。当你用-d后台启动时,bash进程没有任何交互输入(既没有终端连接,也没有需要执行的持续任务),它会认为“没有工作要做”,于是立刻退出。主进程一消失,Docker就会停止这个容器,所以docker container ls(默认只显示运行中容器)就看不到它了。
如果你不信,可以执行docker container ls -a,就能看到刚才启动的Ubuntu容器,状态显示为Exited (0)或者类似的退出状态码。
如何让Ubuntu容器在后台保持运行?
有几个常用的办法:
- 启动时指定一个持续运行的命令,比如让它一直监听一个空设备:
docker container run -d ubuntu tail -f /dev/nulltail -f /dev/null会一直运行,不会自动退出,这样容器就能保持后台运行状态。 - 如果你需要和容器交互,可以放弃后台模式,用交互式启动:
这样会直接进入容器的bash终端,只要你不主动退出,容器就会一直运行。docker container run -it ubuntu
内容的提问来源于stack exchange,提问作者Nikhil Bansal




