如何在 Docker 容器中运行 Nginx 并保持不退出?

官方 nginx 镜像默认以前台模式运行(daemon off),直接 docker run -d -p 80:80 nginx 即可;自建镜像需保证 CMD 为 nginx -g daemon off;,主进程前台是容器不退出的关键。

最佳实践
如何在 Docker 容器中运行 Nginx 并保持不退出?封面

答案:用官方镜像直接跑——docker run -d -p 80:80 nginx,官方镜像的默认命令就是前台模式。下方多个docker run示例为替代方案,不要顺序创建同名web。发布443端口本身不会配置TLS,还需证书与ssl监听。自建镜像的关键只有一条:主进程必须前台运行,即 CMD 用 nginx -g "daemon off;";若写成后台 daemon 模式,Nginx 启动后主进程立即退出,容器跟着退出,这就是"起不来"的根因。

直接用官方镜像

docker run -d --name web -p 80:80 nginx

挂载自定义配置与站点文件:

docker run -d --name web \
  -p 80:80 -p 443:443 \
  -v "$(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro" \
  -v "$(pwd)/html:/usr/share/nginx/html:ro" \
  nginx

自建镜像的 Dockerfile

FROM nginx:stable

COPY nginx.conf /etc/nginx/nginx.conf
COPY html/ /usr/share/nginx/html/

EXPOSE 80 443
# 官方基础镜像已带正确 CMD:
# CMD ["nginx", "-g", "daemon off;"]

如果从纯净系统镜像自己装 Nginx,CMD 必须显式写:

CMD ["nginx", "-g", "daemon off;"]

容器一直退出的排查

  1. 看日志:docker logs web——配置语法错误最常见,使用相同镜像版本和实际挂载执行nginx -t验证
  2. 看退出码:docker ps -a 的 STATUS 列,退出码只提供线索,0也可能是正常停止,非0需结合日志与状态判断
  3. 配置检查:挂载的配置文件路径对不对,语法对不对(运行中可exec;已停止时需用同版本临时容器挂载配置执行nginx -t)

生产加固

docker run -d --name web \
  --restart unless-stopped \
  -p 80:80 \
  --read-only --tmpfs /var/cache/nginx --tmpfs /var/run \
  nginx

restart策略需Docker服务运行等条件,手动停止会影响自动启动;只读示例仍需按镜像/配置确认缓存、PID和其他写路径。

启动后分别请求正常路径与不存在的路径,确认容器日志里有对应状态码。接入观测云时,按 Container 配置核对 Nginx 的 stdout/stderr 日志是否被采集,再检查访问日志字段;请求耗时和 upstream 地址需要先写入 log_format 才能分析。

常见问题(FAQ)

Q:daemon off 写在哪更规范?
A:优先写在 CMD 的 -g 参数里(容器标准做法);写进 nginx.conf 的 daemon off; 也可以,二选一别都写。

Q:容器里 Nginx 的 worker 进程数怎么定?
A:默认 worker_processes auto 按可见 CPU 核数来,不保证自动等于cgroup CPU quota;需核对cpuset、quota及镜像entrypoint调优行为。

Q:reload 配置需要重启容器吗?
A:不用,docker exec web nginx -s reload 热加载;改了挂载的 conf 文件后执行它即可。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台