How to allow docker containers to see each other by their name?

I have a mongo instance running in a container named mongo1 that has exposed port 27017. I can connect just fine from the host.

I have another container that is running an application that wants to connect to the mongo instance.

How can I connect the 2 containers so that the hostname mongo1 is exposed to the other container and it can connect to mongo1:27017 ?


Solution 1:

What was happening was that the default docker network doesn't allow name >> DNS mapping.

Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.

So I created a new network:

docker network create -d bridge br0

and then added the containers to that network:

docker network connect br0 mongo1
docker network connect br0 wiki

now they can see each other by their name.

Solution 2:

For existing containers (as Temporary solution)

docker inspect <mango_container_name> | grep IPAddress

and edite/add /etc/hosts inside the container

docker exec -it -u 0 <app_container_name> bash

then from inside the container map container_name with the IP address .. Example

echo "172.15.0.5 mango1" >> /etc/hosts

exit

.......
Or you can assign hostname for container during spining it up with

docker run -it -h mango1 mango_image

and/or add Example echo "172.17.0.5 mango1" >> /etc/hosts command in docker files for less headache