[Серия Docker] Docker изучает восемь, интересная сеть Docker

задняя часть Docker
[Серия Docker] Docker изучает восемь, интересная сеть Docker

Это 10-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

[Серия Docker] Docker изучает восемь, сеть Docker

Начало работы с докером

Во-первых, давайте подумаем о, Как хост взаимодействует с контейнером?

Сказал, что контейнеры изолированы друг от друга, могут ли они общаться? Как это передается?

начать исследовать

Давайте сначала посмотрим, что есть в зеркалах в нашем окружении.xmtubuntu

# docker images
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
xmtubuntu             latest    c3e95388a66b   38 seconds ago   114MB

Давайте посмотрим на информацию о сетевой карте хоста.

ip addr Для просмотра информации о сетевой карте нашего хоста

мы обнаружили, что существует docker0, так как на нашем хосте установлен сервис docker, docker сгенерирует мне виртуальную сетевую карту, вот эта на картинкеdocker0информация о виртуальной сетевой карте

Создайте и запустите докер с именем ubuntu1.

docker run -it --name ubuntu1 -P xmtubuntu

Проверьте информацию о сетевой карте хоста

Просмотр информации о сетевой карте хоста

Проверьте еще разubuntu1Информация о сетевом адаптере, docker также будет назначать наш контейнер по умолчаниюipадрес

Вы можете найти информацию о сетевой карте хостаdocker0больше ниже117: veth838e165@if116:,ubuntu1Информация о сетевой карте также имеет116: eth0@if117

мы нашли этоvethЧисла появляются парами, и наш хост можетubuntu1 сообщил

Используйте хост-компьютер (docker0) иubuntu1пинговать друг друга

docker0 pingubuntu1 ok

ubuntu1pingdocker0 , то же ок

Мы можем попробовать создать и запустить докер с именем ubuntu2, метод точно такой же, как и выше.

# docker run -it -P --name ubuntu2 xmtubuntu

в контейнер, используйтеip aПосмотреть наubuntu2информация о сетевой карте

Просмотр сетевой информации на хосте

На хосте есть еще один вет,119: veth0b29558@if118

ubuntu2Информация о сетевой карте на118: eth0@if119, они тоже появляются парами, мои друзья должны понять, когда увидят это

ubuntu1 ping ubuntu2Шерстяная ткань?

Ubuntu1 соответствует 172.18.0.2

Ubuntu2 соответствует 172.18.0.3

# docker exec -it ubuntu1 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.070 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.077 ms

Еще можно общаться, очень приятно

Каков принцип?

В приведенном выше исследовании мы обнаружили, что контейнеры, созданные хостом, могут быть напрямуюpingЧерез хост, какой у них принцип?

Внимательный xdm должен увидеть, что в приведенном выше примереvethОн поставляется парами, и вышеупомянутые хосты и контейнеры могут общаться по сети благодаря этой технологии.veth-pair

veth-pair

**veth-pair** — это пара интерфейсов виртуальных устройств, все они появляются парами, один подключен к протоколу, а другой — друг к другу

Именно благодаря этой особенностиveth-pairЗдесь он действует как мост для подключения различных виртуальных устройств.

Из вышеприведенного рисунка мы можем сделать следующие выводы:

  • ubuntu1а такжеubuntu2У них есть общий маршрутизатор, который является docker0, ubuntu1 можетpingПроходятubuntu2Потому что docker0 помогает ему двигаться вперед
  • Все контейнеры используют docker0 в качестве маршрута без указания маршрута, и docker также назначит нашему контейнеру доступный ip
  • docker0 будет существовать, когда на хосте будет установлена ​​служба docker.

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

Все сетевые интерфейсы в Docker являются виртуальными, потому что эффективность виртуальной переадресации высока.Когда мы удаляем контейнер, информация о сетевой карте, соответствующая контейнеру, также будет удалена.

Тогда мы можем подумать о, если оба получаются путем нахожденияipадрес для связи, еслиipИзменено, так что мы не можем найти нужный контейнер? Можем ли мы получить доступ к контейнеру по имени службы?

--связь

Конечно можно, когда мы создаем и запускаем контейнер, добавляем–linkможно добиться этого эффекта

Давайте создадим еще один контейнерubuntu3, пусть ссылается наubuntu2

# docker run -it --name ubuntu3 -P --link ubuntu2 xmtubuntu

# docker exec -it ubuntu3 ping ubuntu2
PING ubuntu2 (172.18.0.3) 56(84) bytes of data.
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=3 ttl=64 time=0.092 ms
64 bytes from ubuntu2 (172.18.0.3): icmp_seq=4 ttl=64 time=0.073 ms

Очевидно, мы можем видетьubuntu3 наименование услугиubuntu2 прямо иubuntu2общение, но возможно ли обратное?

