0

We are trying to deploy Netflix Eureka Server on Docker container which is a Spring Boot application. We are deploying it as a docker service with Docker swarm for container orchestration. Everything works fine when we directly create the container and run the application. Eureka server registers all the client application with correct IP addresses. But when we create and deploy it as docker service it registers the application with the wrong IP address.

We have tried below solution as per spring documentation, updated property values in our configuration files.


spring: 
   cloud:
     inetutils:
       ignoredInterfaces:
          - docker0
          - veth.*

eureka:
  instance:
    preferIpAddress: true

Tried these solutions as well:

https://github.com/spring-cloud/spring-cloud-netflix/issues/1820

https://github.com/spring-cloud/spring-cloud-netflix/issues/2084

While we run the docker service, the container gets assigned one IP address lets say 172.16.1.3 and service started inside docker gets assigned new IP address 172.16.1.4, because of this issue client application registers its self with container's IP into Eureka server. But it is accessible with 172.16.1.4.

So why running docker as service assigns two IP addresses?

Here Eureka server is running on 10.255.53.172 IP address but as we can see in the second image it shows different IP in Instance Info

Eureka instance is registered with containers IP but it's accessible with its service IP in the network

New contributor
vishal patel is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
0

We use this configuration on production using docker swarm mode:

Eureka server configuration

# Defines the Eureka server that is used by the Netflix OSS components to use as the registry
# for server discovery
eureka:
  instance:
    hostname: ${HOST_NAME:localhost}
    appname: eureka-cluster
    # enable to register multiple app instances with a random server port
    instance-id: ${spring.application.name}:${random.uuid}
    leaseRenewalIntervalInSeconds: 10
    leaseExpirationDurationInSeconds: 20

Eureka client configuration

eureka:
  client:
    registerWithEureka: ${REGISTER_WITH_EUREKA:true}
    fetchRegistry: ${FETCH_REGISTRY:false}
    serviceUrl:
      defaultZone: ${EUREKA_DEFAULT_ZONE:http://localhost:8761/eureka/}
  instance:
    hostname: ${HOST_NAME:${spring.application.name}}  # work on swarm
    preferIpAddress: ${PREFER_IP_ADDRESS:false}
    # enable to register multiple app instances with a random server port
    instance-id: ${spring.application.name}:${random.uuid}
    leaseRenewalIntervalInSeconds: ${LEASE_RENEWAL_INTERVAl_IN_SECONDS:10}
    leaseExpirationDurationInSeconds: ${LEASE_EXPIRATION_DURATIONIN_SECONDS:20}

ON swarm service definition

  rd-service:
      image: my-eureka-server-microservice-image
    ports:
    - "8763:8763"
      networks:
      - backend

  client-service:
    image: my-eureka-client-microservice-image
    networks:
    - backend
    networks:
    environment:
    - "EUREKA_DEFAULT_ZONE=http://rd-service:8763/eureka"
    - "REGISTER_WITH_EUREKA=true"
    - "FETCH_REGISTRY=true"

networks:
  backend:
    external: true

Important: Services must be in the same docker overlay network used on eureka server docker service.

Your Answer

vishal patel is a new contributor. Be nice, and check out our Code of Conduct.

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.