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

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

我正在使用 Amazon ECS(Docker 的重新打包版本),我发现 ECS 似乎没有提供一项 Docker 功能。也就是说,我希望在一个实例中运行多个容器,并将进入 IP 地址 1 的请求映射到容器 1,将进入 IP 地址 2 的请求映射到容器 2,依此类推。

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

docker run -p myHostIPAddr:80:8080 imageName command

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

我已经设置了一个具有多个弹性 IP 地址的 EC2 实例。在将容器配置为任务定义的一部分时,可以将主机端口映射到容器端口。但是,与 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 服务。

谢谢。

答案1

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

您为每个容器创建一个任务,为每个任务创建一个服务,并为每个服务创建一个目标组。然后,您只需创建 1 个 Elastic Load Balancer。

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

现在你只差一步了。创建一个反向代理服务器。

在我的例子中,我们使用的是 nginx,因此您可以创建一个具有任意多个 IP 的 nginx 服务器,然后使用 nginx 的反向代理功能,您可以将 IP 路由到 ELB 的路径,从而将它们路由到正确的容器。如果您使用域,则这是一个示例。

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”的请求在该集群上都是平衡的。重新创建机器不会影响静态 IP,您不必重新进行大量配置。

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

答案2

一种选择:为每个客户端创建一个 ELB,然后为每个 ELB 分配某些容器。

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

答案3

您无法访问容器本身,但您可以创建一个专用于特定容器的 EC2 实例。然后,当您需要访问该服务时,您可以引用运行该容器的 EC2 主机。

  • 根据此要求为您的服务创建专用集群
  • 创建 AMI 优化的 EC2 实例使用您首选的实例类型
    • 请务必使用该指南中所述的 UserData 选项将该实例分配给上述集群。
  • 使用以下代码创建 TaskDefinition网络模式设置为“桥接”(与你的桌面相同)
  • 使用以下内容创建服务定义:
    • LaunchType 设置为 EC2
    • 集群设置为您上面创建的集群
    • 任务定义设置为您上面创建的任务定义
  • 按照通常的方式将任何安全组分配给 EC2 实例。

尽管您仍直接与 EC2 实例通信,但您可以像控制 EC2 实例一样(间接)控制容器的 IP。这免除了您在“裸机”上运行服务的麻烦,让您可以更轻松地管理和配置服务及其中的配置。

相关内容