# docker exec -it ubuntu2 ping ubuntu3
ping: ubuntu3: Name or service not known

нет? Почему это?

Давайте проверим этоubuntu3 местный/etc/hosts файл чист

Видя это, это ясно о принципе ссылки, т. е. по-своему/etc/hosts файл, добавьтеhostНа этом все, мы все можем знать об этой точке знаний, но эту ссылку все равно легко тереть, не хорошо, ее нужно использовать при создании и запуске контейнера, что неудобно для использования.

Так у нас есть лучший способ?

пользовательская сеть

можно использоватьdocker network lsПроверьте состояние сети хост-докера

:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
8317183dfc58   bridge    bridge    local
997107487c6b   host      host      local
ab130876cbe6   none      null      local

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

  • bridge

Bridge, docker0 по умолчанию использует имя bridge.

  • host

поделиться сетью с хостом

  • none

Сеть не настроена

  • container

Контейнерная сеть подключена, этот режим используется очень редко из-за его больших ограничений.

Теперь мы можем настроить сеть для соединения двух контейнеров.

пользовательская сеть

пользовательскийmynetИнтернет

# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
9a597fc31f1964d434181907e21ff7010738f3f7dc35ba86bf7434f05a6afc4a
  • docker network create

создать сеть

  • --driver

Указанный драйвер является мостом

  • --subnet

Укажите подсеть

  • --gateway

Указать шлюз

Здесь мы устанавливаем подсеть --subnet 192.168.0.0/16, шлюз есть192.168.0.1, то у нас остается то, что мы можем использоватьipто есть192.168.0.2 – 192.168.255.254,192.168.255.255это широковещательный адрес

Пустые существующие контейнеры

Опустошите все проверенные контейнеры, минус помехи

Создайте и запустите 2 контейнера, ubuntu1 и ubuntu2

# docker run -it -P --name ubuntu1 --net mynet xmtubuntu
# docker run -it -P --name ubuntu2 --net mynet xmtubuntu

На этом этапе мы можем проверить информацию о сетевой карте хоста и проверить, могут ли два контейнера взаимодействовать напрямую через имя контейнера.

Давайте подумаем о преимуществах пользовательских сетей

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

Например

Куча контейнеров Redis, использующих сетевой сегмент 192.168.0.0/16, шлюз 192.168.0.1

Куча контейнеров mongodb, использующих сетевой сегмент 192.167.0.0/16, шлюз 192.167.0.1

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

Так можно ли подключить подсети?

подключение к сети

Как связаны контейнеры в двух разных подсетях?

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

Но у нас есть способ позволить контейнеру ubuntu3 пройти через mynet, а затем перенаправить его на ubuntu1 или ubuntu2.

Пройти через подсеть

Смотрим справку docker network

docker network -h

image-20210807203841520

можно использоватьdocker network connect Реализация команды, см. справочную документацию

# docker network connect -h
Flag shorthand -h has been deprecated, please use --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

начать проходить

docker network connect mynet ubuntu3

В это время мы можем просмотреть детали сети mynet

# docker network inspect mynet

Вы можете видеть, что в сети mynet был добавлен еще один контейнер, и IP-адрес 192.168.0.4.

Правильно, докер обрабатывает такое сетевое соединение так просто и грубо, добавляя виртуальную сетевую карту прямо в контейнер ubuntu3, чтобы ubuntu3 могла подключаться к сети mynet

Конечно, у хоста есть еще один соответствующийveth

![](git ee.com/common_Dev/… master/image-20210807204514806.png)

Теперь для работы чужого контейнера по сети мы можем использоватьdocker network connectспособ пройти через сеть и начать работать

Вы все еще интересуетесь сетью? Ха-ха, ссылки на предыдущие статьи о докере следующие, вы можете узнать шаг за шагом, углубиться и просмотреть больше

[Серия Docker] Docker Learning 5, давайте посмотрим, что такое объем данных контейнера

[Серия Docker] Обучение Docker 4. Изучите принципы зеркалирования вместе

[Серия Docker] обучение докеру 3, предварительный бой с докером и пробная версия инструмента визуального управления докером

[Серия Docker] обучение докеру 2, общие команды докера, команды изображения, команды контейнера, другие команды

[Серия Docker] Обучение Docker 1. Установка и использование Docker и основной принцип работы Docker | Вызов в августе

Использованная литература:

docker docs

Добро пожаловать лайк, подписка, избранное

Друзья, ваша поддержка и поощрение мотивируют меня продолжать делиться и улучшать качество.

Хорошо, вот и на этот раз

Технологии открыты, и наш менталитет должен быть открытым. Примите перемены, живите на солнце и двигайтесь вперед.

ямаленький дьяволенок Нежа, добро пожаловать, лайкайте, подписывайтесь и добавляйте в избранное, увидимся в следующий раз~