I'm using AWS and Elastic Container Service (ECS). I have 6 services, each running in their own container that need to talk to each other in order to work.
When I do a 'docker-compose' on my local machine, each service starts up in its own container and uses the default name that docker gives it as its hostname. I can access the database container using hostname 'database' from the 'registration-service' container, and so forth:
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
When I deploy to ECS using 'ecs-cli compose' the services can't find each other anymore in the EC2 instance. The 'registration-service' looks for hostname 'database' and can't find it, as with the others:
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
From what I understand, I need something that is aware of all of my containers, lets them register and checks their health. Ideally, this solution would give me a hostname that I can use for each service (and any identical services I want to scale out) and route DNS requests to one of these services.
I've tried creating a service on my ECS cluster with the 'service discovery' feature, but it asks to point to one of my containers and then complains that they are using the same port and refuses to start up. Perhaps this is not what I think it is?
Here is my docker-compose file for 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"
Also, I have a script that runs on the docker container just after it is started. Eventually, this script starts the Java microservice:
#!/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
This can't be a unique problem. Am I missing something? What AWS solution will help me register containers in ECS, route requests between them and check their health and how do I set this up?