Python中如何解决无法访问Docker容器内运行的Web服务器的问题

在 docker 中运行了 nginx 容器

docker run -p 80:80 -d  --name web_server nginx

容器正常运行,宿主机在 ipv6 上监听 80 端口,发现无法访问。 有知道怎么解决吗


Python中如何解决无法访问Docker容器内运行的Web服务器的问题
21 回复

防火墙


这个问题挺常见的,我遇到过好几次。核心原因通常是网络配置问题。Docker容器有自己的网络命名空间,默认情况下,容器内的服务绑定在 localhost127.0.0.1 上时,这个地址指的是容器内部的回环接口,而不是宿主机的。

要解决这个问题,你需要确保两件事:

  1. Web服务器绑定到正确的地址:在容器内启动Web服务器(比如Flask、FastAPI或uvicorn)时,不要绑定到 127.0.0.1,而应该绑定到 0.0.0.0。这个地址代表“所有可用的网络接口”,这样服务器就会监听来自容器外部的连接。
  2. 正确映射端口:在运行 docker run 命令时,使用 -p 参数将宿主机的端口映射到容器的端口。

示例:一个简单的Flask应用

假设你有这样一个 app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from inside the container!"

if __name__ == '__main__':
    # 关键在这里:host='0.0.0.0'
    app.run(host='0.0.0.0', port=5000)

对应的 Dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

构建和运行命令

# 构建镜像
docker build -t my-web-app .

# 运行容器,将宿主机的8080端口映射到容器的5000端口
docker run -p 8080:5000 my-web-app

现在,你应该能在宿主机上通过 http://localhost:8080 访问到容器内的Web服务了。

一句话总结:确保服务绑定到 0.0.0.0 并正确映射 -p 端口。

进容器里看看 NGINX 的日志吧

不是防火墙的问题,google 了一下,说是宿主机给容器做端口映射时,要绑定在 ipv4 地址上,尝试了,但是还不行

直接在服务器本地 curl 127.0.0.1 能访问么

#5
方便把
curl -v http://localhost:80
的执行结果贴出来嘛

先进容器确认 server 是否正常

logs 一下输出

你说的 ipv6 是在 netstat 里看的只有一个 IP v6 吧?就是这样,其实本地 v4 的 80 也开了的,不信你拿 nc 试试

sysctl net.ipv6.conf.default.forwarding=1
sysctl net.ipv6.conf.all.forwarding=1

是在 windows 的 docker 吗,之前我也是遇到映射端口失败,重启下 docker 就好了

docker 还是在 Linux 上装, win 和 mac 都是虚拟机, 坑多

先进容器查看 nginx 是否开启,检查一下你的容器是否正常的

问题已解决,谢谢大家

#14
解决了的话最好把方法分享出来,这样以后有人遇到同样的问题搜索到这个帖子可以进行参考。

解决了最好描述下过程方法.
不然后人搜到了只能看到一句已解决,没有任何帮助

提问的智慧呀,伙计

我觉得我前边的话都白说了,成了💩

楼主怎么解决的????
求救一样的问题。

回到顶部