在docker上,nginx: bind()到0.0.0.0:80失败(98:地址已经在使用)

我试图从nginx加载默认的网页,但我不能连接到端口80通过http后容器运行。

我正在运行docker1.9.9

我采取的步骤如下:

我创build了一个这样的Docker文件:

FROM ubuntu:15.10 RUN echo "Europe/London" > /etc/timezone RUN dpkg-reconfigure -f noninteractive tzdata ENV DEBIAN_FRONTEND noninteractive RUN apt-get update RUN apt-get install -y nginx RUN apt-get install -y supervisor RUN apt-get update && apt-get -q -y install lsof RUN apt-get install net-tools RUN apt-get install psmisc RUN apt-get -y install curl ADD supervisor.nginx.conf /etc/supervisor.d/nginx.conf CMD /usr/bin/supervisord -n RUN rm -Rf /etc/nginx/conf.d/* RUN rm /etc/nginx/sites-enabled/default RUN mkdir /etc/nginx/logs/ RUN touch /etc/nginx/logs/error.log RUN mkdir /usr/share/nginx/logs/ RUN touch /usr/share/nginx/logs/error.log ADD ./conf/nginx.conf /etc/nginx/sites-available/default RUN ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default copy ./dist /usr/share/nginx/html CMD /usr/bin/supervisord -n 

docker文件将下面的nginxconfiguration文件复制到/etc/nginx/sites-available/default并为/etc/nginx/sites-enabled/default创build一个符号链接。

 server { root /usr/share/nginx/html; index index.html index.htm; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 5d; } # deny access to . files, for security # location ~ /\. { access_log off; log_not_found off; deny all; } } 

然后,我用下面的方法build立了图

 docker build -t dnginx 

我启动了容器:

 docker run --name d3 -d -p 80:80 dnginx 

然后,我发现了IP地址,并试图连接

 curl http://172.17.0.2 

哪个返回

curl:(7)无法连接到172.17.0.2端口80:操作超时

我在容器中打开了一个bash shell,并运行了返回的nginx

 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] still could not bind() 

如果我运行netstat --listen我得到:

 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:80 *:* LISTEN 

如果我运行netstat -ltnp | grep :80 netstat -ltnp | grep :80我得到:

 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - 

我完全不知道发生了什么事。

同样的事情发生,如果我只连接到Nginx的图像。

我试过你的Dockerfile ,它已经按预期工作了。 我做的唯一的改变是删除任何引用supervisord并添加

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

Dockerfile

当一个容器启动时,其网络命名空间与主机和其他容器是完全隔离的,唯一的进程是由ENTRIPOINT或CMD指令及其子进程启动的进程,所以我认为你看到运行的nginx进程集装箱正是由supervisord运行的集装箱。

你确定172.17.0.2是docker容器的当前IP吗? 容器IP不稳定,并且取决于主机上运行的容器数量以及它们的启动顺序。

您使用运行选项'-p 80:80'公开了主机上的http端口,因此您应该可以使用curl 127.0.0.1在docker主机上访问它。

我现在有同样的问题,但我必须运行多进程,所以删除supervisord不是我的解决方案。

只需添加-g "daemon off;" 标志到主管nginx程序命令解决了这个问题。 那是

[program:nginx] command=/usr/sbin/nginx -g "daemon off;"

似乎容器中的所有进程都必须在前台运行,甚至由supervisord工具管理