【问题标题】:Exposing multiple ports from Docker within Elastic Beanstalk在 Elastic Beanstalk 中从 Docker 公开多个端口
【发布时间】:2014-11-07 20:56:57
【问题描述】:

通过阅读 AWS 文档,似乎在使用 Docker 作为 Elastic Beanstalk (EB) 上的平台(与 Tomcat 等相对)时,只能公开一个端口。我试图理解为什么亚马逊会创建这个限制——似乎你现在甚至不能同时提供 HTTP 和 HTTPS。

我想使用 Docker 作为容器,因为它允许我在同一个容器中运行多个互连的服务器进程,其中一些需要多个端口(例如 RTSP)。这种应用程序是否有任何解决方法,比如 RTSP 和 HTTP 服务器都可以在 EB 上的同一个 Docker 容器中运行?

【问题讨论】:

    标签: docker amazon-elastic-beanstalk


    【解决方案1】:

    尽管没有任何文档解释,单容器 Docker 环境确实支持映射多个端口

    {
        "AWSEBDockerrunVersion": "1",
        "Ports": [
            {
                "ContainerPort": "8080"
            },
            {
                "HostPort": "9000",
                "ContainerPort": "8090"
            }
        ]
    }
    

    通过以上配置,docker 的 8080 端口将映射到主机的 80 端口,docker 的 8090 端口将映射到主机的 9000 端口。

    为了更清楚,列表中的第一个端口将被映射到主机的端口 80,其余的将被映射到指定的 hostPort(或)与没有主机端口的容器端口相同。

    【讨论】:

    • 这是正确答案!标记为“正确”的答案仅涉及提供必要的基础架构更改(安全组规则、侦听器)以确保任何其他端口的可访问性。
    • 谢谢!在本地,如何使用eb local run与多个端口?
    • 所以我按照上面的,但是第二个端口没有暴露。我还需要做负载均衡器吗?而不是上面的?
    • @robert-moskal 这只会将 docker 端口映射到主机的端口。要将主机的端口暴露给外部世界,您需要遵循安全组配置
    • @Prabu 非常感谢您的回答和评论。经过数小时的搜索,我偶然发现了这个答案,解决方案实际上非常简单。
    【解决方案2】:

    您可以为 Elastic Beanstalk 的 LoadBalancer/ReversProxy 编写一个启动配置文件,以将其他端口转发到其 EC2 实例。来自Ben Delarre 的示例:

    "Resources" : {
      "AWSEBLoadBalancerSecurityGroup": {
        "Type" : "AWS::EC2::SecurityGroup",
        "Properties" : {
          "GroupDescription" : "Enable 80 inbound and 8080 outbound",
          "VpcId": "vpc-un1que1d",
          "SecurityGroupIngress" : [ {
            "IpProtocol" : "tcp",
            "FromPort" : "80",
            "ToPort" : "80",
            "CidrIp" : "0.0.0.0/0"
          }],
          "SecurityGroupEgress": [ {
            "IpProtocol" : "tcp",
            "FromPort" : "8080",
            "ToPort" : "8080",
            "CidrIp" : "0.0.0.0/0"
          } ]
        }
      },
      "AWSEBLoadBalancer" : {
        "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
        "Properties" : {
          "Subnets": ["subnet-un1que1d2"],
          "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "8080",
            "Protocol" : "HTTP"
          } ]
        }
      }
    }
    

    参考:

    【讨论】:

    • 此示例打开负载均衡器上的端口 80 并代理到实例上的端口 8080。它不会公开多个实例端口。即使这样做了,将请求转发到 docker 的实例上的反向代理也无法侦听多个端口。
    • 这只是一个关于如何在 Elastic Beanstalk 实例的 init 上配置负载均衡器的示例。至少根据 aws docs 和 aws console ,反向代理可以侦听和转发多个端口。在 docker 中公开多个端口后,您需要的是在示例的基础上构建并允许反向代理侦听和转发所需的任何端口。
    • 只需在 docker 中公开端口,然后在 .ebextensions 中创建包含负载均衡器设置的配置文件
    • 但它不仅仅是负载均衡器。对于 docker,beantalk 还在实例上设置了一个本地代理,将流量转发到 docker 容器。你在 beanstalk 上成功配置了多个端口的 docker 容器吗?
    • 我觉得这个例子不是特别清楚。最好说明 OP 的要求,即显示如何在该配置文件中设置 443 和 80。因此,对这个答案的投票很低,但对问题的投票很高。
    【解决方案3】:

    在目前的形式中,Elastic Beanstalk 中的 Docker 支持充其量只是微不足道的。 FWIW 我写了a blog post 评估涉及此问题的 EB。我发现除了你对端口的观察之外,不可能运行多个容器,甚至不能自定义docker run 命令。希望他们能在未来的更新中提供支持。

    【讨论】:

    • 如果/何时添加,是否有推荐的方法来了解此问题?
    • 我喜欢关注 Jeff Barr's blog 以获取 AWS 更新。
    • 根据docs:“您可以指定多个容器端口,但 AWS Elastic Beanstalk 仅使用第一个端口将您的容器连接到主机的反向代理并路由来自公共 Internet 的请求。”
    • 现在是否可以通过部署多个 docker 容器并使用端口映射来绕过?
    • @Vinay 我可以确认 Dockerrun.aws.json 文件中的多个 docker 容器配置和端口映射有效。
    猜你喜欢
    • 2015-02-13
    • 2015-04-16
    • 2020-08-26
    • 2017-07-28
    • 2015-03-07
    • 2019-11-14
    • 2020-07-23
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多