Одна из классных функций, встроенных непосредственно в Docker, – это работа в сети.
Доступ к сетевой функции Docker можно получить с помощью флага –link, который позволяет подключать любое количество контейнеров Docker без необходимости открывать внутренние порты контейнера внешнему миру.
В этом руководстве вы узнаете, как объединить в сеть два или более контейнера Docker в системе Linux с помощью командной строки.
Это будет работать в любом дистрибутиве Linux. Ознакомьтесь с пошаговыми инструкциями ниже, чтобы узнать, как это сделать.
В этом руководстве мы рассмотрим:
Как объединить контейнеры Docker в сеть
Подключение контейнеров Docker к сети
В этой конфигурации вы узнаете, как связать два или более контейнера Docker вместе с помощью простой сетевой техники Docker.
Мы можем начать с развертывания нашего первого контейнера Docker с именем sanbox1, для которого мы позже создадим сетевой линк:
# docker run -it --name sandbox1 -h sanbox1 itsecforu/sandbox /bin/bash
В приведенной выше команде нет ничего нового, за исключением того, что мы не открываем какие-либо сетевые порты, даже если мы намерены получить доступ к службам (SSH, соединение с базой данных и т.д.) через соответствующие номера портов.
Следующая команда Linux развернет второй и на этот раз родительский контейнер Docker с именем sandbox2.
Мы также будем использовать флаг –link, который создаст так называемые родительско-дочерние отношения с ранее развернутым контейнером sandbox1.
Кроме того, флаг –link позволит родительскому контейнеру получить доступ к любым службам, работающим в контейнере sandbox1, через соответствующие номера портов без необходимости для дочернего контейнера открывать какие-либо порты для внешнего мира.
# docker run -it --name sandbox2 -h sandbox2 --link sandbox1:sandbox1 itsecforu/sandbox /bin/bash
Вышеупомянутая команда docker использовала флаг –link, который ожидает два аргумента, разделенных двоеточием.
Ожидается, что первым аргументом будет идентификатор контейнера или, как в нашем случае, предоставленное имя контейнера sandbox1, на который мы хотели бы установить линк.
Второй аргумент, также sandbox1, является внутренним псевдонимом, используемым sandbox2 для разрешения конфигурации сети sandbox1 с помощью файла конфигурации /etc/hosts:
# grep sandbox1 /etc/hosts 172.17.0.41 sandbox1
В зависимости от используемой конфигурации портов вашего дочернего контейнера вы также можете извлечь конфигурацию sandbox1 из переменных системной среды.
Например:
# env HOSTNAME=sandbox2 TERM=xterm SANDBOX1_PORT=tcp://172.17.0.37:7555 SANDBOX1_PORT_7555_TCP=tcp://172.17.0.37:7555 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ SANDBOX1_PORT_7555_TCP_ADDR=172.17.0.37 SANDBOX1_PORT_7555_TCP_PROTO=tcp SHLVL=1 HOME=/root SANDBOX1_NAME=/sandbox2/sandbox1 SANDBOX1_PORT_7555_TCP_PORT=7555 _=/usr/bin/env
Таким образом, мы можем просто использовать алиас нашего дочернего контейнера для подключения к нему из родительского контейнера sandbox2 без необходимости жесткого кодирования его IP-адреса:
# ping -c 1 sandbox1 PING sandbox1 (172.17.0.41): 56 data bytes 64 bytes from 172.17.0.41: icmp_seq=0 ttl=64 time=0.071 ms --- sandbox1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.071/0.071/0.071/0.000 ms
а также доступ к любым портам и сервисам:
# nmap -p 22 sandbox1 Starting Nmap 6.47 ( http://nmap.org ) at 2015-05-18 08:58 UTC Nmap scan report for sandbox1 (172.17.0.41) Host is up (0.000090s latency). PORT STATE SERVICE 22/tcp open ssh MAC Address: 02:42:AC:11:00:29 (Unknown) Nmap done: 1 IP address (1 host up) scanned in 0.50 seconds
Это все, что нужно сделать.
Наши два контейнера теперь могут связываться друг с другом, и между ними работают сервисы, например SSH.
Вы можете применить эту же конфигурацию к любым двум или более контейнерам Docker, которые вам нужно объединить в сеть.
Заключение
В этом руководстве мы увидели, как связать контейнеры Docker вместе в системе Linux.
Это относительно простая задача, которая решается с помощью опции Docker –link.
Возможность объединения двух или более контейнеров Docker в сеть существенно увеличивает мощность и полезность Docker.