AWS ECS 如何在私有桥接网络中启动容器
Posted
技术标签:
【中文标题】AWS ECS 如何在私有桥接网络中启动容器【英文标题】:AWS ECS how to launch containers in private bridge network 【发布时间】:2020-01-12 03:51:11 【问题描述】:如何让 docker 自动服务发现在基于 AWS ECS EC2 的集群服务中工作?
我有这个对应的docker-compose.yml
(我将其映射到与 ECS 兼容的task-definition.json
文件):
version: "3"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:6.2.2
environment:
- discovery.type=single-node
mongo:
image: mongo:4.0.12
redis:
image: redis:5.0.3
api:
image: api
build: .
command: api.py
depends_on:
- elasticsearch
- mongo
- redis
ports:
- 5000:5000
如果我使用docker-compose up
docker-composer 启动它,将创建一个新的私有桥接网络。在此专用网络中,“自动服务发现”已开启,服务名称解析为服务 IP 地址。例如,api 可以在不知道其 IP 的情况下通过 DNS 查找“mongo”来找到 mongo。该网络也与其他不相关的容器隔离。您也可以像这样通过docker
手动执行此操作:
docker network create api-net
docker run -d --name elasticsearch --net api-net docker.elastic.co/elasticsearch/elasticsearch:6.2.2
docker run -d --name mongo --net api-net mongo:4.0.12
...
但我不知道如何通过使用task-definition.json
文件定义的 AWS ECS 多容器服务来实现相同的目标。如果我使用“桥”网络定义多个服务,所有容器都会启动到默认的桥网络中,并且自动服务发现不起作用。我可以手动登录ECS EC2容器实例并设置私有网络,但显然不是一个可行的解决方案。
【问题讨论】:
我也有同样的问题。你找到解决办法了吗? 还没有。这里的一个答案表明(但没有提供足够好的背景以达到 100%)您无法摆脱 ECS 中的默认桥 NW :/. 【参考方案1】:你需要使用:
"links": ["name:internalName", ...]
在Network Settings
下查看更多here
另请参阅此说明:
重要
并置在单个容器实例上的容器可能是 无需链接或主机即可相互通信 端口映射。在容器实例上实现网络隔离 使用安全组和 VPC 设置。
【讨论】:
刚刚测试过。 DNS 以某种方式工作,但 ECS 绝对没有创建新的私有 docker 网络。你知道这是否可能。这将避免我认为的“重要”注释问题。 只需在我上面添加的链接中搜索“网络模式”我不确定这是否可能,在专用网络上看不到任何内容。但你为什么需要它们? 隔离是主要原因。我想我可以只使用 DNS。 如注释:Network isolation is achieved on the container instance using security groups and VPC settings.
是的,但是通过 docker 做这件事听起来要复杂得多。我得试试看。以上是关于AWS ECS 如何在私有桥接网络中启动容器的主要内容,如果未能解决你的问题,请参考以下文章