同一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
相关产品推荐
相关产品推荐

