如何在Docker容器中运行Nginx而不停止?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Docker容器中运行Nginx而不停止?相关的知识,希望对你有一定的参考价值。

我在Docker容器上安装了nginx,我试图像这样运行它:

docker run -i -t -p 80:80 mydockerimage /usr/sbin/nginx

问题在于Nginx的工作方式是初始进程立即产生一个主Nginx进程和一些工作者,然后退出。由于Docker只监视原始命令的PID,因此容器停止。

如何防止容器停止?我需要能够告诉它绑定到第一个子进程,或者阻止Nginx的初始进程退出。

答案

与所有表现良好的程序一样,nginx可以配置为不自我守护。

使用daemon off中描述的http://wiki.nginx.org/CoreModule配置指令。

另一答案

为了扩展Charles Duffy的答案,Nginx使用daemon off指令在前台运行。如果将它放在配置文件中不方便,我们可以直接在命令行中指定它。这使得在调试模式(前台)中运行变得容易,并通过更改命令行参数直接切换到在生产模式(后台)中运行。

要在前台运行:

nginx -g 'daemon off;'

要在后台运行:

nginx
另一答案

要扩展John的答案,您还可以使用Dockerfile CMD命令,如下所示(如果您希望自行启动而无需额外的args)

CMD ["nginx", "-g", "daemon off;"]
另一答案

将此命令添加到Dockerfile可以禁用它:

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
另一答案

这里有一个运行nginx的Dockerfile示例。正如Charles所提到的,它使用了daemon off配置:

https://github.com/darron/docker-nginx-php5/blob/master/Dockerfile#L17

另一答案

使用supervisord或runit [1]进行服务管理也是个好主意。

[1] https://github.com/phusion/baseimage-docker

另一答案

要添加Tomer和Charles的答案,

使用Entrypoint在Docker容器中在前台运行nginx的语法:

ENTRYPOINT nginx -g 'daemon off;' 

不直接相关,但使用Entrypoint运行多个命令:

ENTRYPOINT /bin/bash -x /myscripts/myscript.sh && nginx -g 'daemon off;' 

以上是关于如何在Docker容器中运行Nginx而不停止?的主要内容,如果未能解决你的问题,请参考以下文章

docker使用与nginx搭建

如何构建Memcached Docker容器

如何实现docker服务重启容器不停止

如何实现docker服务重启容器不停止

Docker:停止并删除 docker 容器(如果它正在运行)

Docker Compose 部署Nginx服务实现负载均衡