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


24

我在玩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文档以及适用于Java的AWS开发工具包。我可以看到CLI可以返回包含如下元素的networkBindings数组:

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

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

我要执行此操作的原因是,我想为同一用户使用可能在同一EC2实例上使用的不同容器为不同的用户设置完全不同的VM。每个VM都有自己的Web服务器(包括不同的SSL证书),以及自己的FTP和SSH服务。

谢谢。


我的工作流程存在相同的问题。aws ecs describe-container-instances似乎没有帮助。他们似乎真的想促使您使用ELB,对我们而言,这是愚蠢的。
2015年

现在似乎有一种方法可以做到这一点(2017年第四季度):stackoverflow.com/a/46577872/6309
VonC

Answers:


4

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

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


13
加油!一个ELB每月18美元。现在,谁想要带有ECS的微服务?aws.amazon.com/elasticloadbalancing/pricing

1
@Knots,我们有同样的问题。然后,我们切换到Lambda + API网关,成本降至10美分。
grepe

现在,您可以为所有服务使用单个ALB(而不是传统的ELB),而不是每个服务使用1。它们需要位于不同的主机名或主机名的不同路径上。
AJ布朗

4

这是一种实际的,合乎逻辑的方法。听起来太复杂了,但是您实际上可以在几分钟内实现它,并且可以正常工作。正如我们所说的,我实际上正在实施它。

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

基于应用程序的弹性负载均衡器可以根据请求的路径路由请求。使用目标组,您可以将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;
    }
}

当然,如果您实际上正在收听IP,则可以省略server_name线路,而只收听相应的接口。

实际上,这比为每个容器分配静态IP更好,因为它允许您拥有docker计算机集群,在该集群中,每个“ IP”的请求在该集群上达到平衡。重新创建计算机不会影响静态IP,并且您无需重做太多配置。

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


1

您不能使用容器本身,但是可以使EC2实例专用于特定的容器。然后,在需要访问该服务的位置,可以引用运行该容器的EC2主机。

  • 满足此要求的服务专用集群
  • 使用首选实例类型 创建AMI优化的EC2实例
    • 请确保按照该指南中的说明使用UserData选项将该实例分配给上述群集。
  • 创建一个TaskDefinition,并将NetworkMode设置为“ bridge”(与您的桌面相同)
  • 使用以下内容创建服务定义:
    • LaunchType设置为EC2
    • 群集设置为您在上面创建的群集
    • 任务定义设置为您在上面创建的任务定义
  • 否则,将所有安全组分配给EC2实例。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.