Mar*_*k R 25 amazon-web-services docker amazon-ecs
我正在使用 Amazon ECS(Docker 的重新打包),我发现 ECS 似乎没有提供一项 Docker 功能。即,我希望在一个实例中运行多个容器,并将进入 IP 地址 1 的请求映射到容器 1,进入 IP 地址 2 的请求映射到容器 2,等等。
在 Docker 中,将容器绑定到特定 IP 地址是通过以下方式完成的:
docker run -p myHostIPAddr:80:8080 imageName command
Run Code Online (Sandbox Code Playgroud)
但是,在 Amazon ECS 中,似乎没有办法做到这一点。
我已经设置了一个具有多个弹性 IP 地址的 EC2 实例。将容器配置为任务定义的一部分时,可以将主机端口映射到容器端口。但是,与 Docker 不同的是,ECS 不提供将主机 IP 地址指定为映射的一部分的方法。
另一个转折点是我希望来自容器 N 的出站请求具有容器 N 的外部 IP 地址。
有没有办法做到以上所有?
我浏览了 AWS CLI 文档以及适用于 Java 的 AWS 开发工具包。我可以看到 CLI 可以返回一个包含如下元素的 networkBindings 数组:
{
"bindIP": "0.0.0.0",
"containerPort": 8021,
"hostPort": 8021
},
Run Code Online (Sandbox Code Playgroud)
Java SDK 有一个名为 NetworkBinding 的类,表示相同的信息。但是,此信息似乎仅用于输出,以响应请求。我找不到向 ECS 提供此绑定信息的方法。
我想这样做的原因是我想为不同的选区设置完全不同的 VM,在同一个 EC2 实例上可能使用不同的容器。每个 VM 都有自己的 Web 服务器(包括不同的 SSL 证书),以及自己的 FTP 和 SSH 服务。
谢谢。
这是一个实际的、合乎逻辑的方法。这听起来太复杂了,但实际上您可以在几分钟内实现它,而且它确实有效。我实际上正在实施它。
您为每个容器创建一个任务,并为每个任务创建一个服务,并为每个服务创建一个目标组。然后您只需创建 1 个弹性负载均衡器。
基于应用程序的弹性负载均衡器可以根据请求的路径路由请求。使用目标组,您可以将请求路由elb-domain.com/1
到容器 1、elb-domain.com/2
容器 2 等。
现在,您只差一步之遥。创建反向代理服务器。
就我而言,我们使用的是 nginx,因此您可以创建具有任意数量 IP 的 nginx 服务器,并使用 nginx 的反向代理功能将您的 IP 路由到 ELB 的路径,从而将它们相应地路由到正确的容器(s)。如果您使用域,这里有一个示例。
server {
server_name domain1.com;
listen 80;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://elb-domain.com/1;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您实际上是在侦听 IP,则可以省略该server_name
行而只侦听相应的接口。
这实际上比为每个容器分配静态 IP 更好,因为它允许您拥有 docker 机器集群,其中每个“IP”的请求都在该集群上平衡。重新创建机器不会影响静态IP,您不必重做太多配置。
虽然这并不能完全回答您的问题,因为它不允许您使用 FTP 和 SSH,但我认为您永远不应该使用 Docker 来做到这一点,而应该使用云服务器。如果您使用 Docker,那么您应该更新容器本身而不是使用 FTP 或 SSH 更新服务器。但是,对于 HTTP 和 HTTPS,此方法非常有效。
小智 4
一种选择:为每个客户端创建一个 ELB,然后为每个 ELB 分配某些容器。
[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html
归档时间: |
|
查看次数: |
18116 次 |
最近记录: |