1

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?

Melvin
  • 149
  • 2
  • 11
  • Can you provide me the details of the docker-compose file? So that I can have a better understanding. – Sunil Valmiki Jan 29 '19 at 12:34
  • I edited the original question and added the docker-compose file for ECS. – Melvin Jan 30 '19 at 13:17
  • May I know why you need these Env Variables? ES_PORT: 9200 DATABASE_PORT: 5432 CONFIGSERVER_PORT: 8888 EUREKASERVER_PORT: 8761 AUTHSERVER_PORT: 8091 – Sunil Valmiki Jan 31 '19 at 07:49
  • Thanks, I've edited the question and added the run.sh that runs on the container just after it's created. It eventually runs the Java microservice. – Melvin Jan 31 '19 at 17:49
  • Ultimately what I can see is that you need to update the docker compose file with the Container name and the Links. I am uploading your updated docker-compose file for the same. Please find it in the Answer. – Sunil Valmiki Feb 01 '19 at 04:55
  • By golly, that did it! "link" links the containers together, I should have known. Thanks so much for your help, that was a big deal for me. – Melvin Feb 01 '19 at 18:57

1 Answers1

1

1: I see that to connect from container A to container B There should be a name for the containers. 2: Container B which depends on container A should have Link of Container A. 3: In your case, the Container Configserver depends on the Eurekaserver. So there should be a link of Eurekaserver in the Configserver. 4: There should be Unique Container Name specified So that others containers can talk to them using that. 5: I have updated the docker-compose file, Do have check with it and let me know If there are any concerns.

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

It is better to add the HealthCheck and the Depends-On Key value Pairs for the Containers. Check Link Here for details.

Sunil Valmiki
  • 586
  • 6
  • 11