Amazon ECS(Docker):将容器绑定到特定的IP地址

我正在玩Amazon ECS(重新包装Docker),我发现ECS似乎没有提供一个Dockerfunction。 也就是说,我想在一个实例中运行多个容器,并且请求进入IP地址1映射到容器1,并且请求到达IP地址2映射到容器2等。

在Docker中,通过以下方式将容器绑定到特定的IP地址:

docker run -p myHostIPAddr:80:8080 imageName command 

但是,在Amazon ECS中,似乎没有办法做到这一点。

我已经设置了一个具有多个弹性IP地址的EC2实例。 将容器configuration为任务定义的一部分时,可以将主机端口映射到容器端口。 但是,与Docker不同,ECS不提供将主机IP地址指定为映射的一部分的方法。

额外的麻烦是,我想从容器N出站请求有容器N的外部IP地址。

有没有办法做到以上所有?

我已经浏览了AWS CLI文档以及AWS SDK for Java。 我可以看到CLI可以返回一个包含如下元素的networkBindings数组:

 { "bindIP": "0.0.0.0", "containerPort": 8021, "hostPort": 8021 }, 

而Java SDK有一个名为NetworkBinding的类表示相同的信息。 但是,此信息似乎是仅输出,以响应请求。 我找不到向ECS提供这个绑定信息的方法。

我想这样做的原因是我想为不同的选区设置完全不同的虚拟机,使用不同的容器可能在同一个EC2实例上。 每个虚拟机都有自己的Web服务器(包括不同的SSL证书),以及自己的FTP和SSH服务。

谢谢。

一个选项:为每个客户创build一个ELB,然后为每个ELB分配一定的容器。

[1] http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

这是一个实际的,合乎逻辑的方法。 这听起来太复杂了,但实际上你可以在几分钟之内实现它,而且工作。 实际上,我们正在讲话。

您为每个容器创build一个任务,并为每个任务创build一个服务,并为每个服务configuration一个目标组。 然后你创build一个弹性负载平衡器。

基于应用程序的弹性负载均衡器可以根据请求的path路由请求。 使用目标组,您可以将请求到达elb-domain.com/1请求路由到容器1, elb-domain.com/2 2到容器2等。

现在你只有一步之遥。 创build一个反向代理服务器。

在我的情况下,我们使用nginx,所以你可以创build一个nginx服务器,使用尽可能多的IP,并且使用nginx的反向代理function,你可以将你的IP路由到ELB的path,从而将它们路由到正确的容器(S)。 这是一个例子,如果你使用域。

 server { server_name domain1.com; listen 80; access_log /var/log/nginx/access.log vhost; location / { proxy_pass http://elb-domain.com/1; } } 

当然,如果你真的在监听IP,你可以省略server_name行,只听对应的接口。

这实际上比为每个容器分配一个静态IP更好,因为它允许您拥有docker计算机群集,其中每个“IP”的请求均通过该群集进行平衡。 重新创build一台机器不会影响静态IP,您不必重做很多configuration。

虽然这并不能完全回答你的问题,因为它不会允许你使用FTP和SSH,但我认为你不应该使用Docker来做到这一点,而应该使用云服务器。 如果您使用的是Docker,那么您应该更新容器本身,而不是使用FTP或SSH更新服务器。 但是,对于HTTP和HTTPS,此方法完美无缺。