Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do docker containers resolve hostname of other docker containers running on the same machine?

I have started to use docker and liking it mostly because Docker containers are kind of light-weight VMs. But I am unable to figure out, how docker containers may be able resolve each-other's hostnames. They can connect to each other using there IPs, but not using their hostnames, I cannot even edit /etc/hosts in the containers to make up for that somehow. When I restart the containers, they get different IPs and hence I want to use the hostnames in place of IPs to communicate with each other. Let us say, I want to run Zookeeper instances of a Zookeeper cluster in the containers and I want to put the hostnames of the Zookeeper servers in the config (zoo.cfg) files.

like image 640
Nipun Talukdar Avatar asked Oct 09 '14 03:10

Nipun Talukdar


3 Answers

As of Docker 1.10, if you create a distinct docker network, Docker will resolve hostnames intra-container-wise using an internal DNS server [1][2][3]. You can change the network hostname by specifying one with --name within the docker run. Otherwise the hostname will refer to the container id (12 char long hash, shown by docker container ls ).

See also:

  • Docker doesn't resolve hostname

  • When to use --hostname in docker?

Sources:

[1] = docker docs - Embedded DNS server in user-defined networks

[2] = Docker Engine release notes - 1.10.0 (2016-02-04) - Networking

[3] = Docker pull requests - Vendoring libnetwork

like image 119
Murmel Avatar answered Oct 22 '22 15:10

Murmel


It may be worth checking out Docker links (https://docs.docker.com/userguide/dockerlinks/). When you link to a running container, a host entry is added for the container you wish to connect to.

In their example they show

$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.5  db

As you see here, they link the application they're in bash with to the container named db, and subsequently a host entry is added for db with the IP address of that container.

So in the instance of having zookeeper running, you could simply make the containers you start just link to zookeeper. I hope this helps!

like image 44
Marcus Hughes Avatar answered Oct 22 '22 16:10

Marcus Hughes


Can depend on OS of container, but supposing that container runs Linux you can check your DNS configuration this way:

cat /etc/resolv.conf 

It can return something like:

nameserver 127.0.0.11
options ndots:0

/etc/resolv.conf is standard configuration file for DNS in UNIX-like OS-es. In this particular case container is configured to use 127.0.0.11 as DNS server. So container can query it to determine IP address of another container using it's host name. You can check whether that host actually works by using nslookup command, e.g.:

nslookup redis 127.0.0.11

, which will contact DNS server 127.0.0.11 and ask to resolve host name "redis". It can return something like:

Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      redis
Address 1: 172.21.0.3 counter-app_redis_1.counter-app_counter-net 

, which would mean that host name resolved to ip 172.21.0.3.

In this specific case nameserver entry was added by using the following entry in the docker-compose.yml configuration file:

...
networks:
  counter-net:

This root entry configured common bridge network shared by several docker containers.

like image 1
igorpcholkin Avatar answered Oct 22 '22 16:10

igorpcholkin