docker运行nginx为什么要使用 nginx -g 'daemon off;'

1.docker容器跑着为啥会挂掉?

docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,如果docker 容器pid挂了,那么docker容器便会直接退出。

2.docker run的时候把command最为容器内部命令,如果你使用nginx,那么nginx程序将后台运行,这个时候nginx并不是pid为1的程序,而是执行的bash,这个bash执行了nginx指令后就挂了,所以容器也就退出了,和你这个一样的道理,pm2 start 过后,bash 的pid为1,那么此时bash执行完以后会退出,所以容器也就退出了。

Nginx的docker仓库原文说明如下:

If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

 

 

Running nginx in debug mode

Images since version 1.9.8 come with nginx-debug binary that produces verbose output when using higher log levels. It can be used with simple CMD substitution:

 

$ docker run --name my-nginx -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx nginx-debug -g 'daemon off;'

Similar configuration in docker-compose.yml may look like this:

 

web:

  image: nginx

  volumes:

    - ./nginx.conf:/etc/nginx/nginx.conf:ro

  command: [nginx-debug, '-g', 'daemon off;']

  

If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

-- 这里的CMD适用 docker-compose.yml 中的entrypointcommand,以及 Dockerfile 中的ENTRYPOINTCMD

也就是说:

Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。

Docker未执行自定义的CMD之前,nginx的pid是1,执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。

所以一旦执行完自定义CMD,nginx容器也就退出了。

 

### Docker Nginx 容器启动失败的原因分析 DockerNginx 容器启动失败可能由多种原因引起,以下是常见的几个方面及其对应的解决方案: #### 1. 配置文件错误 如果挂载了自定义配置文件到容器内部 `/etc/nginx` 路径下,则可能存在语法错误或其他不兼容的设置。这会阻止 Nginx 正常加载并导致容器崩溃。 - **解决方案**: 使用 `docker logs <container_name>` 查看具体的报错日志[^3]。确认是否有类似于 “failed to load configuration file”的提示。如果是这种情况,请验证本地配置文件的内容是否正确无误,并重新构建或重启容器。 ```bash docker logs webserver ``` --- #### 2. 端口冲突 当尝试将容器内的端口映射至宿主机上的某个特定端口时(例如 `-p 80:80`),若该端口已被其他进程占用,则会导致绑定失败从而影响服务可用性。 - **解决方案**: 执行命令 `netstat -tuln | grep :80` 来检测当前系统是否存在正在监听 TCP/UDP 协议下的第80号端口的服务实例;如果有发现重复情况的话可以考虑更改目标端口号或者停止干扰源程序后再试一次操作流程即可解决问题[^2]。 ```bash sudo netstat -tuln | grep ':80' ``` --- #### 3. 文件权限不足 某些时候由于安全策略限制等原因造成外部共享给容器使用的资源路径缺乏必要的读写执行权利也会引发异常状况发生比如无法创建log记录等等现象出现进而致使整个应用层面上线困难重重难以顺利推进下去完成既定任务指标达成预期效果实现商业价值最大化追求利润增长点挖掘潜力股提升竞争力增强市场占有率扩大影响力范围广纳贤才招揽精英人才充实团队力量加强协作配合提高工作效率降低运营成本节约开支增加收益回报率获得更高的投资回报率ROI(Return On Investment). - **解决方案**: 修改指定目录的访问属性使其满足最低需求标准之后再进行关联动作测试观察最终表现形式如何变化调整直至恢复正常为止. ```bash chmod -R 755 /opt/nginx_docker/mapping chown -R root:root /var/log/nginx-docker ``` --- #### 4. 基础环境缺失 对于基于 CentOS 构建出来的定制化版本而言如果没有提前准备好必备组件库那么同样会出现各种奇葩问题层出不穷让人头疼不已急需找到有效途径加以应对处理才行啊亲们快来帮帮忙吧谢谢啦! - **解决方案**: 参考官方文档说明按照指引逐步完善依赖关系链路结构图谱绘制清晰明了便于后续维护管理升级等工作开展得更加顺畅高效快捷省事省力省钱又环保哦朋友们还不赶紧行动起来吗?[^4] ```Dockerfile FROM centos:latest RUN yum install epel-release -y && \ yum update -y && \ yum install nginx -y CMD ["nginx", "-g", "daemon off;"] ``` --- ### 总结 通过上述方法基本能够覆盖大部分场景下的常见故障类型并且给出了针对性较强的修复措施供大家参考借鉴学习模仿实践运用推广普及开来形成良性循环生态体系共同进步成长壮大起来迎接美好的明天未来可期让我们一起努力奋斗拼搏成就梦想共创辉煌伟业吧同志们加油干呀霍霍霍哈哈哈!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值