2016-06-14 3 views
1

Я начал один контейнер, скажем, С1, по параллельной сети N1:Сетевое имя контейнеров на нескольких мостов

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

Затем я начать другой контейнер, С2, на N2:

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

Я хочу, чтобы начать третий контейнер (который будет обратный прокси-сервер доступен из порта 9090) C3, так что он может видеть C1:

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

У меня есть доступ к C1 изнутри C3, а его имя - C1. Так, например, из С3 можно сделать

curl http://C1 

можно затем запустить обратный прокси-сервер внутри C3 и вперед запрос, исходящий от порта 9090 к некоторым другим портам на C1.

Но если я хочу, чтобы добавить N2 в С3:

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

затем внутри С3, если я смотрю C1 или C2, я получаю множество не найдено:

curl http://C1 
host not found 

Что являются ли названия C1 и C2 в этом случае?

ответ

1

Чтобы подключить контейнер к второй сети, вам необходимо использовать docker network connect <network> <container>. Команда docker run поддерживает только одну сеть.

Вы можете сделать это до или после запуска контейнера. Некоторым процессам потребуется дополнительный интерфейс до их запуска.

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

Контейнер теперь будет иметь несколько интерфейсов

$ docker exec C3 ip ad sh 
... 
360: [email protected]: <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: [email protected]: <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 

Контейнер может решить и подключиться к контейнерам в обеих сетях

$ 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 

Это может быть проще использовать Docker Compose v2 определение для установки и запускайте среду, как только вы начнете работать в нескольких сетях.

+0

Это работает, на самом деле я должен начать C3 перед присоединением N2, но он работает. Но что это делает тогда, поскольку он запускает C3 тоже: docker run --net = N1 --net = N2 -p 9090: 9090 --name C3 –

+0

Он будет подключен к одной только одной сети, последний сетевой аргумент, который вы предоставляете (N2) – Matt

Смежные вопросы