Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a bidirectional link between containers?

Tags:

docker

I have to link two containers so they can see each other. Of course the following...

docker run -i -t --name container1 --link container2:container2 ubuntu:trusty /bin/bash docker run -i -t --name container2 --link container1:container1 ubuntu:trusty /bin/bash 

...fails at line 1 because a container needs to be up and running in order to be a link target:

2014/08/15 03:20:27 Error response from daemon: Could not find entity for container2 

What is the simplest way to create a bidirectional link?

like image 240
alvi Avatar asked Aug 15 '14 10:08

alvi


People also ask

Can 2 containers communicate with each other?

If you are running more than one container, you can let your containers communicate with each other by attaching them to the same network. Docker creates virtual networks which let your containers talk to each other. In a network, a container has an IP address, and optionally a hostname.

What are the two ways you can network containers in Docker?

Docker includes support for networking containers through the use of network drivers. By default, Docker provides two network drivers for you, the bridge and the overlay drivers. You can also write a network driver plugin so that you can create your own drivers but that is an advanced task.


2 Answers

Docker 1.10 addresses this very nicely by introducing advanced container networking. (Details: https://docs.docker.com/engine/userguide/networking/dockernetworks/ )

First, create a network. The example below creates a basic "bridge" network, which works on one host only. You can check out docker's more complete documentation to do this across hosts using an overlay network.

docker network create my-fancy-network 

Docker networks in 1.10 now create a special DNS resolution inside of containers that can resolve the names in a special way. First, you can continue to use --link, but as you've pointed out your example doesn't work. What I recommend is using --net-alias= in your docker run commands:

docker run -i -t --name container1 --net=my-fancy-network --net-alias=container1 ubuntu:trusty /bin/bash docker run -i -t --name container2 --net=my-fancy-network --net-alias=container2 ubuntu:trusty /bin/bash 

Note that having --name container2 is setting the container name, which also creates a DNS entry and --net-alias=container2 just creates a DNS entry on the network, so in this particular example you could omit --net-alias but I left it there in case you wanted to rename your containers and still have a DNS alias that does not match your container name.

(Details here: https://docs.docker.com/engine/userguide/networking/configure-dns/ )

And here you go:

root@4dff6c762785:/# ping container1 PING container1 (172.19.0.2) 56(84) bytes of data. 64 bytes from container1.my-fancy-network (172.19.0.2): icmp_seq=1 ttl=64 time=0.101 ms 64 bytes from container1.my-fancy-network (172.19.0.2): icmp_seq=2 ttl=64 time=0.074 ms 64 bytes from container1.my-fancy-network (172.19.0.2): icmp_seq=3 ttl=64 time=0.072 ms 

And from container1

root@4f16381fca06:/# ping container2 PING container2 (172.19.0.3) 56(84) bytes of data. 64 bytes from container2.my-fancy-network (172.19.0.3): icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from container2.my-fancy-network (172.19.0.3): icmp_seq=2 ttl=64 time=0.069 ms 64 bytes from container2.my-fancy-network (172.19.0.3): icmp_seq=3 ttl=64 time=0.062 ms 
like image 174
coding Avatar answered Oct 21 '22 02:10

coding


There is no bi-directional link since you can not link to a non-running container.

Unless you are disabling inter-container communication, all containers on the same host can see any other containers on the network. All you need is to provide them the ip address of the container you want to contact.

The simplest way of knowing the ip address of a container is to run:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container1 

You can look it up after starting both containers (just don't use --link).

If you need to know the IP of container2 from inside container1 automatically, there are a few options:

  1. Mount the docker socket as a volume and use the remote API

    docker run -i -t --name container1 -v /var/run/docker.sock:docker.sock ubuntu:trusty /bin/bash echo -e "GET /containers/container2/json HTTP/1.0\r\n" | nc -U /docker.sock | sed 's/.IPAddress":"([0-9.]).*/\1/'

  2. Use an orchestration service… there are so many to choose from, but I personally like the DNS-based ones like Skydock or registrator and access containers by dns name.

  3. Use a docker management service (such as dockerize.it —disclaimer: I am working on it—) that will setup the DNS services for you.

like image 44
Abel Muiño Avatar answered Oct 21 '22 01:10

Abel Muiño