Сам Docker в зачаточном состоянии,Есть свой драйвер,ВызовContainer Network Manager
,аббревиатураCNM
。Это само по себеCNMБудет поддерживать несколько режимов,В этом разделе давайте рассмотрим различия между этими режимами.,Затем пойди и узнай,Сделать контейнер действительно хорошей Конфигурация,Позвольте контейнеру действительно имитировать виртуальную машину,Какую конфигурацию мы в конечном итоге делаем.
Установить Docker В будущем по умолчанию будут созданы три типа сетей, которые можно будет docker network ls
Проверять.
[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-адрес, диапазон портов и т. д. совместно с указанным контейнером. |
Приведите пример:Просто когдаконтейнерпублично заявитьизпакет,Когда от Хозяин хочет передать из,Затем запечатайте слой здесь, в Хозяине. Он добавляет некоторую дополнительную информацию к исходному пакету данных.,Например, различные протоколы в ходе добавляют слой заголовков. Тогда этот клуб Баотоу,поставь текущийиз Хозяинадрескак оригиналадрес,Положите противоположный конециз Хозяинадрескак цельадрес。Хорошо упакованоизпакет,Просто в инфраструктурной сети,Переведено. Затем, после того как этот пакет прибудет на противоположный конец, Хозяин,Идет еще один процесс распаковки,Это разархивирование внешнего Хозяин-слоя пакетов данных.,Внутри остается только заголовок пакета данных контейнеризации. Таким образом, этот пакет,Его можно передать на противоположный конец. Эта технология распаковки пакетов называется Overlay.
Приведите пример:Underlayэто яизконтейнерсетьи Хозяинсеть Это то же самоеиз。яконтейнеризIPДуан Цзай Хозяин Мы также знаем, как проложить маршрут здесьиз,Знать, как маршрутизировать на уровне инфраструктуры. Итак, в этом случае мой пакет данных может быть передан свободно. Каковы его ограничения? Просто потому что я изконтейнерсетии Хозяинсеть поделюсь,Но контейнер потребляет много IP. Итак, вот оно,Если вы хотите использовать Underlayсеть,Тогда вам нужно хорошо спланировать сеть,Например, насколько велик IP и сегмент сети выделен контейнеру.,Сколько сегментов сети выделено для инфраструктуры. Тогда будут относительно высокие требования к планированию ИП.
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
Заказ:
apt install bridge-utils # Установитьbrctl
использоватьbrctl
такиз Заказ Приходить Проверять Виртуальный Ethernet-мост docker0
,проходитьbrctl show
ямы можем видетьприезжать。
С таким оборудованием,На самом деле, нам очень просто обеспечить интероперабельность между Изеть и Хозяин в контейнериз, не так ли? Мы первые в этом контейнере Конфигурациясеть,Во-вторых, вытащите нитку для этого контейнеризсета,приезжать Хозяинизnamespace
,и И вставьтесуществоватьэтотBridge
,Docker
визBridge
выше。Что Что?такизразговаривать Хозяинсетьиконтейнерсеть Фактически, совместимость может быть достигнутаизтакодин Цель。ловить Вниз Приходить,я Давайте реализуем это вручную шаг за шагом.создаватьодинсетьпространство имен(network namespace
),и Воляодин Нетсетевой режимиз Nginx Docker Контейнер подключается к нему, а сеть настраивается так, чтобы контейнер мог получить доступ к внешней сети.
Сначала создайте сетевое пространство имен:
mkdir -p /var/run/netns Каталог #создавать используется для сохранения информации о процессах, связанных с пространством имен сети.
Далее начните Nginx Docker контейнер(никтосетевой режим):
docker run --network=none -d nginx
Проверьте PID процесса контейнера:
docker ps|grep nginx
docker inspect контейнерID |grep -i pid
Импортируйте PID в переменные среды:
export pid=18149
Проверьте конфигурацию сети контейнера:
nsenter -t 18149 -n ip a
использовать
nsenter
Заказ Входитьконтейнеризсетьпространство имен,и Проверять IP Конфигурация адреса. Вот 18149 Это контейнер PID。
Свяжите пространство имен сети с контейнером:
ln -s /proc/$pid/ns/net /var/run/netns/$pid # Мягкое соединение создает связывающие отношения между процессом контейнера и сетью.
ip netns list # Перечислить все пространства имен сети
Вы можете увидеть PID переменной среды, которую мы только что импортировали.
Создайте пару Veth:
ip link add A type veth peer name B
При этом создается пара виртуальных интерфейсов Ethernet (veths), A и B, которые соединяют два сетевых пространства имен, как один сетевой кабель.
Настройте один конец пары veth (A):
brctl addif docker0 A
ip link set A up
Добавьте интерфейс A в мост Docker и активируйте его.
Установите переменные среды:
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):
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` даранее определенныйизпеременная,представлятьконтейнериз Шлюз по умолчаниюадрес。так,Когда контейнеру необходимо отправить данные в непрямое соединение,Он будет использовать шлюз по умолчанию для маршрутизации.
Вместе эти последовательности команд настраивают базовый сетевой интерфейс контейнера, позволяя ему подключаться к сети и взаимодействовать с ней.
Проверьте подключение:
curl 172.17.0.10
использовать curl Команда проверяет, может ли контейнер получить доступ к своему IP адрес, чтобы убедиться в правильности конфигурации сети.
Выше представлен процесс запуска контейнера докером с конфигурацией сети по умолчанию.
В этом режиме Докер Демон создает виртуальный 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 следующие:
veth pair
Технология: пара одноранговых устройств виртуального сетевого интерфейса на хосте Хозяинсоздавать, предполагая veth0
и veth1
。и veth pair
Технические характеристики могут гарантировать, что независимо от того, какой veth
После получения сообщения сеть передаст сообщение «Воля» другой стороне.veth0
добавить к Docker Daemon создаватьиз docker0
на мосту. Гарантируется, что сообщение Хозяинизсеть может быть отправлено на veth0
;veth1
добавить в Docker Container Принадлежностьиз namespace вниз и был переименован eth0
。Таким образом,гостиница Хозяинизсеть Если сообщение отправлено на veth0
,Тогда встаньте Прямо сейчасбудет Container из eth0
Прими, осознай приход Хозяина Docker Container отсутствие возможности подключения к сети, в то же время оно еще и обеспечивает; Docker Container одиниспользовать eth0
,Добиться контейнерсеть среду из изоляции. --net host
или --network host
обозначение;eth0
является общественным IP, то контейнеру тоже принадлежит этот паблик ИП. При этом сервисный порт в контейнере также можно подключить к порту Хозяиниз без дополнительных действий. NAT конверсия;Например, я основываюсь на host
сетевой режим Созданный а на основе busybox
Контейнеры, созданные из изображений bbox02
,Проверять ip addr
:
Затем хозяин проходит ip addr
Просмотрите информацию следующим образом:
мы можем пройти docker network inspect host
Посмотреть все host
сетевой режим Внизизконтейнер,существовать Containers
Имя контейнера можно увидеть в файле node.
--net контейнер: работает из Имя контейнера|ID
или --network контейнер: работает из Имя контейнера|ID
обозначение;Container сетевой режим новыйсоздаватьизконтейнер не будет создавать самоконфигурацию IP, но и назначенный изконтейнер IP, диапазон портов и т. д.。Те же дваконтейнер Кромесеть Кроме того же самого,Другие, такие как файловые системы, списки процессов и т. д., по-прежнему изолированы.
Например, я основываюсь наконтейнер bbox01
Созданный container
сетевой режимизконтейнер bbox04
,Проверять ip addr
:
контейнер bbox01
из ip addr
Информация следующая:
гостиница Хозяиниз ip addr
Информация следующая:
С помощью приведенных выше тестов можно обнаружить, что Docker Демон имеет только одну пару одноранговых виртуальных устройств для подключения. bbox01 контейнеригостиница Хозяин,И контейнер bbox04 будет напрямую использовать информацию веб-сайт контейнера bbox01.
В это время, если bbox01 контейнер остановись и ты найдешь bbox04 контейнер - это все, что осталось lo интерфейс.
Затем bbox01 контейнер После перезапуска Контейнер bbox04 также перезапустите его,Вы можете снова получить информацию о сетевой карте.
Docker Предоставить сетьиспользовать по умолчанию относительно просто, но для обеспечения безопасности применения в каждом контейнере в реальной разработке рекомендуется настроить изсет для управления контейнером и разрешить имя контейнера IP адресизавтоматический DNS разобрать.
от Docker 1.10 Версия запускается, докер daemon Реализован встроенный из DNS сервер, чтобы контейнер мог напрямую взаимодействовать с именем передаваемогоконтейнера. Метод очень простой, просто сделайте это, когда создадитеконтейнериспользовать.
--name
Просто дайте ему имя. нодаиспользовать Docker DNS Существует предел:может быть только user-defined сетьсерединаиспользовать。То естьдаобъяснять,по умолчаниюиз bridge сетьданикто Закониспользовать DNS из, поэтому нам нужно настроить сеть.
проходить docker network create
Команды могут быть настроены по сети режим, командная строка выглядит следующим образом:
Посмотреть дальше docker network create
Команда Использовать детали, найти можно --driver
обозначениесетевой режим и по умолчанию bridge
сетевой режиме, подсказка такая:
Создать на основе bridge
сетевой режимиз Настроитьсетевой режим custom_network
,Полная команда выглядит следующим образом:
docker network create custom_network
проходить docker network ls
Проверятьсетевой режим:
[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
создаватьконтейнер:
docker run -di --name bbox05 --net custom_network busybox
проходить docker inspect Имя контейнера|ID
Посмотреть информацию о контейнеризсете можно на NetworkSettings
Подробную информацию можно увидеть в узле.
проходить docker network connect имя сети контейнеримя
Подключите новую изсетевую систему для контейнера режим。
docker network connect bridge bbox05
проходить docker inspect Имя контейнера|ID
Еще раз проверьте информацию о контейнере и добавьте значение по умолчанию. bridge
。
проходить docker network disconnect имя сети контейнеримя
Команда отключения от сети.
docker network disconnect custom_network bbox05
проходить docker inspect Имя контейнера|ID
Проверьте информацию о контейнере еще раз и обнаружите, что осталось только значение по умолчанию. bridge
。
Можетпроходить docker network rm имя сети
Команда для удаления пользовательской сети режим,сетевой режим Если удаление пройдет успешно, сеть будет возвращена. режимимя。
docker network rm custom_network
ПРИМЕЧАНИЕ. Если используется пользовательская сеть режим Созданныйконтейнер,тогдасетевой режимникто Законудалить.
Далее мы реализуем связь между контейнером и изсетом на основе полученных знаний. Прежде всего, проясните,контейнеры должны сообщаться друг с другом,Должны быть сетевые карты, принадлежащие одной сетииз.
Начнем с двух значений по умолчанию, основанных на bridge
сетевой режимизконтейнер。
docker run -di --name default_bbox01 busybox
docker run -di --name default_bbox02 busybox
проходить docker network inspect bridge
Посмотреть два конкретных контейнера IP информация.
Затем проверьте, может ли осуществляться связь между двумя контейнерами.
проверено,В результате два человека, принадлежащие к одной сетиизконтейнер, могут общаться в сетииз,нода IP адресвозможныйда Не исправленоиз,Произошли изменения,Чтоконтейнер Все внутрикоммуникацияиз IP адрес тоже надо поменять,Могу ли я связаться с именем использоватьконтейнер? Продолжайте тестирование.
проверено,в результате не возможно связаться с использованиемконтейнериз,Итак, как реализовать эту функцию?
от Docker 1.10 Версия запускается, докер daemon Реализован встроенный из DNS сервер, чтобы контейнер мог напрямую взаимодействовать с именем передаваемогоконтейнера. Метод очень простой, просто сделайте это, когда создадитеконтейнериспользовать. --name
Просто дайте ему имя.
нодаиспользовать Docker DNS Существует предел:может быть только user-defined сетьсерединаиспользовать。То естьдаобъяснять,по умолчаниюиз bridge сетьданикто Закониспользовать DNS из, поэтому нам нужно настроить сеть.
Сначала мы основываемся на bridge
сетевой режимсоздавать Настроитьсеть custom_network
,Затемсоздавать два на основе пользовательского сетевого режимаизконтейнера.
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 информация.
Затем проверяется, может ли сетевая связь осуществляться между двумя контейнерами, и соответственно использовать определенное IP-имя иконтейнера для сетевой связи.
проверено,В результате два человека, принадлежащие к одной пользовательской сетиизконтейнера, могут общаться в сетииз,А общаться можно под именем «использоватьконтейнер».
Тогда, если в это время я надеюсь bridge
сеть Внизизконтейнер Можети custom_network
Как запустить сеть под изконтейнер? На самом деле ответ очень прост: пусть bridge
сеть Внизизконтейнер Подключайтесь к новым из custom_network
Просто сеть.
docker network connect custom_network default_bbox01