Подробное объяснение сетевого режима Docker и сетевой связи между контейнерами.
Подробное объяснение сетевого режима Docker и сетевой связи между контейнерами.

1. Введение

Сам Docker в зачаточном состоянии,Есть свой драйвер,ВызовContainer Network Manager,аббревиатураCNM。Это само по себеCNMБудет поддерживать несколько режимов,В этом разделе давайте рассмотрим различия между этими режимами.,Затем пойди и узнай,Сделать контейнер действительно хорошей Конфигурация,Позвольте контейнеру действительно имитировать виртуальную машину,Какую конфигурацию мы в конечном итоге делаем.

2. Сетевой режим

2.1 Режим сети с одним хостом

Установить Docker В будущем по умолчанию будут созданы три типа сетей, которые можно будет docker network ls Проверять.

Язык кода:javascript
копировать
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
688d1970f72e        bridge              bridge              local
885da101da7d        host                host                local
f4f1b3cf1b7f        none                null                local

Прежде чем изучать сеть Docker, нам нужно сначала понять, что означают эти сетевые режимы.

сетевой режим

Введение

Bridge

Выделите и установите IP-адрес для каждого контейнера, используйте мост Linux и iptables для обеспечения соединения контейнеров. Docker создает мост с именем docker на каждом хосте и соединяет каждую конечную точку хоста через пару veth. По умолчанию используется модель.

Host

Контейнер не будет виртуализировать собственную сетевую карту, настраивать собственный IP и т. д., а будет использовать IP и порт хоста.

None

Контейнер имеет независимое сетевое пространство имен, но для него не выполняются сетевые настройки. Пользователям необходимо выполнить настройку сети, выполнив команду docker network.

Container

Вновь созданный контейнер не будет создавать собственную сетевую карту и настраивать собственный IP-адрес, но будет использовать IP-адрес, диапазон портов и т. д. совместно с указанным контейнером.

2.2 Режим межхостовой сети

2.2.1 Overlay(libnetwork, libkv)
  • осуществить реализацию пакета

Приведите пример:Просто когдаконтейнерпублично заявитьизпакет,Когда от Хозяин хочет передать из,Затем запечатайте слой здесь, в Хозяине. Он добавляет некоторую дополнительную информацию к исходному пакету данных.,Например, различные протоколы в ходе добавляют слой заголовков. Тогда этот клуб Баотоу,поставь текущийиз Хозяинадрескак оригиналадрес,Положите противоположный конециз Хозяинадрескак цельадрес。Хорошо упакованоизпакет,Просто в инфраструктурной сети,Переведено. Затем, после того как этот пакет прибудет на противоположный конец, Хозяин,Идет еще один процесс распаковки,Это разархивирование внешнего Хозяин-слоя пакетов данных.,Внутри остается только заголовок пакета данных контейнеризации. Таким образом, этот пакет,Его можно передать на противоположный конец. Эта технология распаковки пакетов называется Overlay.

2.2.2 Underlay
  • использовать существующую базовую сеть для каждого контейнера. Конфигурация маршрутизируемого IP-адреса.

Приведите пример:Underlayэто яизконтейнерсетьи Хозяинсеть Это то же самоеиз。яконтейнеризIPДуан Цзай Хозяин Мы также знаем, как проложить маршрут здесьиз,Знать, как маршрутизировать на уровне инфраструктуры. Итак, в этом случае мой пакет данных может быть передан свободно. Каковы его ограничения? Просто потому что я изконтейнерсетии Хозяинсеть поделюсь,Но контейнер потребляет много IP. Итак, вот оно,Если вы хотите использовать Underlayсеть,Тогда вам нужно хорошо спланировать сеть,Например, насколько велик IP и сегмент сети выделен контейнеру.,Сколько сегментов сети выделено для инфраструктуры. Тогда будут относительно высокие требования к планированию ИП.

