让容器在 Elastic Container Service (ECS) 中相互通信?

Getting containers to talk to each other in Elastic Container Service (ECS)?

我正在使用 AWS 和弹性容器服务 (ECS)。我有 6 个服务,每个 运行 都在自己的容器中,需要相互通信才能工作。

当我在我的本地机器上执行 'docker-compose' 时,每个服务都在自己的容器中启动,并使用 docker 给它的默认名称作为主机名。我可以使用 'registration-service' 容器中的主机名 'database' 访问数据库容器,依此类推:

PORTS                    NAMES
0.0.0.0:8901->8901/tcp   common_authenticationservice_1
0.0.0.0:8888->8888/tcp   common_configserver_1
0.0.0.0:5555->5555/tcp   common_zuulserver_1
0.0.0.0:8761->8761/tcp   common_eurekaserver_1
0.0.0.0:8082->8082/tcp   common_registrationservice_1
0.0.0.0:5432->5432/tcp   common_database_1

当我使用 'ecs-cli compose' 部署到 ECS 时,服务无法在 EC2 实例中找到彼此。 'registration-service' 查找主机名 'database' 但找不到,与其他人一样:

PORTS                    NAMES
0.0.0.0:8888->8888/tcp   ecs-common-41-configserver-fa98a8edd6fabfd98f01
0.0.0.0:5432->5432/tcp   ecs-common-41-database-9e95dfb9d591e1d2f101
0.0.0.0:8901->8901/tcp   ecs-common-41-authenticationservice-92c4e6b7f5f49dcf0500
0.0.0.0:8082->8082/tcp   ecs-common-41-registrationservice-c4e384f7f39581a28901
0.0.0.0:8761->8761/tcp   ecs-common-41-eurekaserver-9eb6bc89ebf79ba50200
0.0.0.0:5555->5555/tcp   ecs-common-41-zuulserver-be8ff59cc0eee2965400

据我了解,我需要能够识别我所有容器的东西,让它们注册并检查它们的健康状况。理想情况下,此解决方案会为我提供一个主机名,我可以将其用于每项服务(以及我想要扩展的任何相同服务)并将 DNS 请求路由到这些服务之一。

我尝试在我的 ECS 集群上使用 'service discovery' 功能创建服务,但它要求指向我的一个容器,然后抱怨它们使用相同的端口并拒绝启动.也许这不是我想的那样?

这是我的 docker-ECS 组合文件:

version: "3"
services:
  eurekaserver:
     container_name: eurekaserver
     image:   294417223953.dkr.ecr.us-east-1.amazonaws.com/eureka-server:latest
     ports:
         - "8761:8761"

  configserver:
      image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/configuration-server:latest
      ports:
         - "8888:8888"
      environment:
         EUREKASERVER_PORT: 8761
         EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
         ENCRYPT_KEY:       "IMSYMMETRIC"
  zuulserver:
      image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/johncarnell/tmx-zuulsvr:chapter7
      ports:
        - "5555:5555"
      environment:
        PROFILE: "default"
        SERVER_PORT: "5555"
        CONFIGSERVER_PORT: 8888
        EUREKASERVER_PORT: 8761
        CONFIGSERVER_URI: "http://configserver:8888"
        EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
  database:
      image: postgres:9.5
      ports:
        - "5432:5432"
      environment:
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=******
        - POSTGRES_DB=practicejournal

  registrationservice:
      image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/registration-service:latest
      ports:
        - "8082:8082"
      environment:
        PROFILE: "default"
        SERVER_PORT: "8082"
        ES_PORT:           9200
        DATABASE_PORT:     5432
        CONFIGSERVER_PORT: 8888
        EUREKASERVER_PORT: 8761
        AUTHSERVER_PORT:   8091
        CONFIGSERVER_URI: "http://configserver:8888"
        EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
        AUTHSERVER_URI:   "http://authenticationservice:8901/auth/user"
        ENCRYPT_KEY:       "IMSYMMETRIC"

  authenticationservice:
      image: 294417223953.dkr.ecr.us-east-1.amazonaws.com/authentication-service:latest
      ports:
        - "8901:8901"
      environment:
        PROFILE: "default"
        SERVER_PORT: "8901"
        DATABASE_PORT:     5432
        CONFIGSERVER_PORT: 8888
        EUREKASERVER_PORT: 8761
        CONFIGSERVER_URI: "http://configserver:8888"
        EUREKASERVER_URI: "http://eurekaserver:8761/eureka/"
        ENCRYPT_KEY:       "IMSYMMETRIC"

此外,我有一个脚本在启动后立即在 docker 容器上运行。最终,这个脚本启动了 Java 微服务:

