我有一个使用 Node 托管的 Angular 应用程序,并且还有一个用于其他 Python 操作的 Python Flask 后端。由于它们是 2 个独立的模块,因此我为 Node+Angular 和 Python Flask 创建了单独的 docker 镜像。为了隔离,我还为这些容器使用了 docker 网络。
我已经构建了图像并使用以下命令启动了容器:
docker container run -d -p 5000:5000 --network reporter-net --name backend backend-server
docker container run -d -p 3000:3000 --network reporter-net --name frontend frontend-server
但是从前端,我一直在使用 url 调用后端
http://backend:5000
主要是因为我认为通信是从节点容器到这个 python 后端发生的。我还尝试使用此 url http://backend:5000 调用 python 后端它工作没有任何问题。
部署此架构后,无法与后端通信。后来我从同事那里了解到,在运行时,Angular代码会被下载到浏览器,然后浏览器直接调用Python后端。
这样的话,显然浏览器无法识别http://backend:5000 。当我尝试将其替换为 http://localhost:5000 时,它工作了(都在一台机器上)。
但是在生产环境中运行时如何解决这个问题呢?因为在生产中,Python 容器可能位于不同的服务器上,就像在微服务中一样。因此,获取 python 后端的服务器 IP 可能很困难,并且在构建镜像之前也需要它。
还有其他简单的解决方案吗?是我想太多了吗?我还考虑在后端服务器(在生产中)前面使用 ALB,以便我们可以使用 http://:5000 构建前端图像,并将请求重定向到任何 http://backend:5000 。
寻找解决方案。
最佳答案
如果您计划同时在多个服务器上运行 Python 容器以进行扩展,那么您的最佳选择是 ALB。
如果您计划每个 EC2 实例仅运行一个容器实例,则可以同时使用 ALB 和 CLB。但是,如果您计划在单个 EC2 实例上运行这些容器的多个实例,那么您将需要动态端口映射功能,该功能是 ECS 服务的一部分,以便您的 ALB(在这种情况下 CLB 不是一个选项)可以发现您的容器。其目标组的端口(因为您无法对它们进行硬编码)。即使您不打算在同一个 EC2 实例上运行同一容器的多个副本,我仍然建议使用 ECS 服务,因为它可以为您解决很多问题。
然后,您可以使用负载均衡器的公共(public) DNS 名称作为端点,从 Angular 应用程序进行调用,不会出现任何问题。
我不会依赖通过 IP 来管理连接。即使您已经运行了 EC2 实例并且检索了它们的 IP,如果这些实例中的任何一个停止并启动,其公共(public) IP 也会被释放,您将在启动时获得一个新的 IP。您可能在这里使用弹性 IP,但这是您需要关心的另一件事。当我们谈论容器化时,或者更准确地说,在单个虚拟主机上运行同一容器的多个副本时,情况会变得更糟。
关于python - Angular 节点与 docker 内的 python 后端通信失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54340400/