В этом разделе коснемся сетевого взаимодействия с докер. В предыдущих постах «Часть 1 – терминология» мы рассмотрели основные термины и в части “Часть 2 – основные команды” провели обзор основных команд по управлению докер, “Часть 3 – файл докер” тренировались в создании своих образов. Часть 4 – посвящена томам и монтированию.
Часть 5 – Сети
Часто на одном хосте необходимо запустить несколько контейнеров и предоставить им возможность сетевого взаимодействия. Для этого в докер предусмотрено несколько режимов работы сетей. Стоит отметить, что сетевая подсистема поставляется как подключаемые драйвера (по умолчанию в наличии только четыре драйвера, однако есть и другие варианты https://store.docker.com/search?category=network&q=&type=plugin).
Важно отметить, что все сетевые режимы Docker достигается через программно-определяемую сеть (SDN). В частности, в Linux систем, Docker изменяет правила iptables для обеспечения необходимого уровня изоляция.
Стандартные сетевые драйвера
В стандартной поставке доступны следующие драйверы:
- bridge
- host
- overlay
- macvlan
- none
Драйвер МОСТ (bridge)
Сеть мост- это определяемая пользователем сеть, которая может быть использована любым контейнером на хосте для связи. Преимущество в том, что контейнеры в одном “мосте” могут подключаться, обнаруживать,
и соединятся друг с другом, а в то же время контейнеры подключенные к другому мосту, не могут
общаться напрямую с контейнерами этого моста. Мостовые сети полезны, когда есть контейнеры, работающие на одном хосте, которым нужно общаться между собой. Если контейнеры, которым необходимо обмениваться данными, находятся на разных Docker хостах, то потребуется оверлейная (overlay) сеть.
Когда Docker установлен и запущен, до создается сеть мост по умолчанию и к ней подключаются все созданные и вновь запущенные контейнеры. Однако всегда лучше, если вы сами создадите мостовую сеть. Причины этого такие:
- Лучшая изоляция между контейнерами.
Так как контейнеры в одной сети типа мост обнаруживают соседей и могут обмениваться даными друг с другом. Они автоматически открывать все порты друг другу, но при этом никакие порты не открыты для внешнего мира. Создавая отдельные мосты для каждого приложение обеспечивает лучшую изоляцию между контейнеры разных приложений. - Простое разрешение имен между контейнерами.
Все контейнеры использующие мост могут соединятся друг с другом по именам. Однако контейнеры работающие с мостом по умолчанию, имеют единственный способ для соединяться друг с другом через IP-адреса или с помощью флага –link, который устарел. - Легкое прикрепление / отсоединение контейнеров от определенной сети.
Для контейнеров с мостом по умолчанию, единственный способ отсоединить их – это остановить
запущенный контейнер и воссоздайте его в новой сети.
Сеть хоста (Host)
В этом режиме образ докер подключается к сети хоста, что значит что весь трафик который поступает на хост, также передается в контейнер. Таким образом все порты контейнера соединятся с портами на хосте (в этом режиме публикация портов не имеет смысла). Этот режим идеально подходит если у Вас есть только один контейнер на хосте.
Оверлей сеть (Overlay)
В этом режиме создается сеть, которая охватывает несколько докер хостов. Сеть накладывается на существующие сети хостов, позволяя контейнерам обмениваться данными с множеством портов. Такой режим применяется при построение кластеров докер и позволяет шифровать трафик передаваемый между хостами.
Macvlan
В этом режиме разрешается создание множества логических адресов и связывание их через MAC адрес с одним физическим интерфейсом. Смысл в том, что есть возможность выдать MAC адрес для виртуального сетевого интерфейса внутри контейнера, как бы позволяя создание нового физического интерфейса с указанным MAC. Этот режим необходим для приложений, которые требует для своей работы именно физический интерфейс. У этого режима есть ограничение он будет работать только на сетевых картах с поддержкой режима promiscuous (режим при котором карта может принимать абсолютно все пакеты по сети, а не только те, что адресованы ей.
Без сети (None)
В этом режиме контейнер не подключен ни к одной сети и не получает сетевого трафика. В это режиме контейнеру доступен только интерфейс локальной петли и абсолютно нет возможности взаимодействовать с внешними сетями.
Команды докер для работы с сетями
Докер имеет специально выделенный набор команд для управления сетями:
docker network connect <имя сети> <имя контейнера> – соединяет контейнер с сетью
docker network create <имя сети> – создает сеть
docker network disconnect <имя сети> <имя контейнера> – отсоединяет контейнер от сети
docker network inspect <id сети или ее имя> – позволяет просматривать информацию о сети
docker network ls – выдает перечень сетей в докер
docker network prune – удаляет все не используемые сети
docker network rm <имя сети> – удаляет указанную сеть
Также возможно сразу подключить контейнер к сети при запуске, при помощи параметра –network.
Например:
docker run -d –network database –name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dontusethisinprod mysql
Стоит также отметить, что если параметр –network не указан, то контейнер подключен к мосту по умолчанию.
Если в качестве параметра задан –network host, то это означает что будет использован режим host.