如何在 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,官方镜像的默认命令就是前台模式。自建镜像的关键只有一条:主进程必须前台运行,即 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 列,Exited (0) 多半是 daemon 模式问题,Exited (1) 看日志报错
  3. 配置检查:挂载的配置文件路径对不对,语法对不对(挂载后 docker exec web nginx -t

生产加固

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

--restart unless-stopped 保证重启后自动拉起;只读文件系统收紧安全面。

观测云对照

Nginx 可观测开箱即用。 DataKit 的 Nginx 集成采集访问/错误日志与指标(连接数、QPS),Pipeline 解析出状态码、耗时、上游地址等字段,5xx 比例与 P99 延迟用监控器告警。

常见问题(FAQ)

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

Q:容器里 Nginx 的 worker 进程数怎么定?
A:默认 worker_processes auto 按可见 CPU 核数来,容器里会自动适配分配的核数,一般不用改。

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

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台