#!/bin/sh

echo "********************************************************"
echo "Waiting for the eureka server to start on port $EUREKASERVER_PORT"
echo "********************************************************"
while ! `nc -z eurekaserver  $EUREKASERVER_PORT`; do sleep 3; done
echo "******* Eureka Server has started"

echo "********************************************************"
echo "Waiting for the database server to start on port $DATABASE_PORT"
echo "********************************************************"
while ! `nc -z database $DATABASE_PORT`; do sleep 3; done
echo "******** Database Server has started "

echo "********************************************************"
echo "Waiting for the configuration server to start on port $CONFIGSERVER_PORT"
echo "********************************************************"
while ! `nc -z configserver $CONFIGSERVER_PORT`; do sleep 3; done
echo "*******  Configuration Server has started"

echo "********************************************************"
echo "Starting Organization Service                           "
echo "********************************************************"
java -Djava.security.egd=file:/dev/./urandom -Dserver.port=$SERVER_PORT   \
     -Deureka.client.serviceUrl.defaultZone=$EUREKASERVER_URI             \
     -Dspring.cloud.config.uri=$CONFIGSERVER_URI                          \
     -Dspring.profiles.active=$PROFILE                                   \
     -Dsecurity.oauth2.resource.userInfoUri=$AUTHSERVER_URI               \
     -jar /usr/local/registrationservice/@project.build.finalName@.jar

这不可能是一个独特的问题。我错过了什么吗?什么 AWS 解决方案可以帮助我在 ECS 中注册容器、在它们之间路由请求并检查它们的运行状况,我该如何设置?

1: 我看到从容器 A 连接到容器 B 容器应该有一个名称。 2:依赖于容器A的容器B应该有Link个容器A。 3:在你的情况下,Container Configserver 依赖于 Eurekaserver。所以Configserver中应该有一个Eurekaserver的link。 4:应该指定唯一的容器名称,以便其他容器可以使用它与他们交谈。 5:我已经更新了 docker-compose 文件,请检查它,如果有任何问题请告诉我。

version: '3'
services:
    eurekaserver:
        container_name: eurekaserver
        image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/eureka-server:latest'
        ports:
            - '8761:8761'
    configserver:
        container_name: configserver
        image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/configuration-server:latest'
        ports:
            - '8888:8888'
        environment:
            EUREKASERVER_PORT: 8761
            EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
            ENCRYPT_KEY: IMSYMMETRIC
        links:
            - eurekaserver
    zuulserver:
        container_name: zuulserver
        image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/johncarnell/tmx-zuulsvr:chapter7'
        ports:
            - '5555:5555'
        environment:
            PROFILE: default
            SERVER_PORT: '5555'
            CONFIGSERVER_PORT: 8888
            EUREKASERVER_PORT: 8761
            CONFIGSERVER_URI: 'http://configserver:8888'
            EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
        links:
            - eurekaserver
            - configserver
    database:
        container_name: database
        image: 'postgres:9.5'
        ports:
            - '5432:5432'
        environment:
            - POSTGRES_USER=postgres
            - 'POSTGRES_PASSWORD=******'
            - POSTGRES_DB=practicejournal
    authenticationservice:
        container_name: authenticationservice
        image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/authentication-service:latest'
        ports:
            - '8901:8901'
        environment:
            PROFILE: default
            SERVER_PORT: '8901'
            DATABASE_PORT: 5432
            CONFIGSERVER_PORT: 8888
            EUREKASERVER_PORT: 8761
            CONFIGSERVER_URI: 'http://configserver:8888'
            EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
            ENCRYPT_KEY: IMSYMMETRIC
        links:
            - eurekaserver
            - configserver
    registrationservice:
        container_name: registrationservice
        image: '294417223953.dkr.ecr.us-east-1.amazonaws.com/registration-service:latest'
        ports:
            - '8082:8082'
        environment:
            PROFILE: default
            SERVER_PORT: '8082'
            ES_PORT: 9200
            DATABASE_PORT: 5432
            CONFIGSERVER_PORT: 8888
            EUREKASERVER_PORT: 8761
            AUTHSERVER_PORT: 8091
            CONFIGSERVER_URI: 'http://configserver:8888'
            EUREKASERVER_URI: 'http://eurekaserver:8761/eureka/'
            AUTHSERVER_URI: 'http://authenticationservice:8901/auth/user'
            ENCRYPT_KEY: IMSYMMETRIC
        links:
            - eurekaserver
            - configserver
            - authenticationservice

最好为Container添加HealthCheck和Depends-On Key value Pairs。查看 Link 此处了解详细信息。