多容器 docker (AWS) link 是单向的?

Multicontainer docker (AWS) link is one-way?

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

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

我的 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,我会收到这样或那样的 "Bad Address" 错误。在这些容器上的服务器 运行 中以及使用 wget 直接从容器本身都是如此。尝试不同的暴露端口时也是如此。

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

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

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

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

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

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

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

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

    {
      "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 可能不是必需的,但我仍在解决所有问题。