3. нет сетевого режима

  • none сетевой режим означает отключение функции сети, только lo интерфейс,local из аббревиатуры, обозначающей 127.0.0.1,Прямо сейчас localhost местный шлейфинтерфейс。существоватьсоздаватьконтейнерчаспроходитьпараметр --net none или --network none обозначение;
  • none сетевой режим означает не Docker Container создавать любую среду изсети, интерьер контейнера можно использовать только loopback сетевое устройство, других ресурсов не будет. Можно сказать none Режим Docke Container Настроек сделано очень мало, но как говорится "меньше да лучше", при отсутствии сетевой Конфигурации, т.к. Docker На этой основе разработчики могут создавать бесконечное количество других возможностей для индивидуальной разработки. Это также отражает Docker Концепция дизайна открытая.

Например, я основываюсь на none сетевой режим Созданный а на основе nginx Контейнеры, созданные из изображенийи названn1

мы можем пройти docker network inspect none Посмотреть все none сетевой режим Внизизконтейнер,существовать Containers Имя контейнера можно увидеть в файле node.

Далее давайте рассмотрим процесс мостового соединения сети Docker.,Потому что у нас уже есть докер,янам нужен УстановитьLinuxизbrctlЗаказ:

Язык кода:javascript
копировать
apt install bridge-utils # Установитьbrctl

использоватьbrctlтакиз Заказ Приходить Проверять Виртуальный Ethernet-мост docker0,проходитьbrctl showямы можем видетьприезжать。

С таким оборудованием,На самом деле, нам очень просто обеспечить интероперабельность между Изеть и Хозяин в контейнериз, не так ли? Мы первые в этом контейнере Конфигурациясеть,Во-вторых, вытащите нитку для этого контейнеризсета,приезжать Хозяинизnamespace,и И вставьтесуществоватьэтотBridge,DockerвизBridgeвыше。Что Что?такизразговаривать Хозяинсетьиконтейнерсеть Фактически, совместимость может быть достигнутаизтакодин Цель。ловить Вниз Приходить,я Давайте реализуем это вручную шаг за шагом.создаватьодинсетьпространство имен(network namespace),и Воляодин Нетсетевой режимиз Nginx Docker Контейнер подключается к нему, а сеть настраивается так, чтобы контейнер мог получить доступ к внешней сети.

Сначала создайте сетевое пространство имен:

Язык кода:javascript
копировать
mkdir -p /var/run/netns Каталог #создавать используется для сохранения информации о процессах, связанных с пространством имен сети.

Далее начните Nginx Docker контейнер(никтосетевой режим):

Язык кода:javascript
копировать
docker run --network=none -d nginx

Проверьте PID процесса контейнера:

Язык кода:javascript
копировать
docker ps|grep nginx 
docker inspect контейнерID |grep -i pid

Импортируйте PID в переменные среды:

Язык кода:javascript
копировать
export pid=18149

Проверьте конфигурацию сети контейнера:

Язык кода:javascript
копировать
nsenter -t 18149 -n ip a

использовать nsenterЗаказ Входитьконтейнеризсетьпространство имен,и Проверять IP Конфигурация адреса. Вот 18149 Это контейнер PID。

Свяжите пространство имен сети с контейнером:

Язык кода:javascript
копировать
ln -s /proc/$pid/ns/net /var/run/netns/$pid # Мягкое соединение создает связывающие отношения между процессом контейнера и сетью.
ip netns list # Перечислить все пространства имен сети

Вы можете увидеть PID переменной среды, которую мы только что импортировали.

Создайте пару Veth:

Язык кода:javascript
копировать
ip link add A type veth peer name B

При этом создается пара виртуальных интерфейсов Ethernet (veths), A и B, которые соединяют два сетевых пространства имен, как один сетевой кабель.

Настройте один конец пары veth (A):

Язык кода:javascript
копировать
brctl addif docker0 A
ip link set A up

Добавьте интерфейс A в мост Docker и активируйте его.

Установите переменные среды:

Язык кода:javascript
копировать
SETIP=172.17.0.10  # Эта переменная определяет контейнеринтерфейсинтерфейс. IP адрес
SETMASK=16  # маска подсети контейнереинтерфейсиз, вот она 16, соответствующее десятичное значение равно 256, то есть 255.255.0.0
GATEWAY=172.17.0.1 # Шлюз контейнериздефолт определен, вот он 172.17.0.1

Настройте другой конец пары Veth (B):

