gpt4 book ai didi

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) on docker

转载 作者:IT老高 更新时间:2023-10-28 12:43:00 27 4
gpt4 key购买 nike

我正在尝试从 nginx 加载默认网页,但在容器运行后我无法通过 http 连接到端口 80。

我正在运行 docker 1.9.9

我采取的步骤如下:

我创建了一个 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 文件将下面的 nginx 配置文件复制到 /etc/nginx/sites-available/default 并为 /etc/nginx/sites-enabled/创建指向该文件的符号链接(symbolic link)默认

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;
}
}

然后我使用以下方法构建图像:

docker build -t dnginx 

我启动了容器:

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

然后我找到了ip地址并尝试连接

curl http://172.17.0.2

哪个返回了

curl: (7) Failed to connect to 172.17.0.2 port 80: Operation timed out

我在容器中打开了一个 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 我得到:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -

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

如果我只连接到 nginx 镜像,也会发生同样的事情。

最佳答案

这些天我也有同样的问题,但我必须运行多进程,所以删除 supervisord 对我来说不是一个解决方案。

只需将 -g "daemon off;" 标志添加到 supervisor nginx 程序命令即可解决问题。那是

[程序:nginx]
命令=/usr/sbin/nginx -g "守护进程关闭;"

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

关于nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) on docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33650820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com