🐳 Объяснение концепции сетей в Docker

by itisgood
Сеть Docker в основном используется для установления связи между контейнерами Docker и внешним миром через хост-машину, или вы можете сказать, что это коммуникационный канал, через который все изолированные контейнеры взаимодействуют друг с другом в различных ситуациях для выполнения необходимых действий.
До этого мы описали сетевые взаимодействия Docker тут – 🐳 Docker сетевое взаимодействие 101
Теперь давайте капнем глубже.
В этом руководстве мы объясним основные концепции работы с сетями Docker на практических примерах Ubuntu.
Если вы еще не установили Docker, обратитесь к следующему руководству.
Основы использования Docker:

Объяснение работы сетей в контейнарах Docker

Все перечисленные ниже команды протестированы с правами root в Ubuntu.

Для управления сетевыми операциями, такими как создание новой сети, подключение контейнера к сети, отключение контейнера от сети, перечисление доступных сетей, удаление сетей и т. д., мы используем следующую команду:

# docker network

Типы сетевых драйверов Docker

Чтобы получить список всех ваших сетей, запустите:

# docker network ls
Давайте кратко представим их всех.
  • Bridge network при запуске Docker автоматически создается сеть типа мост по умолчанию. Недавно запущенные контейнеры будут автоматически подключаться к нему. Вы также можете создавать пользовательские настраиваемые мостовые сети. Пользовательские мостовые сети превосходят сетевые мосты по умолчанию.
  • Host network : удаляет сетевую изоляцию между контейнером и хостом Docker и напрямую использует сеть хоста. Если вы запускаете контейнер, который привязывается к порту 80, и вы используете хост-сеть, приложение контейнера доступно через порт 80 по IP-адресу хоста. Означает, что вы не сможете запускать несколько веб-контейнеров на одном хосте, на одном и том же порту, так как порт теперь является общим для всех контейнеров в сети хоста.
  • None network : в сети такого типа контейнеры не подключены ни к одной сети и не имеют доступа к внешней сети или другим контейнерам. Итак, эта сеть используется, когда вы хотите полностью отключить сетевой стек в контейнере.
  • Overlay network : Создает внутреннюю частную сеть, которая охватывает все узлы, участвующие в кластере swarm. Таким образом, оверлейные сети облегчают обмен данными между сервисом Docker Swarm и автономным контейнером или между двумя автономными контейнерами на разных демонах Docker.
  • Macvlan network : Некоторые приложения, особенно устаревшие приложения, отслеживающие сетевой трафик, ожидают прямого подключения к физической сети. В такой ситуации вы можете использовать сетевой драйвер Macvlan для назначения MAC-адреса виртуальному сетевому интерфейсу каждого контейнера, что делает его физическим сетевым интерфейсом, напрямую подключенным к физической сети.
Позвольте мне показать вам практические упражнения для сетей Bridge и Host.

Сеть типа bridge

Я буду использовать два Alpine-контейнера для объяснения этого типа сети.

Теперь я собираюсь запустить два контейнера Alpine, а именно C1 и C2, используя команды:

# docker run -it -d --name c1 alpine ash
# docker run -it -d --name c2 alpine ash

Далее, давайте выясним IP-адрес этих запущенных контейнеров. Для этого запустите:

# docker exec -it c1 sh –c “ip a”
# docker exec -it c2 sh –c “ip a”

Как видите, IP-адрес контейнера C1 – 172.17.0.2, а IP-адрес C2 – 172.17.0.3.

Теперь давайте продолжим и попытаемся проверить связь друг с другом, чтобы убедиться, что они могут общаться.

Сначала подключитесь к работающему контейнеру C1 и попробуйте проверить связь с контейнером C2:
# docker attach c1
# Ping –c 2 172.17.0.3

Как вы можете видеть на скриншотах, показанных выше, происходит конекшен между контейнерами в одной сети.

Мы также можем проверить это, проверив сеть типа мост с помощью команды:

# docker network inspect bridge
Приведенная выше команда отобразит всю информацию о сети, такую как тип сети, подсеть, шлюз, имя контейнера и IP-адрес и т. д.

1.1 Создание пользовательской Bridge сети

Как я уже говорил, при запуске Docker автоматически создается сеть bridge по умолчанию.

Все вновь запущенные контейнеры будут автоматически подключаться к ней.

Однако вы также можете создавать пользовательские мостовые сети.

Чтобы создать новый сетевой драйвер, просто запустите:

# docker network create my_net
или
# docker network create --driver bridge dhruv_net
Обе команды будут выполнять одинаковую работу.
Если вы не укажете имя драйвера, сеть будет создана в сетевом драйвере по умолчанию, т.е. bridge.
В пользовательских сетях, таких как dhruv_net, контейнеры могут не только связываться по IP-адресу, но также могут преобразовывать имя контейнера в IP-адрес.

Эта возможность называется автоматическим обнаружением службы.

Чтобы убедиться, что контейнеры могут взаимодействовать друг с другом, давайте запустим три alpine контейнера, а именно A1, A2 и A3 в сети dhruv_net, которую мы создали ранее.

# docker run -it -d --name A1 --network dhruv_net alpine ash
# docker run -it -d --name A2 --network dhruv_net alpine ash
# docker run -it -d --name A3 --network dhruv_net alpine ash

Теперь попробуйте подключиться к любому из контейнеров и пропинговать два других, используя имя контейнера.
Из приведенных выше снимков экрана доказано, что контейнеры могут общаться друг с другом.

2. Хостовая Сеть

Мы запускаем контейнер, который привязывается к порту 80, используя хост-сеть, приложение контейнера доступно через порт 80 по IP-адресу хоста.

Сеть типа Host нужна только тогда, когда вы запускаете программы с очень специфической сетью.
Приложения, работающие внутри контейнера Docker, выглядят так, как будто они работают на самом хосте с точки зрения сети.
Это позволяет контейнеру получить больший доступ к сети, чем он может получить.
Здесь мы использовали команду netstat -ntlp для отображения порта прослушивания на сервере.
Чтобы узнать, какая служба прослушивает определенный порт, это руководство.
Мы рассмотрели только основы сетевых концепций Docker.
Для более подробной информации, я предлагаю вам заглянуть в руководство по работе с сетями Docker, которое прилагается ниже.
https://docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports

Loading

You may also like

5 комментариев

Дмитрий 16.11.2021 - 12:08

как связаться с автором статьи?

Reply
itisgood 16.11.2021 - 13:05

А какой вопрос?

Reply
Андрей 02.06.2022 - 22:45

прочитал на одном дыхании. Автор приятно объясняет.

Reply
itisgood 03.06.2022 - 14:30

Всегда рады! Спасибо

Reply
Олег 12.09.2022 - 14:28

Это просто плохой перевод. Ссылка на оригинал не помешала бы.

Reply

Leave a Comment