Язык кода:javascript
копировать
ip link set B netns $pid # Воля по имени `B` из veth интерфейс установлен пользователем `$pid` Указывает пространство имен изконтейнеризсет. `Б` да предзаказ veth С другой стороны, теперь Воля была перемещена в пространство имен контейнеризсет, так что она находится внутри контейнера.
ip netns exec $pid ip link set dev B name eth0 # Эта команда выполняется внутри пространства имен контейнеризсет, которое veth интерфейс `B` Переименовать в `eth0`. Это сделано для того, чтобы внутреннее именование контейнера соответствовало традиционному методу именования «исетьинтерфейс», а также для того, чтобы его было легче понять и использовать.
ip netns exec $pid ip link set eth0 up # Эта команда активирует переименованный `eth0` Включите его, чтобы он мог отправлять и получать трафик.
ip netns exec $pid ip addr add$SETIP/$SETMASK dev eth0 # Эта команда `eth0` интерфейс назначить IP адрес и маска подсети. `$SETIP` и `$SETMASK` предварительно определены из переменных, представляющих соответственно IP адрес и маска подсети. Таким образом, контейнер имеет эффективное IP адрес,Может участвовать в сетевом общении.
ip netns exec $pid ip route add default via$GATEWAY # Эта Контейнер Установите шлюз по умолчанию. `$GATEWAY` даранее определенныйизпеременная,представлятьконтейнериз Шлюз по умолчаниюадрес。так,Когда контейнеру необходимо отправить данные в непрямое соединение,Он будет использовать шлюз по умолчанию для маршрутизации.

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

Проверьте подключение:

Язык кода:javascript
копировать
curl 172.17.0.10

использовать curl Команда проверяет, может ли контейнер получить доступ к своему IP адрес, чтобы убедиться в правильности конфигурации сети.

Выше представлен процесс запуска контейнера докером с конфигурацией сети по умолчанию.

4. Режим мостовой сети

В этом режиме Докер Демон создает виртуальный Ethernet-мост. docker0,Новый изконтейнер автоматически подключится к этому интерфейсу.,Подключенные к нему пакеты данных могут автоматически пересылаться между любыми сетевыми картами.

По умолчанию демон создает пару одноранговых интерфейсов виртуальных устройств. veth pair,Воля Чтосерединаодининтерфейсустановлен наконтейнериз eth0 интерфейс (сетевая карта контейнера), а другой интерфейс размещается в пространстве имен хоста, аналогично vethxxx Такое наименование подключает все контейнеры на хосте к этой внутренней сети.

Например, если я запускаю nginx Контейнеры, созданные из изображений n01,Проверять ip addr

Благодаря приведенному выше сравнению мы можем обнаружить, что сказанное ранее подтверждается: процесс-демон создаст пару одноранговых интерфейсов виртуальных устройств. veth pair,Воля Чтосерединаодининтерфейсустановлен наконтейнериз eth0 интерфейс (сетевая карта контейнера), а другой интерфейс размещается в пространстве имен хоста, аналогично vethxxx Назван так.

В то же время демон также будет docker0 Выделите один в частном адресном пространстве IP Укажите адрес и подсеть контейнеру и установите docker0 из IP адресдляконтейнериз Шлюз по умолчанию。проходить brctl show команда для просмотра информации о мосте.

За каждый контейнериз IP адрес и Gateway Информация, мы можем пройти docker inspect Имя контейнера|ID Для просмотра в NetworkSettings Подробную информацию можно увидеть в узле.

мы можем пройти docker network inspect bridge Посмотреть все bridge сетевой режим Внизизконтейнер,существовать Containers Имя контейнера можно увидеть в файле node.

о bridge сетевой режимизиспользовать,Просто нужносуществоватьсоздаватьконтейнерчаспроходитьпараметр --net bridge или --network bridge Просто уточните, конечно это тоже по умолчанию режим, то есть этот параметр можно опустить.

