Python 如何在不同docker容器中的微服务之间建立协作?
我有两个使用Flask制作的微服务,分别在localhost:3000和localhost:5000上运行,它们工作良好,在本地机器上通信良好,但在将它们容器化之后,我发现了以下错误Python 如何在不同docker容器中的微服务之间建立协作?,python,linux,docker,flask,microservices,Python,Linux,Docker,Flask,Microservices,我有两个使用Flask制作的微服务,分别在localhost:3000和localhost:5000上运行,它们工作良好,在本地机器上通信良好,但在将它们容器化之后,我发现了以下错误 requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=3000): Max retries exceeded with url: /update (Caused by NewConnectionError('&l
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'))
requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=3000):url:/update超过了最大重试次数(由NewConnectionError引起(':未能建立新连接:[Errno 111]连接被拒绝])
我遵循的集装箱化步骤如下
$ 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'))
-->
$sudo docker build-t历史记录:0.1
$sudo docker构建-t计算:0.1
$sudo docker run-d-p 0.0.0.0:3000:3000--名称历史记录:0.1
$sudo docker run-d-p 0.0.0.0:5000:5000--名称计算:0.1
$curl-X获取0.0.0.0:3000/历史
{
“历史”:[]
}
$curl-X得到0.0.0.0:5000/和/5/6
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第2309行,在调用中__
返回self.wsgi_应用程序(环境,启动响应)
wsgi_应用程序中的文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第2295行
response=self.handle\u异常(e)
文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第1741行,在句柄中
重放(exc_类型、exc_值、tb)
文件“/usr/local/lib/python3.8/site packages/flask/_compat.py”,第35行,重新登录
增值
wsgi_应用程序中的文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第2292行
response=self.full\u dispatch\u request()
文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第1815行,完整发送请求
rv=自身处理用户异常(e)
文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第1718行,在handle\u user\u异常中
重放(exc_类型、exc_值、tb)
文件“/usr/local/lib/python3.8/site packages/flask/_compat.py”,第35行,重新登录
增值
文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第1813行,完整发送请求
rv=自我分派请求()
文件“/usr/local/lib/python3.8/site packages/flask/app.py”,第1799行,在调度请求中
返回self.view_函数[rule.endpoint](**req.view_参数)
文件“/app/calculate.py”,第15行,添加
更新(a、b、ans、“+”)
文件“/app/calculate.py”,第10行,在更新中
请求。获取('http://localhost:3000/update,json={“a”:a,“b”:b,“ans”:ans,“operator”:operator})
文件“/usr/local/lib/python3.8/site-packages/requests/api.py”,第75行,在get中
返回请求('get',url,params=params,**kwargs)
文件“/usr/local/lib/python3.8/site packages/requests/api.py”,请求中的第60行
return session.request(method=method,url=url,**kwargs)
文件“/usr/local/lib/python3.8/site packages/requests/sessions.py”,请求中的第524行
resp=自我发送(准备,**发送)
文件“/usr/local/lib/python3.8/site packages/requests/sessions.py”,第637行,在send中
r=适配器.send(请求,**kwargs)
文件“/usr/local/lib/python3.8/site packages/requests/adapters.py”,第516行,在send中
raise ConnectionError(e,请求=请求)
requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=3000):url:/update超过了最大重试次数(由NewConnectionError引起(':未能建立新连接:[Errno 111]连接被拒绝])
-->
这里,计算服务调用历史记录服务来更新历史记录中的数据
我是新来的码头工人。如何解决此问题?查看您的应用程序配置,它看起来像是
calculation
正在尝试连接到本地主机,端口3000:
HTTPConnectionPool(host='localhost', port=3000)
但当您将其集装箱化时,您将其分配给端口5000:
$ sudo docker run -d -p 0.0.0.0:5000:5000 --name calculation calculation:0.1
计算
正在监听5000,历史
正在监听3000
您的问题中不清楚的是,calculation
是试图在端口3000上与自己对话,还是试图与history
对话。如果它在自言自语,更正端口应该可以修复它。如果它是在谈论历史,那么修复程序就有点复杂:因为这些都是在容器中运行的,所以不能像在单个主机上运行所有内容时那样,使用名称localhost
来引用其他服务。这是因为从容器的角度来看,history
和calculation
是两个独立的主机。因此,要让一个容器与另一个进行通信,您需要使用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失败:对等方重置连接