【问题标题】:How to establish comminication between microservices in different docker containers? [duplicate]如何在不同的 docker 容器中建立微服务之间的通信? [复制]
【发布时间】:2020-08-22 07:39:28
【问题描述】:

我有两个使用 Flask 制作的微服务,分别在 localhost:3000 和 localhost:5000 上运行,它们工作正常并且在本地机器上通信良好,但在将它们容器化后,我遇到了以下错误。

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

我遵循的容器化步骤如下。

$ sudo docker build -t history:0.1  
$ sudo docker build -t calculation:0.1  
$ sudo docker run -d -p 0.0.0.0:3000:3000 --name history history:0.1  
$ sudo docker run -d -p 0.0.0.0:5000:5000 --name calculation calculation:0.1  
$ curl -X GET 0.0.0.0:3000/hist  
{  
"hist": []  
}  
$ curl -X GET 0.0.0.0:5000/sum/5/6  

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.8/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/app/calculate.py", line 15, in add
    update(a,b,ans,'+')
  File "/app/calculate.py", line 10, in update
    requests.get('http://localhost:3000/update',json={"a":a,"b":b,"ans":ans,"operator":operator})
  File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 524, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/sessions.py", line 637, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/requests/adapters.py", line 516, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=3000): Max retries exceeded with url: /update (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f2a08904040>: Failed to establish a new connection: [Errno 111] Connection refused'))

-->

这里的计算服务正在调用历史服务来更新历史中的数据。

我是 docker 新手。我该如何解决?

【问题讨论】:

    标签: python linux docker flask microservices


    【解决方案1】:

    查看您的应用配置,看起来calculation 正在尝试连接到 localhost,端口 3000:

    HTTPConnectionPool(host='localhost', port=3000)
    

    但是当您将其容器化时,您会将其分配给端口 5000:

    $ sudo docker run -d -p 0.0.0.0:5000:5000 --name calculation calculation:0.1  
    
    

    calculation 正在监听 5000,history 正在监听 3000。

    您的问题中不清楚的是 calculation 是尝试在端口 3000 上与自己对话,还是与 history 对话。如果它在自言自语,则更正端口应该可以修复它。如果它是在谈论历史,那么修复会涉及更多:因为它们在容器中运行,所以名称 localhost 不能像在单个主机上运行时那样引用其他服务。这是因为从容器的角度来看,historycalculation 是 2 个独立的主机。因此,要让一个与另一个对话,您需要使用 IP 地址或创建一个私有 docker 网络并附加两个容器。无论哪种情况,您都需要将名称从 localhost 更改为另一个容器的网络主机名。这样做:

    $ sudo docker network create --driver bridge my_network
    $ sudo docker run -d -p 0.0.0.0:3000:3000 --net=my_network --name history history:0.1
    $ sudo docker run -d -p 0.0.0.0:5000:5000 --net=my_network --name  calculation calculation:0.1
    

    并修改您的应用以更改此设置:

    'http://localhost:3000/update'
    

    到这里:

    'http://history:3000/update'
    

    【讨论】:

    • 这里的计算是为了与历史对话进行更新操作。那么您能否告诉我如何使用 IP 地址或修改命令来实现这一点。任何参考或示例都会有所帮助,谢谢
    • 我在答案中添加了说明。不知道你为什么接受另一个答案,因为它完全忽略了不正确的端口设置......
    • 它给了我错误curl: (56) Recv failure: Connection reset by peer
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2020-09-02
    • 2019-11-24
    • 2020-08-16
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多