You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows下Docker挂载目录Nginx正常,Ubuntu容器启动即退出的原因与解决

为什么Nginx容器正常运行,Ubuntu容器启动即停止?

这是Docker新手常遇到的问题,核心和容器的运行机制直接相关,我给你拆解清楚:

Docker容器的生命周期完全绑定启动时的主进程——只要主进程退出,容器就会立刻停止。

核心差异:

  • 官方Nginx镜像的Dockerfile里默认配置了前台运行的启动命令:
    CMD ["nginx", "-g", "daemon off;"]
    
    这个命令让Nginx以非守护进程(前台)模式运行,持续占据容器的主进程位置,所以容器能一直保持运行状态。
  • 而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

火山引擎 最新活动