Eric Kolotyluk
Eric Kolotyluk

Reputation: 2243

How can you resolve Docker hostnames from the parent host?

docker-compose up

. . .

docker-compose ps

Name                               Command               State                         Ports                        
------------------------------------------------------------------------------------------------------------------------------------
localdockerdbandredis_kafka1_1           start-kafka.sh                   Up      0.0.0.0:9092->9092/tcp                             
localdockerdbandredis_kafka2_1           start-kafka.sh                   Up      0.0.0.0:9093->9092/tcp, 9093/tcp                   
localdockerdbandredis_kafka3_1           start-kafka.sh                   Up      0.0.0.0:9094->9092/tcp, 9094/tcp                   
localdockerdbandredis_spacejam_mysql_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp                             
localdockerdbandredis_spacejam_redis_1   docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp                             
localdockerdbandredis_zookeeper_1        /bin/sh -c /usr/sbin/sshd  ...   Up      0.0.0.0:2181->2181/tcp, 22/tcp, 2888/tcp, 3888/tcp 

Is there a way to resolve the name localdockerdbandredis_kafka1_1 from the host. For example,

telnet localdockerdbandredis_kafka1_1 9092

The developer who set up our environment has our code being able to connect to localdockerdbandredis_spacejam_mysql_1 by name, but he is on vacation, and I am new to docker, so I cannot figure out how I can refer to Kafka by name.

My docker.compose-yml file looks like

version: '2'

services:

  spacejam_mysql:
    # image: mariadb:10.1.14
    # image: mysql:5.6
    image: iggcanada/mysql
    expose:
      - "3306"
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ????
      MYSQL_USER: ????
      MYSQL_PASSWORD: ????
    networks:
      - madlands

  spacejam_redis:
    image: redis:latest
    expose:
      - "6379"
    ports:
      - "6379:6379"
    networks:
      - madlands

  zookeeper:
    image: wurstmeister/zookeeper
    expose:
      - "2181"
    ports:
      - "2181:2181"
    networks:
      - madlands

# http://wurstmeister.github.io/kafka-docker

  kafka1:
    build: .
    expose:
      - "9092"
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localdockerdbandredis_kafka1_1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_DELETE_TOPIC_ENABLE: "true"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - madlands

  kafka2:
    build: .
    expose:
      - "9093"
    ports:
      - "9093:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localdockerdbandredis_kafka2_1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_DELETE_TOPIC_ENABLE: "true"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - madlands

  kafka3:
    build: .
    expose:
      - "9094"
    ports:
      - "9094:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: localdockerdbandredis_kafka3_1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_DELETE_TOPIC_ENABLE: "true"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - madlands

# Create our named network of type bridge
networks:
  madlands:
    driver: bridge

Basically in our code I want to be able to configure kafkaBootstrapServers as

spacejam.kafka.bootstrap.servers = "localdockerdbandredis_kafka1_1:9092,localdockerdbandredis_kafka2_1:9093,localdockerdbandredis_kafka3_1:9094"

the way our code uses

akka-persistence-sql-async.url = "jdbc:mysql://localdockerdbandredis_spacejam_mysql_1/spacejam_akka_persistence"

elsewhere.

I have been searching documentation on how to resolve names from Docker, but still have not found anything that seems to describe how to do this.

Upvotes: 1

Views: 187

Answers (1)

Tarun Lalwani
Tarun Lalwani

Reputation: 146630

From you docker-compose output you can see the port mappings

Name                               Command               State                         Ports                        
------------------------------------------------------------------------------------------------------------------------------------
localdockerdbandredis_kafka1_1           start-kafka.sh                   Up      0.0.0.0:9092->9092/tcp                             
localdockerdbandredis_kafka2_1           start-kafka.sh                   Up      0.0.0.0:9093->9092/tcp, 9093/tcp                   
localdockerdbandredis_kafka3_1           start-kafka.sh                   Up      0.0.0.0:9094->9092/tcp, 9094/tcp            

So for you Kafka1, Kafka2, Kafka the ports mapped are 9092, 9093, 9094. Which means you can telnet to them on localhost and these port

telnet 127.0.0.1 9092

On your machine will connect you to Kafka1. To connect to Kafka 2 you will use

telnet 127.0.0.1 9093

The only way to refer to these by name is to make a host entry in your system and point that either to localhost or your machine IP (if host file not on your machine)

/etc/hosts

127.0.0.1 localdockerdbandredis_kafka1_1 localdockerdbandredis_kafka1_2 localdockerdbandredis_kafka1_3

Now only problem you may face is when connecting to localdockerdbandredis_kafka1_2 from code running on your machine (outside docker) as kafka works using advertised host name and on port 9092 but your machine will only provide access of Kafka 1 on 9092.

So make these three host entries, point them to local and see if everything works

Upvotes: 1

Related Questions