Home > database >  Register Dockerized microservice to Eureka server - Springboot
Register Dockerized microservice to Eureka server - Springboot

Time:07-01

In my production environment I have an Eureka Server running inside a docker container.

I can register to it other basic microservices with this kind of Application.yml

Application.yml:

server:
  port: '8095'
spring:
  application:
    name: sap-listener
eureka:
  instance:
    preferIpAddress: true
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://172.17.0.2:8761/eureka

I create a DockerImage with this Dockerfile:

Dockerfile

FROM openjdk:17-jdk
ARG JAR_FILE=target/*.jar
COPY target/sap-listener-*.jar /sap-listener.jar
ENTRYPOINT ["java", "-jar", "/sap-listener.jar" ]
EXPOSE 8095

and then I run it in production with this command:

docker run -d -p 8095:8095 --name sap myrepo/sap-listener1.0:latest

The service is successfully registered to the Eureka server.

I came across to some problems when I try to run a bigger microservice which have a docker-compose file.

I send directly this docker-compose file in production:

Docker-compose

version: "3.3"
services:
  docker-mysql:
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
      MYSQL_DATABASE: 'db'
    ports:
      - "3007:3306"
  phpmyadmin:
    image: phpmyadmin
    restart: always
    container_name: php-my-admin-users
    ports:
      - "8081:80"
  ldap-app:
    image: myRepo/service1:latest
    ports:
      - "8090:8090"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://docker-mysql:3306/db
    depends_on:
      - docker-mysql

And I run it with docker-compose -f docker-compose.yml up -d

service1 application.yml have the same type of connection with Eureka server of the previous microservice.

service1 is correctly deployed but It can't register himself to the Eureka server, if I log out the container output I have this error:

2022-06-29 15:45:20.551 INFO 1 --- [ main] c.n.d.s.t.d.RedirectingEurekaHttpClient : Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://172.17.0.2:8761/eureka/}, exception=I/O error on GET request for "http://172.17.0.2:8761/eureka/apps/": Connect to 172.17.0.2:8761 [/172.17.0.2] failed: Connection timed out; nested exception is org.apache.http.conn.ConnectTimeoutException: Connect to 172.17.0.2:8761 [/172.17.0.2] failed: Connection timed out stacktrace=org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://172.17.0.2:8761/eureka/apps/": Connect to 172.17.0.2:8761 [/172.17.0.2] failed: Connection timed out; nested exception is org.apache.http.conn.ConnectTimeoutException: Connect to 172.17.0.2:8761 [/172.17.0.2] failed: Connection timed out

I read that someone directly insert the Eureka Server data as a service inside the Docker-Compose.yml file, but my Eureka Server is already deployed and is already listening to a specific port.

CodePudding user response:

That is probably happening because docker-compose automatically assign a network to the containers.

Try adding network_mode: host to your services in the compose file, like so:

version: "3.3"
services:
  docker-mysql:
    network_mode: host
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'password'
      MYSQL_DATABASE: 'db'
    ports:
      - "3007:3306"
  phpmyadmin:
    network_mode: host
    image: phpmyadmin
    restart: always
    container_name: php-my-admin-users
    ports:
      - "8081:80"
  ldap-app:
    network_mode: host
    image: myRepo/service1:latest
    ports:
      - "8090:8090"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://docker-mysql:3306/db
    depends_on:
      - docker-mysql

CodePudding user response:

First I would suggest you get familiar with how networking in Docker works and then have a look at networking in Docker-Compose.

When you run docker network ls when your containers are deployed you will see that they are running on different networks, which isolates them. Inspect the networks using docker network inspect <id> and you'll see they have different subnets. So for the services to be able to communicate they need to be on the same network.

You can manually create a network and use it in both compose and the docker cli.

  • Related