Docker-compose:Docker容器无法使用服务名称进行连接

时间:2020-05-23 20:41:29

标签: docker flask networking docker-compose

我有3个容器。一个是提供静态内容()的lighttpd服务器。我有2个烧瓶服务器处理后端(模型

这是我的docker-compose.yml

curl: (52) Empty reply from server

我正在尝试从前端( front )向我的烧瓶服务器( back )发送一个http请求。我已将Flask服务器绑定到0.0.0.0,甚至在前端(http://back:5000/endpoint)中使用了服务名称

尝试将前端服务器内的flask服务器卷曲( curl back:5000 )会给我以下信息:

{{1}}

从前端容器内部对Flask服务器执行Ping操作。这意味着必须已建立连接。

为什么我不能从前端连接到我的Flask服务器?

1 个答案:

答案 0 :(得分:1)

我们在评论中发现了几件事。首先,您遇到了代理问题,导致一个容器无法在另一个容器中使用API​​。

其次,也是至关重要的是,您发现Docker Compose配置文件中的服务名称在Docker设置的虚拟网络系统中可用。因此,您可以从front ping back,然后 vice-versa 。重要的是,值得注意的是您可以执行此操作,因为它们位于同一虚拟网络mynet中。如果它们位于不同的Docker网络上,则根据设计,DNS名称将不可用,并且虚拟容器IP地址将无法访问。

顺便说一句,由于您的所有容器都在同一个网络上,并且尚未更改任何网络设置,因此暂时可以删除该网络。换句话说,您可以删除networks定义和对它的三个容器引用,因为它们可以直接加入默认网络。

第三,您了解到Docker的虚拟DNS条目在主机上不可用,因此frontback在此处不可用。即使有(例如,如果在hosts文件中进行了手动输入),这些IP也将不起作用,因为没有从主机到容器的直接联网路由。

相反,这些容器由Docker设备公开,该设备代理从自定义localhost端口到这些容器(在您的情况下为4200、5000和5001)的连接。

一个好的临时解决方案是将您的前端加载到http://localhost:4200,并将其API地址硬连接为http://localhost:5000。不过,您可能会遇到一些CORS问题,因为浏览器会将它们视为不同的服务器。

此外,如果上线了,您的移动网络和公司防火墙可能会遇到一些问题-您可能希望前端应用程序位于端口443上,但是由于它是一台单独的服务器,因此您要么需要一个不同的IP API的地址,因此它也可以继续使用443,否则您将需要使用其他端口。一个干净的解决方案是在两个容器的前面放置一个前端代理,然后在Docker中公开该代理。这会将HTTP请求从外部发送到正确的容器,具体取决于您设置的过滤条件。我为此建议使用Traefik,但是毫无疑问,还有其他几种方法。