Windows下Docker挂载目录Nginx正常,Ubuntu容器启动即退出的原因与解决
为什么Nginx容器正常运行,Ubuntu容器启动即停止?
这是Docker新手常遇到的问题,核心和容器的运行机制直接相关,我给你拆解清楚:
Docker容器的生命周期完全绑定启动时的主进程——只要主进程退出,容器就会立刻停止。
核心差异:
- 官方Nginx镜像的Dockerfile里默认配置了前台运行的启动命令:
这个命令让Nginx以非守护进程(前台)模式运行,持续占据容器的主进程位置,所以容器能一直保持运行状态。CMD ["nginx", "-g", "daemon off;"] - 而Ubuntu 18.04基础镜像默认没有指定任何持续运行的主进程。启动容器时,Docker会执行镜像默认的
CMD(通常是/bin/sh -c这类一次性命令),命令执行完就立刻退出,没有持续运行的进程支撑,容器自然就跟着停止了。
如何解决Ubuntu容器启动即停止的问题?
结合你挂载目录的使用场景(大概率需要容器持续运行做开发或服务部署),可以用这几种方案:
方案1:启动容器时指定持续运行的前台命令
直接在docker run命令末尾添加一个会一直运行的前台命令,用它“挂住”容器:
docker run -v /C/ubuntu-only/html:/home -p 8083:8080 --name cntr-ubuntu img-ubuntu:abc tail -f /dev/null
这个命令会让容器一直运行,直到你手动执行docker stop cntr-ubuntu。
方案2:修改Dockerfile,添加默认的持续运行命令
如果需要每次启动这个Ubuntu镜像的容器都自动保持运行,可以修改Dockerfile,在末尾添加CMD指令:
FROM ubuntu:18.04 COPY html /home CMD ["tail", "-f", "/dev/null"]
重新构建镜像后,启动容器就不需要额外加命令了,容器会自动运行tail -f /dev/null保持存活。
方案3:交互式启动容器(适合调试/临时操作)
如果只是想进入容器做一些临时操作,可以添加-it参数启动交互式shell:
docker run -it -v /C/ubuntu-only/html:/home -p 8083:8080 --name cntr-ubuntu img-ubuntu:abc /bin/bash
这样容器会保持运行,直到你主动退出shell会话。
额外提示:如果要在Ubuntu容器里运行实际服务
如果你的目标是在Ubuntu容器里运行类似Nginx的web服务,需要先在Dockerfile里安装对应服务,再配置成前台运行。比如给Ubuntu镜像安装Nginx:
FROM ubuntu:18.04 RUN apt-get update && apt-get install -y nginx && rm -rf /var/lib/apt/lists/* COPY html /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"]
这样构建的镜像启动后,就会和官方Nginx镜像一样持续运行了。
内容的提问来源于stack exchange,提问作者user20358




