如何在不停止的情况下在Docker容器中运行Nginx?


130

我在Docker容器上安装了Nginx,并且正在尝试像这样运行它:

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

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

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

Answers:


165

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

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


15
谢谢!为了澄清,这意味着编辑/etc/nginx/nginx.conf并添加“守护程序关闭”;在顶部(即不在服务器或其他指令内部)
Seldo 2013年


7
@LeonidShevtsov ...您的意思是未在1.0.9之前认可用于生产。关于就地升级的常规警告,对于执行Docker Way的人们而言并不重要。
查尔斯·达菲

他们现在似乎已经在服务器端进行了重定向(到nginx.org/en/docs/ngx_core_module.html)。
查尔斯·达菲

175

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

要在前台运行:

nginx -g 'daemon off;'

要在后台运行:

nginx

3
有人可以解释“ -g”实际上是什么吗?我只能在使用nginx的一个示例中在文档中找不到此开关。
red888 '17

5
@ red888,设置全局配置选项。
Charles Duffy

1
CMDCMD ["nginx", "-g", "daemon off;"] 适用于
docker

55

要扩展John的答案,您还可以使用以下Dockerfile CMD命令(如果您希望它自动启动而没有其他参数)

CMD ["nginx", "-g", "daemon off;"]




6

要添加Tomer和Charles的答案,

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

ENTRYPOINT nginx -g 'daemon off;' 

并不直接相关,而是要与Entrypoint运行多个命令:

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


0

对于所有来这里尝试在Docker容器中运行Nginx映像的人来说,它将作为服务运行

由于没有完整的Dockerfile,因此这是我的整体Dockerfile解决方案。

很好,工作。感谢这里的所有答案,以便解决最终的nginx问题。

FROM ubuntu:18.04
MAINTAINER stackoverfloguy "stackoverfloguy@foo.com"
RUN apt-get update -y
RUN apt-get install net-tools nginx ufw sudo -y
RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER docker
RUN sudo ufw default allow incoming
RUN sudo rm /etc/nginx/nginx.conf
RUN sudo rm /etc/nginx/sites-available/default
RUN sudo rm /var/www/html/index.nginx-debian.html
VOLUME /var/log
VOLUME /usr/share/nginx/html
VOLUME /etc/nginx
VOLUME /var/run
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY content/* /var/www/html/
COPY Dockerfile /var/www/html
COPY start.sh /etc/nginx/start.sh
RUN sudo chmod +x /etc/nginx/start.sh
RUN sudo chmod -R 777 /var/www/html
EXPOSE 80
EXPOSE 443
ENTRYPOINT sudo nginx -c /etc/nginx/nginx.conf -g 'daemon off;'

并运行:

docker run -p 80:80 -p 443:443 -dit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.