Это 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
ubuntu1
pingdocker0
, то же ок
Мы можем попробовать создать и запустить докер с именем 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
можно использовать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. Изучите принципы зеркалирования вместе
Использованная литература:
Добро пожаловать лайк, подписка, избранное
Друзья, ваша поддержка и поощрение мотивируют меня продолжать делиться и улучшать качество.
Хорошо, вот и на этот раз
Технологии открыты, и наш менталитет должен быть открытым. Примите перемены, живите на солнце и двигайтесь вперед.
ямаленький дьяволенок Нежа, добро пожаловать, лайкайте, подписывайтесь и добавляйте в избранное, увидимся в следующий раз~