Я использую 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, направить запросы между ними и проверить их работоспособность, и как мне это настроить?