Получение контейнеров для общения друг с другом в Elastic Container Service (ECS)? - PullRequest
0 голосов
/ 23 января 2019

Я использую AWS и Elastic Container Service (ECS).У меня есть 6 сервисов, каждый из которых работает в своем собственном контейнере, который должен общаться друг с другом, чтобы работать.

Когда я выполняю 'docker-compose' на моей локальной машине, каждая служба запускается в своем собственном контейнере и использует имя по умолчанию, которое docker присваивает ему в качестве имени хоста.Я могу получить доступ к контейнеру базы данных с помощью имени хоста «database» из контейнера «registration-service» и т. Д.:

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 с помощью 'ecs-cli compose', сервисы не могутнайти друг друга больше в экземпляре EC2.Служба регистрации ищет имя базы данных «база данных» и не может найти ее, как и другие:

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 с функцией «обнаружения служб», но он просит указать один из моих контейнеров, а затем жалуется, что они используют один и тот же порт, и отказывается запускаться,Возможно, это не то, что я думаю?

Вот мой файл docker-compose для 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 Ответ

0 голосов
/ 01 февраля 2019

1: я вижу, что для подключения из контейнера A к контейнеру B должно быть имя для контейнеров.2: Контейнер B, который зависит от контейнера A, должен иметь Link of Container A. 3: В вашем случае, Конфигуратор контейнера зависит от 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. Парыдля контейнеров.Проверьте Ссылка Здесь для подробностей.

...