首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2个Docker容器中的2个flask应用程序之间的通信

2个Docker容器中的2个flask应用程序之间的通信
EN

Stack Overflow用户
提问于 2020-08-31 06:42:01
回答 1查看 729关注 0票数 1

我正在尝试构建2个flask应用程序,这些应用程序在2个容器上运行,并且必须相互通信。但是我一直收到这个错误:

代码语言:javascript
复制
During handling of the above exception, another exception occurred:
slave     | 
slave     | Traceback (most recent call last):
slave     |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
slave     |     response = self.full_dispatch_request()
slave     |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
slave     |     rv = self.handle_user_exception(e)
slave     |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
slave     |     reraise(exc_type, exc_value, tb)
slave     |   File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
slave     |     raise value
slave     |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
slave     |     rv = self.dispatch_request()
slave     |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
slave     |     return self.view_functions[rule.endpoint](**req.view_args)
slave     |   File "slave.py", line 21, in home
slave     |     res = requests.get('http://localhost:5001/test')
slave     |   File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 76, in get
slave     |     return request('get', url, params=params, **kwargs)
slave     |   File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 61, in request
slave     |     return session.request(method=method, url=url, **kwargs)
slave     |   File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 530, in request
slave     |     resp = self.send(prep, **send_kwargs)
slave     |   File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 643, in send
slave     |     r = adapter.send(request, **kwargs)
slave     |   File "/usr/local/lib/python3.8/site-packages/requests/adapters.py", line 516, in send
slave     |     raise ConnectionError(e, request=request)
slave     | requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=5001): Max retries exceeded with url: /test (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f0c81dfdd90>: Failed to establish a new connection: [Errno 111] Connection refused'))
slave     | 172.17.0.1 - - [30/Aug/2020 22:30:35] "GET / HTTP/1.1" 500 -

我的第一个应用程序是尝试发出get请求的slave:

代码语言:javascript
复制
import time
import random
import redis
from flask import Flask, redirect, url_for, request, render_template
import requests
from pymongo import MongoClient
app = Flask(__name__)

@app.route('/', methods = ['POST', 'GET'])
def home():
    dictToSend = {'question':'what is the answer?'}
    res = requests.get('http://localhost:5001/test')
    print("SLave sent!!!!!!!!!!")

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5002)

这是接收get请求的主服务器:

代码语言:javascript
复制
from pymongo import MongoClient
app = Flask(__name__)

@app.route('/test')
def test():
    return '00000'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port = 5001)

我的docker-compose.yml文件是这样的:

代码语言:javascript
复制
    master:
            build: ./master
            container_name: master
            command: python -u master.py && python -m flask run
            ports:
                    - "5001:5001"


    slave:
            build: ./slave
            container_name: slave
            command: python -u slave.py
            ports:
                    - "5002:5002"
            links:
                    - master

我试过这个答案:Communicating between 2 flask apps in docker containers,但它很混乱,对我也不起作用。我也试着上了主网页,看看主网页有没有问题,但我可以通过浏览器加入页面。我也试着改变

代码语言:javascript
复制
res = requests.get('http://localhost:5001/test') 

代码语言:javascript
复制
res = requests.get('http://0.0.0.0:5001/test')

并且还可以

代码语言:javascript
复制
res = requests.get('http://master:5001/test')

有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-08-31 08:10:31

如果您在容器内使用localhost,您将尝试访问容器本身,而不可能访问另一个容器。使用服务名称或主机IP从web浏览器访问容器。您应该删除该链接,它用于作为服务名称的别名。

代码语言:javascript
复制
http://master:5001/test (from an other container)
http://<host_ip>:5001/test (from external client like web broswer)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63662801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档