如何在 Docker 容器中运行 Nginx 并保持不退出?
官方 nginx 镜像默认以前台模式运行(daemon off),直接 docker run -d -p 80:80 nginx 即可;自建镜像需保证 CMD 为 nginx -g daemon off;,主进程前台是容器不退出的关键。
答案:用官方镜像直接跑——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;"]
容器一直退出的排查
- 看日志:
docker logs web——配置语法错误最常见,nginx -t先在本地验证 - 看退出码:
docker ps -a的 STATUS 列,Exited (0)多半是 daemon 模式问题,Exited (1)看日志报错 - 配置检查:挂载的配置文件路径对不对,语法对不对(挂载后
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 文件后执行它即可。