Как использовать команду docker network create для управления сетями контейнеров

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии вы научитесь эффективно управлять сетями контейнеров с помощью команды docker network create. Мы рассмотрим различные типы сетей и их конфигурации, чтобы понять, как контейнеры общаются между собой и с внешним миром.

В частности, вы получите практический опыт создания базовых мостовых сетей, настройки мостовых сетей с определенными подсетими и шлюзами, а также настройки присоединяемых и внутренних overlay-сетей (сетей наложения) для сценариев многохостовой коммуникации. По завершении этого лабораторного занятия вы будете хорошо понимать, как проектировать и реализовывать различные топологии сетей для своих Docker-контейнеров.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/ls -.-> lab-555174{{"Как использовать команду docker network create для управления сетями контейнеров"}} docker/rm -.-> lab-555174{{"Как использовать команду docker network create для управления сетями контейнеров"}} docker/exec -.-> lab-555174{{"Как использовать команду docker network create для управления сетями контейнеров"}} docker/inspect -.-> lab-555174{{"Как использовать команду docker network create для управления сетями контейнеров"}} docker/network -.-> lab-555174{{"Как использовать команду docker network create для управления сетями контейнеров"}} end

Создание базовой мостовой сети

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

Сначала выведем список существующих Docker-сетей, чтобы увидеть сети по умолчанию.

docker network ls

Вы должны увидеть некоторые сети по умолчанию, такие как bridge, host и none. Сеть bridge - та, с которой мы будем работать.

Теперь создадим новую мостовую сеть. Назовем ее my-bridge-network.

docker network create my-bridge-network

Эта команда создает новую мостовую сеть с настройками по умолчанию. Docker автоматически назначает подсеть и шлюз для этой сети.

Чтобы убедиться, что сеть успешно создана, выведем список Docker-сетей еще раз.

docker network ls

Теперь вы должны увидеть my-bridge-network в списке.

Далее, изучим детали только что созданной сети, в том числе подсеть и шлюз, назначенные Docker.

docker network inspect my-bridge-network

Вывод этой команды предоставит подробную информацию о сети, такую как ее идентификатор, драйвер (который должен быть bridge), а также подсеть и шлюз в разделе IPAM.

Теперь запустим контейнер и подключим его к нашей новой сети. В этом примере мы будем использовать образ alpine. Если у вас нет образа alpine локально, Docker автоматически загрузит его.

docker run -d --name container1 --network my-bridge-network alpine sleep infinity

Эта команда запускает контейнер с именем container1 в фоновом режиме (-d), подключает его к my-bridge-network (--network my-bridge-network) и поддерживает его работу, выполняя команду sleep infinity.

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

docker inspect container1

В выводе найдите раздел Networks. Вы должны увидеть my-bridge-network в списке, а также IP-адрес, назначенный контейнеру в этой сети.

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

docker run -d --name container2 --network my-bridge-network alpine sleep infinity

Теперь и container1, и container2 подключены к my-bridge-network. Они должны иметь возможность общаться между собой, используя имена контейнеров или их IP-адреса в сети.

Чтобы проверить взаимодействие, мы можем выполнить команду внутри container1 для отправки пингов container2. Сначала нам нужно установить пакет iputils в контейнерах alpine, чтобы использовать команду ping.

docker exec container1 apk add --no-cache iputils
docker exec container2 apk add --no-cache iputils

Теперь отправим пинги от container1 к container2.

docker exec container1 ping -c 3 container2

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

Создание мостовой сети с пользовательской подсетью и шлюзом

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

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

docker stop container1 container2
docker rm container1 container2
docker network rm my-bridge-network

Теперь создадим новую мостовую сеть с именем custom-bridge-network и укажем пользовательскую подсеть и шлюз с помощью флагов --subnet и --gateway. Мы будем использовать подсеть 172.20.0.0/16 и шлюз 172.20.0.1.

docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  custom-bridge-network

Флаг --driver bridge явно указывает на использование драйвера мостовой сети, хотя это и является значением по умолчанию. Флаг --subnet определяет диапазон IP-адресов для сети, а флаг --gateway устанавливает IP-адрес шлюза для контейнеров, подключенных к этой сети.

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

docker network inspect custom-bridge-network

В выводе найдите раздел IPAM. Вы должны увидеть поля Subnet и Gateway, соответствующие значениям, которые вы указали (172.20.0.0/16 и 172.20.0.1).

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

docker run -d --name custom-container1 --network custom-bridge-network alpine sleep infinity

Эта команда запускает контейнер с именем custom-container1 и подключает его к custom-bridge-network. Docker назначит этому контейнеру IP-адрес из указанной подсети (172.20.0.0/16).

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

docker inspect custom-container1

В выводе, в разделе Networks для custom-bridge-network, вы должны увидеть IpAddress, который входит в диапазон 172.20.0.0/16.

Запустим еще один контейнер на той же сети.

docker run -d --name custom-container2 --network custom-bridge-network alpine sleep infinity

Теперь и custom-container1, и custom-container2 находятся в сети custom-bridge-network и должны иметь возможность общаться.

Как и на предыдущем этапе, нам нужен пакет iputils для отправки пингов.

docker exec custom-container1 apk add --no-cache iputils
docker exec custom-container2 apk add --no-cache iputils

Проверьте взаимодействие, отправив пинги от custom-container1 к custom-container2.

docker exec custom-container1 ping -c 3 custom-container2

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

Создание присоединяемой overlay-сети для межхостового взаимодействия

Мостовые сети подходят для взаимодействия между контейнерами на одном и том же Docker-хосте. Однако, для взаимодействия между контейнерами, запущенными на разных Docker-хостах, вам нужна overlay-сеть. Overlay-сети создаются и управляются с помощью Docker Swarm.

На этом этапе мы создадим присоединяемую overlay-сеть. Присоединяемая overlay-сеть позволяет автономным контейнерам (не являющимся частью сервиса Swarm) подключаться к ней и взаимодействовать между разными Docker-хостами.

Сначала нам нужно инициализировать Docker Swarm на этом хосте. Это необходимо для создания и управления overlay-сетями.

docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')

Эта команда инициализирует Swarm и устанавливает адрес для объявления равным IP-адресу хоста. В выводе будет показано, что текущий узел теперь является менеджером Swarm.

Теперь, когда Swarm инициализирован, мы можем создать присоединяемую overlay-сеть. Назовем ее my-overlay-network. Флаг --attachable является ключевым для разрешения подключения автономных контейнеров.

docker network create \
  --driver overlay \
  --attachable \
  my-overlay-network

Флаг --driver overlay указывает, что мы создаем overlay-сеть. Флаг --attachable делает сеть доступной для автономных контейнеров.

Чтобы убедиться, что overlay-сеть была создана, выведите список Docker-сетей.

docker network ls

Вы должны увидеть my-overlay-network в списке, и ее драйвер должен быть overlay.

Теперь запустим автономный контейнер и подключим его к нашей новой overlay-сети. Мы будем использовать образ alpine.

docker run -d --name overlay-container1 --network my-overlay-network alpine sleep infinity

Эта команда запускает контейнер с именем overlay-container1 и подключает его к my-overlay-network.

Чтобы убедиться, что контейнер подключен к overlay-сети, изучим информацию о контейнере.

docker inspect overlay-container1

В выводе найдите раздел Networks. Вы должны увидеть my-overlay-network в списке.

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

Запустим еще один контейнер на той же overlay-сети на этом одном хосте.

docker run -d --name overlay-container2 --network my-overlay-network alpine sleep infinity

Теперь и overlay-container1, и overlay-container2 находятся в сети my-overlay-network и должны иметь возможность взаимодействовать.

Установите пакет iputils в контейнерах для отправки пингов.

docker exec overlay-container1 apk add --no-cache iputils
docker exec overlay-container2 apk add --no-cache iputils

Проверьте взаимодействие, отправив пинги от overlay-container1 к overlay-container2.

docker exec overlay-container1 ping -c 3 overlay-container2

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

Создание внутренней overlay-сети

На предыдущем этапе мы создали присоединяемую overlay-сеть, которая позволяет автономным контейнерам подключаться. На этом этапе мы создадим внутреннюю overlay-сеть. Внутренние сети изолированы от внешних сетей, что означает, что контейнеры в внутренней сети не могут взаимодействовать с внешним миром (включая сеть Docker-хоста), если это явно не разрешено. Это полезно для создания изолированных сетей сервисов в рамках Swarm.

Сначала очистим контейнеры и сеть с предыдущего этапа.

docker stop overlay-container1 overlay-container2
docker rm overlay-container1 overlay-container2
docker network rm my-overlay-network

Теперь создадим внутреннюю overlay-сеть с именем my-internal-network. Для этого используем флаг --internal.

docker network create \
  --driver overlay \
  --internal \
  my-internal-network

Флаг --internal гарантирует, что контейнеры, подключенные к этой сети, не могут взаимодействовать с внешними сетями.

Чтобы убедиться, что внутренняя overlay-сеть была создана, выведите список Docker-сетей.

docker network ls

Вы должны увидеть my-internal-network в списке с драйвером overlay.

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

docker run -d --name internal-container1 --network my-internal-network alpine sleep infinity

Эта команда запускает контейнер с именем internal-container1 и подключает его к my-internal-network.

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

docker inspect internal-container1

В выводе найдите раздел Networks. Вы должны увидеть my-internal-network в списке.

Запустим еще один контейнер на той же внутренней сети.

docker run -d --name internal-container2 --network my-internal-network alpine sleep infinity

Теперь и internal-container1, и internal-container2 находятся в сети my-internal-network. Они должны иметь возможность взаимодействовать друг с другом, но не с внешним миром.

Установите пакет iputils в контейнерах для отправки пингов.

docker exec internal-container1 apk add --no-cache iputils
docker exec internal-container2 apk add --no-cache iputils

Проверьте взаимодействие, отправив пинги от internal-container1 к internal-container2.

docker exec internal-container1 ping -c 3 internal-container2

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

Теперь попробуем отправить пинг на внешний адрес, например google.com, из internal-container1.

docker exec internal-container1 ping -c 3 google.com

Этот пинг должен неудаваться, так как внутренняя сеть изолирована от внешних сетей.

Резюме

В этом практическом занятии мы научились использовать команду docker network create для управления сетями контейнеров. Мы начали с создания простой мостовой сети, которая является типом сети по умолчанию для контейнеров, и проверили ее создание и детали с помощью команд docker network ls и docker network inspect. Затем мы показали, как подключить контейнер к только что созданной сети.

На основе простой мостовой сети мы рассмотрели создание мостовой сети с пользовательским подсетью и шлюзом, чтобы иметь больше контроля над IP-адресацией сети. Наконец, мы углубились в создание overlay-сетей, а именно присоединяемой overlay-сети для межхостового взаимодействия и внутренней overlay-сети для изолированного взаимодействия в рамках кластера Swarm, продемонстрировав гибкость сетевого взаимодействия Docker для различных сценариев развертывания.