Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不同docker容器中的微服务之间建立协作?_Python_Linux_Docker_Flask_Microservices - Fatal编程技术网

Python 如何在不同docker容器中的微服务之间建立协作?

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

我有两个使用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'))
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失败:对等方重置连接