Лаб. работа "Docker: Сети"
Лабораторная работа по теме “Docker: Сети”
Цель работы
Изучить концепции сетевого взаимодействия в Docker. Получить практические навыки создания и управления пользовательскими сетями, настройки связи между контейнерами, понимания различных типов сетевых драйверов и их применения.
Краткие теоретические сведения
Сети Docker — это механизм, который обеспечивает изолированную сетевую связь между контейнерами и между контейнерами и внешним миром. Docker предоставляет несколько типов сетевых драйверов для различных сценариев использования.
Типы сетевых драйверов Docker:
- bridge — стандартный сетевой драйвер для контейнеров. Создает частную внутреннюю сеть на хосте. Контейнеры получают IP-адреса из частного диапазона и могут общаться друг с другом через сетевой мост.
- host — контейнер использует сетевой стек хоста напрямую, без изоляции. Это обеспечивает максимальную производительность, но снижает изоляцию.
- none — отключает весь сетевой функционал для контейнера. Контейнер не имеет сетевых интерфейсов.
- overlay — используется для создания распределенных сетей между несколькими хостами Docker (в Docker Swarm).
- macvlan — позволяет контейнеру получить MAC-адрес и выглядеть как физическое устройство в сети.
Ключевые концепции:
- Docker0 — стандартный сетевой мост, который Docker создает автоматически.
- Пользовательские сети — сети, создаваемые пользователем для лучшей изоляции и управления.
- DNS-резолюция — Docker предоставляет встроенный DNS-сервер для разрешения имен контейнеров внутри пользовательских сетей.
- Порты — механизм проброса портов позволяет сделать сервисы в контейнерах доступными из внешней сети.
Краткий справочник по командам работы с сетями
Основные команды для управления сетями
docker network ls— список всех сетейdocker network create [OPTIONS] NETWORK— создание новой сетиdocker network rm NETWORK— удаление сетиdocker network inspect NETWORK— просмотр детальной информации о сетиdocker network connect NETWORK CONTAINER— подключение контейнера к сетиdocker network disconnect NETWORK CONTAINER— отключение контейнера от сети
Параметры создания сети
--driverили-d— тип сетевого драйвера (bridge, host, none, overlay)--subnet— подсеть в формате CIDR (например, 172.20.0.0/16)--gateway— шлюз для сети--ip-range— диапазон IP-адресов для контейнеров
Параметры запуска контейнера с сетевыми настройками
--network— подключение контейнера к определенной сети--ip— назначение статического IP-адреса контейнеру--hostname— установка hostname для контейнера--link— связывание контейнеров (устаревший метод, лучше использовать пользовательские сети)
Требования к окружению
- Операционная система: Debian 13 “Trixie” или новее
- Docker Engine установлен и настроен
- Доступ в Интернет для загрузки образов
- Учетная запись пользователя без прав
root
Порядок выполнения работы
Часть 1. Изучение существующих сетей
Просмотр доступных сетей Посмотрите список всех сетей, доступных в Docker:
1docker network lsВы должны увидеть три стандартные сети:
bridge,hostиnone.Детальная информация о сетях Получите подробную информацию о стандартной сети bridge:
1docker network inspect bridgeОбратите внимание на параметры сети, подсеть, шлюз и подключенные контейнеры.
Часть 2. Создание и управление пользовательскими сетями
Создание пользовательской сети Создайте новую сеть типа bridge с пользовательскими параметрами:
1docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 my-custom-networkПроверьте, что сеть создана:
1docker network lsПросмотр информации о созданной сети Получите детальную информацию о вашей новой сети:
1docker network inspect my-custom-networkНайдите информацию о подсети, шлюзе и конфигурации IPAM.
Часть 3. Работа с контейнерами в пользовательской сети
Запуск контейнеров в пользовательской сети Запустите два контейнера в вашей пользовательской сети:
1# Запуск первого контейнера с именем 2docker run -d --name web-server --network my-custom-network nginx:alpine 3 4# Запуск второго контейнера для тестирования связи 5docker run -d --name client --network my-custom-network alpine sleep 3600Проверьте, что контейнеры запущены:
1docker psТестирование сетевой связи по именам Подключитесь к контейнеру client и проверьте связь с web-server по имени:
1docker exec -it client sh 2 3# Внутри контейнера выполните: 4ping web-server 5nslookup web-server 6wget -O- http://web-server 7exitОбратите внимание, что Docker автоматически обеспечивает DNS-резолюцию имен контейнеров в пользовательской сети.
Проверка IP-адресов контейнеров Узнайте IP-адреса контейнеров:
1docker inspect web-server | grep IPAddress 2docker inspect client | grep IPAddressУбедитесь, что адреса находятся в диапазоне вашей подсети (172.20.0.0/16).
Часть 4. Назначение статических IP-адресов
Запуск контейнера с статическим IP Остановите и удалите существующие контейнеры, затем запустите новые со статическими IP:
1# Остановка и удаление 2docker stop web-server client 3docker rm web-server client 4 5# Запуск с статическими IP 6docker run -d --name web-server --network my-custom-network --ip 172.20.0.10 nginx:alpine 7docker run -d --name client --network my-custom-network --ip 172.20.0.20 alpine sleep 3600Проверка назначенных IP Проверьте, что контейнерам назначены указанные IP-адреса:
1docker inspect web-server | grep IPAddress 2docker inspect client | grep IPAddress
Часть 5. Работа с портами и пробросом
Запуск контейнера с пробросом портов Запустите веб-сервер с пробросом порта на хост:
1docker run -d --name public-web -p 8080:80 --network my-custom-network nginx:alpineПроверка доступности сервиса Проверьте, что веб-сервер доступен на хосте:
1curl http://localhost:8080Также проверьте доступность из другого контейнера в той же сети:
1docker exec client wget -O- http://public-web
Часть 6. Изоляция сетей
Создание изолированных сетей Создайте две отдельные сети:
1docker network create --driver bridge frontend-network 2docker network create --driver bridge backend-networkЗапуск контейнеров в разных сетях Запустите контейнеры в разных сетях:
1# Frontend сеть 2docker run -d --name frontend-app --network frontend-network nginx:alpine 3 4# Backend сеть 5docker run -d --name backend-db --network backend-network postgres:alpineПроверка изоляции Попробуйте установить связь между контейнерами из разных сетей:
1docker exec frontend-app ping backend-dbСоединение должно быть невозможно, что демонстрирует сетевую изоляцию.
Часть 7. Подключение контейнера к нескольким сетям
Подключение существующего контейнера к другой сети Подключите frontend-app к backend-network:
1docker network connect backend-network frontend-appПроверка межсетевого взаимодействия Теперь проверьте связь между контейнерами:
1docker exec frontend-app ping backend-dbСвязь должна работать, так как frontend-app теперь подключен к обеим сетям.
Часть 8. Очистка окружения
Остановка и удаление всех контейнеров Остановите и удалите все созданные контейнеры:
1docker stop $(docker ps -q) 2docker rm $(docker ps -aq)Удаление пользовательских сетей Удалите созданные сети:
1docker network rm my-custom-network frontend-network backend-networkПроверьте, что остались только стандартные сети:
1docker network ls
Задания для самостоятельного выполнения
Создание сети для микросервисов Создайте сеть
microservices-netс подсетью 10.10.0.0/24. Запустите три контейнера: nginx (веб-сервер), redis (кэш) и postgres (база данных). Убедитесь, что все контейнеры могут достигать друг друга по именам. Назначьте статические IP-адреса: nginx — 10.10.0.10, redis — 10.10.0.20, postgres — 10.10.0.30.Настройка сетевой изоляции Создайте две сети:
public-netиprivate-net. В public-net разместите nginx-сервер с пробросом порта 8080. В private-net разместите контейнер с PostgreSQL. Убедитесь, что из внешней сети можно достучаться только до nginx, но не до PostgreSQL напрямую.Исследование DNS-резолюции Запустите контейнер alpine в пользовательской сети. Используйте команды
nslookupиdig(установите при необходимости) для исследования DNS-резолюции имен контейнеров. Проверьте, какие DNS-записи создает Docker автоматически.Настройка множественных сетевых интерфейсов Создайте контейнер, который будет подключен к трем разным сетям одновременно. Проверьте, какие сетевые интерфейсы создаются внутри контейнера и как маршрутизируется трафик между ними.
Мониторинг сетевого трафика Используйте команду
docker network inspectдля мониторинга сетевого трафика между контейнерами. Запустите несколько контейнеров и создайте сетевую нагрузку между ними с помощьюping,wgetилиcurl. Проанализируйте, как изменяется статистика сети.
Контрольные вопросы
- Какие типы сетевых драйверов доступны в Docker и в чем их различие?
- В чем преимущество использования пользовательских сетей перед стандартной сетью bridge?
- Как Docker обеспечивает DNS-резолюцию имен контейнеров в пользовательских сетях?
- Как назначить контейнеру статический IP-адрес при запуске?
- Что такое сетевая изоляция в Docker и как ее реализовать?
- Как подключить существующий контейнер к дополнительной сети?
- Почему важно правильно планировать сетевую архитектуру при развертывании микросервисов?
Требования к отчету
Отчет по лабораторной работе должен содержать:
- Титульный лист
- Цель работы
- Пошаговое описание выполнения работы с приведением всех вводимых команд и их выводов (можно в виде скриншотов или текстовых блоков)
- Вывод, в котором необходимо кратко описать полученные знания и навыки
- Описание выполненных заданий для самостоятельной работы