Основные шаги по реализации режима Bridge следующие:

  • Docker Daemon использовать veth pair Технология: пара одноранговых устройств виртуального сетевого интерфейса на хосте Хозяинсоздавать, предполагая veth0 и veth1。и veth pair Технические характеристики могут гарантировать, что независимо от того, какой veth После получения сообщения сеть передаст сообщение «Воля» другой стороне.
  • Docker Daemon Воля veth0 добавить к Docker Daemon создаватьиз docker0 на мосту. Гарантируется, что сообщение Хозяинизсеть может быть отправлено на veth0
  • Docker Daemon Воля veth1 добавить в Docker Container Принадлежностьиз namespace вниз и был переименован eth0。Таким образом,гостиница Хозяинизсеть Если сообщение отправлено на veth0,Тогда встаньте Прямо сейчасбудет Container из eth0 Прими, осознай приход Хозяина Docker Container отсутствие возможности подключения к сети, в то же время оно еще и обеспечивает; Docker Container одиниспользовать eth0,Добиться контейнерсеть среду из изоляции.  

5. Режим хост-сети

  • host сетевой режимнуждатьсясуществоватьсоздаватьконтейнерчаспроходитьпараметр --net host или --network host обозначение;
  • использовать host сетевой режимиз Docker Container,может быть напрямуюиспользоватьгостиница Хозяиниз IP адресс внешним миромкоммуникация,нравитьсягостиница Хозяиниз eth0 является общественным IP, то контейнеру тоже принадлежит этот паблик ИП. При этом сервисный порт в контейнере также можно подключить к порту Хозяиниз без дополнительных действий. NAT конверсия;
  • host сетевой режим позволяет контейнеру совместно использовать стек хоста Хозяинсеть, поэтому преимущество состоит в том, что внешний Хозяин напрямую взаимодействует с контейнером, но это контейнерсету не хватает изоляции.

Например, я основываюсь на host сетевой режим Созданный а на основе busybox Контейнеры, созданные из изображений bbox02,Проверять ip addr

Затем хозяин проходит ip addr Просмотрите информацию следующим образом:

мы можем пройти docker network inspect host Посмотреть все host сетевой режим Внизизконтейнер,существовать Containers Имя контейнера можно увидеть в файле node.

/resources/articles/docker/image-20200818124047216.png
/resources/articles/docker/image-20200818124047216.png

6. Режим контейнерной сети

  • Container сетевой режимда Docker Один из наиболее специальных режимов изсетьиз. ввести параметры в создательконтейнер --net контейнер: работает из Имя контейнера|ID или --network контейнер: работает из Имя контейнера|ID обозначение;
  • В этом режиме из Docker контейнер будет использовать общий сетевой стек, так что два контейнера смогут использовать localhost Эффективное и быстрое общение.

Container сетевой режим новыйсоздаватьизконтейнер не будет создавать самоконфигурацию IP, но и назначенный изконтейнер IP, диапазон портов и т. д.。Те же дваконтейнер Кромесеть Кроме того же самого,Другие, такие как файловые системы, списки процессов и т. д., по-прежнему изолированы.

Например, я основываюсь наконтейнер bbox01 Созданный container сетевой режимизконтейнер bbox04,Проверять ip addr

контейнер bbox01 из ip addr Информация следующая:

гостиница Хозяиниз ip addr Информация следующая:

С помощью приведенных выше тестов можно обнаружить, что Docker Демон имеет только одну пару одноранговых виртуальных устройств для подключения. bbox01 контейнеригостиница Хозяин,И контейнер bbox04 будет напрямую использовать информацию веб-сайт контейнера bbox01.

В это время, если bbox01 контейнер остановись и ты найдешь bbox04 контейнер - это все, что осталось lo интерфейс.

Затем bbox01 контейнер После перезапуска Контейнер bbox04 также перезапустите его,Вы можете снова получить информацию о сетевой карте.

7. Пользовательская сеть

Docker Предоставить сетьиспользовать по умолчанию относительно просто, но для обеспечения безопасности применения в каждом контейнере в реальной разработке рекомендуется настроить изсет для управления контейнером и разрешить имя контейнера IP адресизавтоматический DNS разобрать.

