Piero dS
Piero dS

Reputation: 45

Network name of containers on multiple bridges

I am starting one container, say C1, on a bridged network N1:

docker network create --driver bridge N1
docker run --net=N1 --name C1 -d some image

Then I start another container, C2, on N2:

docker network create --driver bridge N2
docker run --net=N1 --name C1 -d some image

I want to start a third container (which will be a reverse proxy accessible from port 9090) C3 so that it can see C1:

docker run --net=N1 -p 9090:9090 --name C3

I have then access to C1 from inside C3, and its name is C1. So for example from C3 I can do

curl http://C1

I can then run a reverse proxy inside C3 and forward request coming from port 9090 to some other ports on C1.

But if I want to add N2 to C3:

docker run  --net=N1 --net=N2 -p 9090:9090 --name C3

then from inside of C3, if I look up C1 or C2, I get a host not found:

curl http://C1
host not found

What are the names of C1 and C2 in this case?

Upvotes: 1

Views: 283

Answers (1)

Matt
Matt

Reputation: 74831

To connect a container to a second network you need to use docker network connect <network> <container>. The docker run command only supports a single network.

You can do this before or after the container has started. Some processes will need the extra interface before they start.

docker create --name C3 --net=N1 <image>
docker network connect N2 C3
docker start C3

The container will now have multiple interfaces

$ docker exec C3 ip ad sh
...
360: eth0@if361: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe14:3/64 scope link 
       valid_lft forever preferred_lft forever
362: eth1@if363: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:15:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.21.0.3/16 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe15:3/64 scope link 
       valid_lft forever preferred_lft forever

The container can resolve and connect to containers on both networks

$ docker exec C3 ping -c 1 C1
PING ping2 (172.20.0.5): 56 data bytes
64 bytes from 172.20.0.5: icmp_seq=0 ttl=64 time=0.221 ms
--- ping2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.221/0.221/0.221/0.000 ms

$ docker exec C3 ping -c 1 C2
PING ping1 (172.21.0.5): 56 data bytes
64 bytes from 172.21.0.5: icmp_seq=0 ttl=64 time=0.177 ms
--- ping1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.177/0.177/0.177/0.000 ms

It might be easier to use a Docker Compose v2 definition to setup and run your environment once you start getting into multiple networks.

Upvotes: 1

Related Questions