You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一Docker网络下容器间HTTP数据传输失败排查

问题描述

我有两个处于同一Docker网络的容器,希望通过HTTP的POST和GET方法传输数据。

接收端Flask代码:

app = Flask(__name__)
is_processing = False  # Flag to indicate whether processing is ongoing
receiver_url = "http://172.18.0.2:8889/receive_data"  # Define the receiver URL 

启动命令:

app.run(port=8889)

发送端数据发送函数:

def send_data_to_receiver(data):
    receiver_url = "http://172.18.0.2:8889/receive_data"
    data_serializable = [x.tolist() for x in data]
    response = requests.post(receiver_url, json=data_serializable)
    if response.status_code == 200:
        print("Data sent successfully to receiver notebook")
    else:
        print("Failed to send data to receiver notebook")

代码在Jupyter Notebook间运行正常,但部署到Docker容器后出现连接拒绝错误:

File "/usr/local/lib/python3.11/dist-packages/requests/adapters.py", line 519, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='172.18.0.2', port=8889): Max retries exceeded with url: /receive_data (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc750529cd0>: Failed to establish a new connection: [Errno 111] Connection refused'))
问题根源与解决办法

1. Flask服务绑定地址错误

默认情况下app.run(port=8889)仅绑定容器的127.0.0.1,服务只能在容器内部访问,同一网络的其他容器无法连接。

修正:启动Flask时指定绑定0.0.0.0,让服务监听容器所有网络接口:

app.run(host='0.0.0.0', port=8889)

2. 硬编码IP地址不可靠

Docker容器的IP地址会随重启、重建变化,写死172.18.0.2易导致地址失效。

修正:使用容器名称作为访问地址(需确保两容器在同一自定义网络)。假设接收端容器名为receiver-container,发送端URL修改为:

receiver_url = "http://receiver-container:8889/receive_data"

3. 验证网络与容器状态

  • 确认两容器处于同一自定义Docker网络(默认bridge网络存在限制,建议创建自定义网络)
  • 检查接收端容器是否正常启动,Dockerfile或启动命令中是否声明EXPOSE 8889(同一网络无需端口映射,但需暴露端口)
  • 在发送端容器内执行ping receiver-container,测试网络连通性与容器名称解析是否正常

内容的提问来源于stack exchange,提问作者deadpixels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:12:47