在Docker容器中的2个Flask应用之间进行通信

时间:2019-06-09 14:57:20

标签: python docker flask

在2个单独的容器中有2个flask应用程序,我认为可以从一个容器运行一个GET请求,并从第二个容器返回信息,但是我得到了[Errno 111] Connection refused。使用以下设置:

app1.py

@app.route('/get_message')
def get_message():
    message = requests.get('http://web2:5001/return_message')
    return message.text

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

app2.py

@app.route('/return_message')
def return_message():
    return 'the message'

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

docker-compose.yml

version: "3.7"
services:
  web1:
    build: ./web1
    container_name: web1
    ports: 
      - "5000:5000"
  web2:
    build: ./web2
    container_name: web2
    ports: 
      - "5001:5001"

app1的端点在转到http://127.0.0.1:5000/get_message时有效,但是flask返回:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='web2', port=5001): Max retries exceeded with url: /return_message (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb866642d30>: Failed to establish a new connection: [Errno 111] Connection refused',))

尝试为web2容器分配静态IP地址并在get请求中使用IP无效,使用networkslink或{{1}都无效} depends_on文件中。还尝试以不同组合公开两个容器上的不同端口,但它们之间没有收到消息。

1 个答案:

答案 0 :(得分:1)

我认为,当您旋转应用程序时,它们都在端口5000上运行,但运行在不同的容器中,因此请尝试将app1.py更改为:

@app.route('/get_message')
def get_message():
    message = requests.get('http://web2:5000/return_message')
    return message.text

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

还要在docker-compose中更改web2的端口:

version: "3.7"
services:
  web1:
    build: ./web1
    container_name: web1
    ports: 
      - "5000:5000"
  web2:
    build: ./web2
    container_name: web2
    ports: 
      - "5001:5000"

但是,如果您不想从主机访问web2,则无需在docker-compose中更改端口-请记住,这里我将主机的端口5001映射到web2容器的端口5000和两个容器在端口5000上公开应用。

请记住,它们是单独的容器,例如单独的环境。另外请记住,EXPOSE仅用于记录您在此端口上公开某些服务-不会使容器中的应用程序在此端口上运行。