向Docker容器发出POST请求时遇到问题

时间:2020-11-11 07:24:29

标签: python python-3.x docker flask

我有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 #2App #1地址上的0.0.0.0:5001/ep发帖请求

问题是,我可以轻松地向两个App发出GET请求,也可以成功向App #2发出POST请求,但是App #2无法向{{1}处的App #1发出POST请求}(下面提到的错误),即使容器运行时没有任何错误

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

以下是Flask应用程序0.0.0.0:5001/ep

的代码

应用#1

app.py

应用#2

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)

任何建议都会很有帮助

1 个答案:

答案 0 :(得分:1)

您在这里几乎没有概念上的误解:

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

因此要解决的步骤是:

  1. 修正您的requirements.txt for app2
  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