Requests库调用Docker容器内Flask服务报[Errno 111] Connection refused如何解决
问题根因
你遇到的连接报错是Docker容器网络的默认寻址规则导致的:
当请求代码运行在Docker容器内时,代码中写的localhost指向的是当前请求容器自身的回环地址,而不是宿主机的地址,自然无法访问到宿主机上映射的5003端口的Flask服务。
对应解决方案
按你的使用场景可选择以下任意一种方案解决:
场景1:两个容器独立部署,不想调整容器启动参数
- 方案1:将请求地址中的
localhost替换为宿主机的实际局域网IP,例如宿主机IP为192.168.1.10,就修改代码为:
注意需要提前放行宿主机防火墙5003端口的入站规则。resp = req.get("http://192.168.1.10:5003/") - 方案2(仅适配Mac/Windows桌面版Docker):直接用Docker内置的宿主机别名替换
localhost,修改代码为:resp = req.get("http://host.docker.internal:5003/") - 方案3(仅适配Linux宿主机):启动请求容器时添加
--network="host"参数,让请求容器共享宿主机的网络命名空间,此时容器内的localhost和宿主机完全一致,不需要修改请求代码。
场景2:Flask服务和请求服务都是你自行维护,建议用自定义网络打通
这种方式不需要依赖宿主机IP、也不需要做端口映射,稳定性更高:
- 首先创建自定义Docker网络:
docker network create my-flask-net - 启动Flask服务容器时,添加网络和容器名参数:
docker run -d --network my-flask-net --name flask-app [你的Flask镜像名] - 启动请求容器时,也加入同一个自定义网络:
docker run --network my-flask-net [你的请求代码镜像名] - 修改请求代码的地址为Flask容器的名称+容器内部服务端口(默认是5000):
resp = req.get("http://flask-app:5000/")
内容的提问来源于stack exchange,提问作者woineer
相关产品推荐
相关产品推荐

