多容器 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
的请求的子集,它工作得很好。但是,如果我尝试以其他方式发送请求,从 secondContainer
到 http://firstContainer:8080
,我会收到这样或那样的 "Bad Address" 错误。在这些容器上的服务器 运行 中以及使用 wget
直接从容器本身都是如此。尝试不同的暴露端口时也是如此。
如果我将 "firstContainer"
添加到第二个容器的 Dockerrun 文件的 "links"
字段,我会得到一个错误。
我的本地设置,使用docker-compose,完全没有这个问题。
有人知道这是什么原因吗?如何在 AWS 多容器部署中获得对称的可发现性?
我收到了 AWS 支持部门关于该主题的回复。
链接确实是单向的,这是一个不幸的限制。他们建议采用以下两种方法之一:
- 使用共享文件系统并将容器的 IP 地址写入文件,然后您的应用程序可以使用该文件访问容器。
- 使用 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
可能不是必需的,但我仍在解决所有问题。
我在 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
的请求的子集,它工作得很好。但是,如果我尝试以其他方式发送请求,从 secondContainer
到 http://firstContainer:8080
,我会收到这样或那样的 "Bad Address" 错误。在这些容器上的服务器 运行 中以及使用 wget
直接从容器本身都是如此。尝试不同的暴露端口时也是如此。
如果我将 "firstContainer"
添加到第二个容器的 Dockerrun 文件的 "links"
字段,我会得到一个错误。
我的本地设置,使用docker-compose,完全没有这个问题。
有人知道这是什么原因吗?如何在 AWS 多容器部署中获得对称的可发现性?
我收到了 AWS 支持部门关于该主题的回复。
链接确实是单向的,这是一个不幸的限制。他们建议采用以下两种方法之一:
- 使用共享文件系统并将容器的 IP 地址写入文件,然后您的应用程序可以使用该文件访问容器。
- 使用 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
可能不是必需的,但我仍在解决所有问题。