python - Angular 节点与 docker 内的 python 后端通信失败

标签 python angular amazon-web-services docker

我有一个使用 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/

相关文章:

Python 将 unicode 减号转换为 float

python - 从与外键相关的模型中获取数据

angular - Vs Code nx 控制台生成命令不起作用 : This command has no flags to set

子组件中的 Angular @Input 也会更新父组件中的值

amazon-web-services - 使用 CloudFormation 在缓存行为中设置 "Allowed HTTP Methods"

python - 使用 Python 自动比较 Word 文档

python - 什么时候应该使用 HStoreField 而不是 JSONField?

.net - 是否可以使用 AWS Elastic Beanstalk 部署到现有的 EC2 实例? 。网

Angular2 AoT - 不支持表达形式

amazon-web-services - 如何在Elastic beantalk docker json中定义多个任务