【发布时间】:2020-05-30 11:17:49
【问题描述】:
背景
我按照本教程https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-cli-tutorial-ec2.html,编写了一个 docker compose 文件,创建了一个网站 A(由 4 个容器组成)并运行为我的一个客户端提供服务。
但是,现在我有另一个客户,我需要使用与上述类似的策略来托管另一个网站 B。
问题和疑虑
- 网站 A 现在位于我唯一集群下 EC2 中的一项服务中,我可以使用相同的 EC2 实例并运行网站 B(作为 EC2 的另一项服务)吗?
- 如果是这样,如何管理端口/入站/出站流量?现在A网站已经占用了EC2实例的80、443、27017和3002端口用于入站流量,如果B网站的容器也运行在同一个EC2实例中,我还可以为B网站使用80、443、27017和3002端口吗?已阅读 ALB (Amazon Load Balancer) 的文档,似乎可以满足要求,我是否走在正确的轨道上?
- 还有域名,通过路由53,我注册了一个域名www.websiteA.com来服务第一个网站,我还注册了另一个www.websiteB.com准备服务网站B,我猜我需要配置指向同一个 EC2 IP 的新域 B?
- 我在部署B网站的过程中,不想影响A网站的可用性,可以在部署B网站的容器的过程中维护吗?
我想在开始部署网站B之前清除所有概念,感谢您的帮助,谢谢
后续行动
我决定使用 AWS 应用程序负载均衡器来解决我的问题,并进行以下配置设置。
我设置了一个负载均衡器,它使用传入端口 80 的 HTTP 协议侦听请求,只要有用户访问 Web 服务器(即:前端容器),侦听器就会将该请求转发到目标组(即:http-端口 80 访问)
这是包含注册目标(当前运行容器的我的 ec2 实例)的目标组(http-port-80-access),容器的主机端口是 32849,而相关的负载均衡器(web -access-load-balancer) 用于动态端口映射。
我还在默认规则之上又配置了 1 条规则,每当用户访问 websiteA 的 url 时,负载均衡器都会将请求转发到目标组(http-port-80-access)。
一切就绪,健康测试也通过了。然后,我使用以下ecs-cli compose service up 命令将负载均衡器与服务连接起来
ecs-cli compose --file ./docker-compose-aws-prod.yml --cluster my-ecs-cluster-name --ecs-profile my-ecs-profile --cluster-config my-cluster --project-name my-project --ecs-params ./ecs-params.yml service up --target-group-arn arn:aws:elasticloadbalancing:us-east-2:xxxxxxxxx:targetgroup/http-port-80-access/xxxxxxxx --container-name frontend --container-port 80
其中frontend是网站A的前端容器的服务名称
但是,当我通过浏览器访问 www.websiteA.com 时,除了 ERR_CONNECTION_REFUSED 之外什么都没有,访问 www.websiteA.com:32849 确实可以访问,但这不是我想要的。
我在想是哪部分配置错了
【问题讨论】:
-
流量如何路由到您的容器?你是直接去EC2实例的IP吗?你在使用 ALB 吗?
-
你可以考虑使用virtual hosts。
-
@JasonWadsworth 是的,用户目前正在通过域名网站A(通过EC2实例的直接IP)访问网站A。而且我还没有使用 ALB,因为我不知道 ALB 是正确的选择
-
@JohnRotenstein 是的,我在搜索过程中还发现虚拟主机是解决方案之一,但在我的情况下应该如何实现呢? AFAIK,我应该在网站 A 和网站 B 之前构建具有虚拟主机设置的服务器,将 EC2 IP 映射到该服务器以通过虚拟主机配置路由到不同的容器?换句话说,我需要创建另一个 docker 容器(可能是 nginx 服务器)来接收请求,配置虚拟主机并将 EC2 IP 定向到 nginx 服务器?
标签: amazon-web-services docker amazon-ec2 amazon-ecs