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

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 服务。

谢谢。

The*_*gat 5

这是一个实际的、合乎逻辑的方法。这听起来太复杂了,但实际上您可以在几分钟内实现它,而且它确实有效。我实际上正在实施它。

您为每个容器创建一个任务,并为每个任务创建一个服务,并为每个服务创建一个目标组。然后您只需创建 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

  • 嘉庆!一个 ELB 每月 18 美元。现在,谁想要 ECS 的微服务?https://aws.amazon.com/elasticloadbalancing/pricing/ (15认同)