от Docker 1.10 Версия запускается, докер daemon Реализован встроенный из DNS сервер, чтобы контейнер мог напрямую взаимодействовать с именем передаваемогоконтейнера. Метод очень простой, просто сделайте это, когда создадитеконтейнериспользовать. --name Просто дайте ему имя. нодаиспользовать Docker DNS Существует предел:может быть только user-defined сетьсерединаиспользовать。То естьдаобъяснять,по умолчаниюиз bridge сетьданикто Закониспользовать DNS из, поэтому нам нужно настроить сеть.

7.1 Создайте сеть

проходить docker network create Команды могут быть настроены по сети режим, командная строка выглядит следующим образом:

Посмотреть дальше docker network create Команда Использовать детали, найти можно --driver обозначениесетевой режим и по умолчанию bridge сетевой режиме, подсказка такая:

Создать на основе bridge сетевой режимиз Настроитьсетевой режим custom_network,Полная команда выглядит следующим образом:

Язык кода:javascript
копировать
docker network create custom_network

проходить docker network ls Проверятьсетевой режим:

Язык кода:javascript
копировать
[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b3634bbd8943        bridge              bridge              local
062082493d3a        custom_network      bridge              local
885da101da7d        host                host                local
f4f1b3cf1b7f        none                null                local

проходить Настроитьсетевой режим custom_network создаватьконтейнер:

Язык кода:javascript
копировать
docker run -di --name bbox05 --net custom_network busybox

проходить docker inspect Имя контейнера|ID Посмотреть информацию о контейнеризсете можно на NetworkSettings Подробную информацию можно увидеть в узле.

7.2 Подключитесь к Интернету

проходить docker network connect имя сети контейнеримя Подключите новую изсетевую систему для контейнера режим。

Язык кода:javascript
копировать
docker network connect bridge bbox05

проходить docker inspect Имя контейнера|ID Еще раз проверьте информацию о контейнере и добавьте значение по умолчанию. bridge

7.3 Отключение от сети

проходить docker network disconnect имя сети контейнеримя Команда отключения от сети.

Язык кода:javascript
копировать
docker network disconnect custom_network bbox05

проходить docker inspect Имя контейнера|ID Проверьте информацию о контейнере еще раз и обнаружите, что осталось только значение по умолчанию. bridge

7.4 Удаление сети

Можетпроходить docker network rm имя сети Команда для удаления пользовательской сети режим,сетевой режим Если удаление пройдет успешно, сеть будет возвращена. режимимя。

Язык кода:javascript
копировать
docker network rm custom_network

ПРИМЕЧАНИЕ. Если используется пользовательская сеть режим Созданныйконтейнер,тогдасетевой режимникто Законудалить.

8. Сетевая связь между контейнерами

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

Начнем с двух значений по умолчанию, основанных на bridge сетевой режимизконтейнер。

Язык кода:javascript
копировать
docker run -di --name default_bbox01 busybox
docker run -di --name default_bbox02 busybox

проходить docker network inspect bridge Посмотреть два конкретных контейнера IP информация.

Затем проверьте, может ли осуществляться связь между двумя контейнерами.

проверено,В результате два человека, принадлежащие к одной сетиизконтейнер, могут общаться в сетииз,нода IP адресвозможныйда Не исправленоиз,Произошли изменения,Чтоконтейнер Все внутрикоммуникацияиз IP адрес тоже надо поменять,Могу ли я связаться с именем использоватьконтейнер? Продолжайте тестирование.

/resources/articles/docker/image-20200818142849899.png
/resources/articles/docker/image-20200818142849899.png

проверено,в результате не возможно связаться с использованиемконтейнериз,Итак, как реализовать эту функцию?

от Docker 1.10 Версия запускается, докер daemon Реализован встроенный из DNS сервер, чтобы контейнер мог напрямую взаимодействовать с именем передаваемогоконтейнера. Метод очень простой, просто сделайте это, когда создадитеконтейнериспользовать. --name Просто дайте ему имя.

нодаиспользовать Docker DNS Существует предел:может быть только user-defined сетьсерединаиспользовать。То естьдаобъяснять,по умолчаниюиз bridge сетьданикто Закониспользовать DNS из, поэтому нам нужно настроить сеть.

Сначала мы основываемся на bridge сетевой режимсоздавать Настроитьсеть custom_network,Затемсоздавать два на основе пользовательского сетевого режимаизконтейнера.

Язык кода:javascript
копировать
docker run -di --name custom_bbox01 --net custom_network busybox
docker run -di --name custom_bbox02 --net custom_network busybox

проходить docker network inspect custom_network Посмотреть два конкретных контейнера IP информация.

/resources/articles/docker/image-20200818143417653.png
/resources/articles/docker/image-20200818143417653.png

Затем проверяется, может ли сетевая связь осуществляться между двумя контейнерами, и соответственно использовать определенное IP-имя иконтейнера для сетевой связи.

проверено,В результате два человека, принадлежащие к одной пользовательской сетиизконтейнера, могут общаться в сетииз,А общаться можно под именем «использоватьконтейнер».

Тогда, если в это время я надеюсь bridge сеть Внизизконтейнер Можети custom_network Как запустить сеть под изконтейнер? На самом деле ответ очень прост: пусть bridge сеть Внизизконтейнер Подключайтесь к новым из custom_network Просто сеть.

Язык кода:javascript
копировать
docker network connect custom_network default_bbox01
boy illustration
Серверная часть Unity добавляет поддержку .net 8. Я еще думал об этом два дня назад, и это сбылось.
boy illustration
Проект с открытым исходным кодом | Самый элегантный метод подписки на публичные аккаунты WeChat на данный момент
boy illustration
Разрешения роли пользователя Gitlab Гость, Репортер, Разработчик, Мастер, Владелец
boy illustration
Spring Security 6.x подробно объясняет механизм управления аутентификацией сеанса в этой статье.
boy illustration
[Основные знания ASP.NET] — Аутентификация и авторизация — Использование удостоверений для аутентификации.
boy illustration
Соединение JDBC с базой данных MySQL в jsp [легко понять]
boy illustration
[Уровень няни] Полный процесс развертывания проекта Python (веб-страницы Flask) в Docker.
boy illustration
6 способов чтения файлов свойств, рекомендуем собрать!
boy illustration
Графическое объяснение этапа строительства проекта IDEA 2021 Spring Cloud (базовая версия)
boy illustration
Подробное объяснение технологии междоменного запроса данных JSONP.
boy illustration
Учебное пособие по SpringBoot (14) | SpringBoot интегрирует Redis (наиболее полный во всей сети)
boy illustration
Подробное объяснение механизма подтверждения выпуска сообщений RabbitMQ.
boy illustration
На этот раз полностью поймите протокол ZooKeeper.
boy illustration
Реализуйте загрузку файлов с использованием минимального WEB API.
boy illustration
Демо1 Laravel5.2 — генерация и хранение URL-адресов
boy illustration
Spring boot интегрирует Kafka и реализует отправку и потребление информации (действительно при личном тестировании)
boy illustration
Мысли о решениях по внутренней реализации сортировки методом перетаскивания
boy illustration
Междоменный доступ к конфигурации nginx не может вступить в силу. Междоменный доступ к странице_Page
boy illustration
Как написать текстовый контент на php
boy illustration
PHP добавляет текстовый водяной знак или водяной знак изображения к изображениям – метод инкапсуляции
boy illustration
Интерпретация быстрой таблицы (TLB)
boy illustration
Интерфейс WeChat API (полный) — оплата WeChat/красный конверт WeChat/купон WeChat/магазин WeChat/JSAPI
boy illustration
Преобразование Java-объекта в json string_complex json-строки в объект
boy illustration
Примените сегментацию слов jieba (версия Java) и предоставьте пакет jar
boy illustration
matinal: Самый подробный анализ управления разрешениями во всей сети SAP. Все управление разрешениями находится здесь.
boy illustration
Коротко расскажу обо всем процессе работы алгоритма сборки мусора G1 --- Теоретическая часть -- Часть 1
boy illustration
[Спецификация] Результаты и исключения возврата интерфейса SpringBoot обрабатываются единообразно, поэтому инкапсуляция является элегантной.
boy illustration
Интерпретация каталога веб-проекта Flask
boy illustration
Что такое подробное объяснение файла WSDL_wsdl
boy illustration
Как запустить большую модель ИИ локально