在弹性容器服务(ECS)中让容器互相交谈吗?

时间:2019-01-23 19:47:22

标签: amazon-web-services docker containers amazon-route53 amazon-ecs

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

当我在本地计算机上执行“ docker-compose”时,每个服务都在其自己的容器中启动,并使用docker为其提供的默认名称作为其主机名。我可以从“注册服务”容器中使用主机名“数据库”访问数据库容器,依此类推:

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与其他主机一样查找主机名“数据库”,但找不到它:

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群集上创建服务,但是它要求指向我的一个容器,然后抱怨它们使用相同的端口,并拒绝启动。也许这不是我想的那样?

这是我的ECS的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:
      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 个答案:

答案 0 :(得分:1)

1:我看到了从容器A到容器B的连接。容器应该有一个名称。 2:依赖于容器A的容器B应该具有容器A的链接。 3:在您的情况下,Container Configserver取决于Eurekaserver。因此,Configserver中应该有一个Eurekaserver链接。 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

最好为容器添加HealthCheck和Depends-On键值对。在此处查看Link以获得详细信息。