【问题标题】:Trouble making POST request to docker container无法向 docker 容器发出 POST 请求
【发布时间】:2020-11-11 07:24:29
【问题描述】:

我有2个dockerized flask应用,应用可以在以下地址访问

应用 #1

0.0.0.0:5001 [GET]
0.0.0.0:5001/ep [POST]

应用 #2

0.0.0.0:6004 [GET]
0.0.0.0:6004/ep [POST]

App #20.0.0.0:5001/ep 地址上向App #1 发出发帖请求

问题是我可以轻松地向两个应用程序发出 GET 请求,我也可以成功地向 App #2 发出 POST 请求,但 App #2 无法在 0.0.0.0:5001/epApp #1 发出 POST 请求(错误如下所述)即使容器运行没有任何错误

ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=5001): url: /ep 超出最大重试次数(由 NewConnectionError(' 引起): 无法建立新的连接:[Errno 111] 连接被拒绝',))

下面是 Flask Applications app.py的代码

应用 #1

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify('App1')

@app.route('/ep', methods = ['POST'])
def ep():

    data = {}

    # code for receiving data
    # processing data and saving results in dictionary 

    return jsonify(data)

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

应用 #2

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify('App2')

@app.route('/ep', methods = ['POST'])
def ep():
    
    data = {}

    res = requests.post('http://0.0.0.0:5001/ep', files = data)
    res = res.json()

    return jsonify(data) 

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

任何建议都会很有帮助

【问题讨论】:

标签: python python-3.x docker flask


【解决方案1】:

您在这里很少有概念上的误解:

  1. 当您将服务绑定到0.0.0.0 时,这并不意味着您可以使用 IP 地址0.0.0.0 连接到该服务。这仅意味着该服务通过您的“盒子”拥有的所有网络接口接受连接。
  2. 为了通过网络连接容器,它们必须在同一个非默认网络中(最好使用非默认网络,因为默认不支持按名称查找服务)
  3. 当您建立从容器到另一个容器的连接时,您应该使用容器端口,而不是主机端口
  4. (*) 如果不将requests 添加到requirements.txt,我无法运行app2

所以修复的步骤是:

  1. 为 app2 修复 requirements.txt
  2. 创建网络:docker network create flasktest
  3. 将您的 app2 代码修复为:
from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route('/')
def index():
    return jsonify('App2')

@app.route('/ep', methods = ['POST'])
def ep():
....
    data = {}

    res = requests.post('http://my-target-host:5000/ep', files = data)
    res = res.json()

    return jsonify(data).

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
  1. 构建您的图像
  2. 启动您的 app1 容器:docker run -p 5001:5000 --net flasktest --name my-target-host app1
  3. 启动您的 app2 容器:docker run -p 5002:5000 --net flasktest app2

使用以下代码测试您的帖子: curl -X POST localhost:5002/ep

【讨论】:

  • 您好 Alexey 我使用您提到的命令创建了一个新的虚拟网络,并在该网络上运行了所有容器,但出现了同样的错误
  • 我添加了一些我忘记的导入,请查看更新后的帖子
  • 感谢您努力写出详细的答案,问题已解决
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多