多容器泊坞窗(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
,这完全可以正常工作。但是,如果我尝试以另一种方式发送请求,从secondContainer
到http://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)链接是单向的吗?的主要内容,如果未能解决你的问题,请参考以下文章