多容器泊坞窗(AWS)链接是单向的吗?

Posted

技术标签:

【中文标题】多容器泊坞窗(AWS)链接是单向的吗?【英文标题】:Multicontainer docker (AWS) link is one-way? 【发布时间】:2018-10-01 06:51:31 【问题描述】:

我通过 AWS 上的多容器 docker 获得了不对称的容器可发现性。即第一个容器可以找到第二个,但是第二个找不到第一个。

我在 AWS Elastic Beanstalk 上部署了多容器 docker。两个容器都使用相同的初始代码运行 Node 服务器,并使用相同的 Dockerfile 构建。一切都是最新的。

我的 Dockerrun.aws.json 文件的匿名版本:


  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    
      "name": "firstContainer",
      "image": "firstContainerImage",
      "essential": true,
      "memoryReservation":196,
      "links":[
        "secondContainer",
        "redis"
      ],
      "portMappings":[
        
          "hostPort":80,
          "containerPort":8080
        
      ]
    ,
    
      "name": "secondContainer",
      "image": "secondContainerImage",
      "essential": true,
      "memoryReservation":196,
      "environment":
      "links":[
        "redis"
      ]
    ,
    
      "name": "redis",
      "image": "redis:4.0-alpine",
      "essential": true,
      "memoryReservation":128
    
  ]

firstContainer 通过地址http://secondContainer:8080 将请求子集代理到端口 8080 上的secondContainer,这完全可以正常工作。但是,如果我尝试以另一种方式发送请求,从secondContainerhttp://firstContainer:8080,我会收到某种“错误地址”错误。无论是在这些容器上运行的服务器中,还是使用wget 直接从容器本身中都是如此。尝试不同的暴露端口时也是如此。

如果我将 "firstContainer" 添加到第二个容器的 Dockerrun 文件的 "links" 字段,我会收到错误消息。

我的本​​地设置,使用 docker-compose,完全没有这个问题。

有人知道这是什么原因吗?如何在 AWS 多容器部署中获得对称可发现性?

【问题讨论】:

【参考方案1】:

我收到了 AWS 支持部门关于该主题的回复。

链接确实是单向的,这是一个不幸的限制。他们建议采用以下两种方法之一:

    使用共享文件系统并将容器的 IP 地址写入文件,然后您的应用程序可以使用该文件来访问容器。 使用 AWS Faragate 服务并使用 ECS Service Discovery 服务,该服务可让您自动为任务创建 DNS 记录并使其可在您的 VPC 中发现。

我选择了第三种方法,即让可以发现其余部分的容器发送 ping 以通知其他容器其 docker-network IP 地址。

【讨论】:

感谢您的洞察力,我偶然发现了完全相同的问题。我们选择了解决方案 1):定义一个共享卷,每个服务将其 ip 地址写入一个以其服务名称命名的文件中。其他服务从他们想要连接的服务中读取这些文件。 @fheyer 这是一个很棒的方法!【参考方案2】:

我正在探索另一种选择,它是链接、端口映射和额外主机的组合。

    
      "name": "grafana",
      "image": "docker.pkg.github.com/safecast/reporting2/grafana:latest",
      "memoryReservation": 128,
      "essential": true,
      "portMappings": [
        
          "hostPort": 3000,
          "containerPort": 3000
        
      ],
      "links": [
        "renderer"
      ],
      "mountPoints": [
        
          "sourceVolume": "grafana",
          "containerPath": "/etc/grafana",
          "readOnly": true
        
      ]
    ,
    
      "name": "renderer",
      "image": "grafana/grafana-image-renderer:2.0.0",
      "memoryReservation": 128,
      "essential": true,
      "portMappings": [
        
          "hostPort": 8081,
          "containerPort": 8081
        
      ],
      "mountPoints": [],
      "extraHosts": [
        
          "hostname": "grafana",
          "ipAddress": "172.17.0.1"
        
      ]
    

这允许 grafana 像往常一样通过链接解析 renderer,但渲染器容器将 grafana 解析为主机 IP(172.17.0.1 默认 docker 网桥网关),其端口 3000 绑定回 grafana 端口。

到目前为止,它似乎有效。渲染器上的portMappings 可能不是必需的,但我仍在解决所有问题。

【讨论】:

以上是关于多容器泊坞窗(AWS)链接是单向的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 应用服务泊坞窗容器“服务不可用”

泊坞窗容器怎样才能在没有主机操作系统的安装份额完全访问Windows共享?

从容器内部构建并推送泊坞窗图像

Elastic Beanstalk 泊坞窗错误

如何优雅地分离无限睡眠泊坞窗以及为啥

CircleCI 自动增量泊坞窗标签