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 如何在私有桥接网络中启动容器的主要内容,如果未能解决你的问题,请参考以下文章

docker桥接模式

如何从以 awsvpc 网络模式运行的 ECS 容器中获取我的 IP 地址?

从AWS ECS单独帐户中的私有注册表中提取容器

详解docker桥接网络模型

Docker 容器的网络模式

如何在 AWS ECS 中重启容器?