docker——nginx运行起不来或者说起来了又挂了
记得刚开始玩docker的时候,想着docker上运行一个nginx代理,于是写了个Dockerfile:
FROM nginx:latest WORKDIR .
COPY demo.conf /etc/nginx/conf.d/demo.conf EXPOSE 80 CMD [ "nginx" ]
然后docker build生成,docker run运行,发现怎么都起不来,或者说起来了又挂了,到/var/lib/docker/containers目录下查看日志发现启动也是正常的:
#生成 sudo docker build -t nginx:v1 . #运行 sudo docker run -id nginx:v1
#或者运行
sudo docker run -id nginx:v1 nginx
在百度查到,nginx默认是后台启动的,一般的我们启动nginx进程就是直接输入nginx,然后回车,但是docker的CMD要求命令能将进程挂起来,也就是hold住,显然,正常使用nginx命令启动不满足这个条件
后来查到,添加daemon off;配置可以让nginx在前台启动,于是我修改Dockerfile:
FROM nginx:latest WORKDIR . COPY demo.conf /etc/nginx/conf.d/demo.conf EXPOSE 80 RUN echo "daemon off;" >> /etc/nginx/nginx.conf CMD [ "nginx" ]
然后build&run,果然nginx完美的起来了!
其实我们是可以直接使用nginx镜像的,但是为什么使用Dockerfile就不行了呢?于是我直接使用nginx镜像创建一个容器,然后ps查看容器启动的命令:
#创建一个容器 sudo docker run -id nginx:latest #查看运行中的容器状态,--no-trunc是显示所有的信息,不进行截取 sudo docker ps --no-trunc
结果显示:
可以看到它是使用下面命令启动的:
/docker-entrypoint.sh nginx -g 'daemon off;'
注意后面的daemon off;,于是我将Dockerfile改成:
FROM nginx:latest WORKDIR . COPY demo.conf /etc/nginx/conf.d/demo.conf EXPOSE 80 CMD [ "nginx", "-g", "daemon off;" ]
成功启动!
另外,我们也可以在docker run时覆盖这个CMD,如:
#注意,这里的daemon off;需要使用引号包起来! sudo docker run -id nginx:v1 nginx -g 'daemon off;'
其实,我们完全没有必要在Dockerfile里面添加一个CMD命令启动!因为添加了就是覆盖了nginx镜像原来的命令!
一个专注于.NetCore的技术小白
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY