Введение
В этом лабораторном занятии вы научитесь эффективно управлять сетями контейнеров с помощью команды docker network create. Мы рассмотрим различные типы сетей и их конфигурации, чтобы понять, как контейнеры общаются между собой и с внешним миром.
В частности, вы получите практический опыт создания базовых мостовых сетей, настройки мостовых сетей с определенными подсетими и шлюзами, а также настройки присоединяемых и внутренних overlay-сетей (сетей наложения) для сценариев многохостовой коммуникации. По завершении этого лабораторного занятия вы будете хорошо понимать, как проектировать и реализовывать различные топологии сетей для своих Docker-контейнеров.
Создание простой мостовой сети
На этом этапе мы научимся создавать базовую мостовую сеть в 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 для различных сценариев развертывания.



