Лаб. работа "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. Изучение существующих сетей

  1. Просмотр доступных сетей Посмотрите список всех сетей, доступных в Docker:

    1docker network ls
    

    Вы должны увидеть три стандартные сети: bridge, host и none.

  2. Детальная информация о сетях Получите подробную информацию о стандартной сети bridge:

    1docker network inspect bridge
    

    Обратите внимание на параметры сети, подсеть, шлюз и подключенные контейнеры.

Часть 2. Создание и управление пользовательскими сетями

  1. Создание пользовательской сети Создайте новую сеть типа bridge с пользовательскими параметрами:

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

    Проверьте, что сеть создана:

    1docker network ls
    
  2. Просмотр информации о созданной сети Получите детальную информацию о вашей новой сети:

    1docker network inspect my-custom-network
    

    Найдите информацию о подсети, шлюзе и конфигурации IPAM.

Часть 3. Работа с контейнерами в пользовательской сети

  1. Запуск контейнеров в пользовательской сети Запустите два контейнера в вашей пользовательской сети:

    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
    
  2. Тестирование сетевой связи по именам Подключитесь к контейнеру client и проверьте связь с web-server по имени:

    1docker exec -it client sh
    2
    3# Внутри контейнера выполните:
    4ping web-server
    5nslookup web-server
    6wget -O- http://web-server
    7exit
    

    Обратите внимание, что Docker автоматически обеспечивает DNS-резолюцию имен контейнеров в пользовательской сети.

  3. Проверка IP-адресов контейнеров Узнайте IP-адреса контейнеров:

    1docker inspect web-server | grep IPAddress
    2docker inspect client | grep IPAddress
    

    Убедитесь, что адреса находятся в диапазоне вашей подсети (172.20.0.0/16).

Часть 4. Назначение статических IP-адресов

  1. Запуск контейнера с статическим 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
    
  2. Проверка назначенных IP Проверьте, что контейнерам назначены указанные IP-адреса:

    1docker inspect web-server | grep IPAddress
    2docker inspect client | grep IPAddress
    

Часть 5. Работа с портами и пробросом

  1. Запуск контейнера с пробросом портов Запустите веб-сервер с пробросом порта на хост:

    1docker run -d --name public-web -p 8080:80 --network my-custom-network nginx:alpine
    
  2. Проверка доступности сервиса Проверьте, что веб-сервер доступен на хосте:

    1curl http://localhost:8080
    

    Также проверьте доступность из другого контейнера в той же сети:

    1docker exec client wget -O- http://public-web
    

Часть 6. Изоляция сетей

  1. Создание изолированных сетей Создайте две отдельные сети:

    1docker network create --driver bridge frontend-network
    2docker network create --driver bridge backend-network
    
  2. Запуск контейнеров в разных сетях Запустите контейнеры в разных сетях:

    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
    
  3. Проверка изоляции Попробуйте установить связь между контейнерами из разных сетей:

    1docker exec frontend-app ping backend-db
    

    Соединение должно быть невозможно, что демонстрирует сетевую изоляцию.

Часть 7. Подключение контейнера к нескольким сетям

  1. Подключение существующего контейнера к другой сети Подключите frontend-app к backend-network:

    1docker network connect backend-network frontend-app
    
  2. Проверка межсетевого взаимодействия Теперь проверьте связь между контейнерами:

    1docker exec frontend-app ping backend-db
    

    Связь должна работать, так как frontend-app теперь подключен к обеим сетям.

Часть 8. Очистка окружения

  1. Остановка и удаление всех контейнеров Остановите и удалите все созданные контейнеры:

    1docker stop $(docker ps -q)
    2docker rm $(docker ps -aq)
    
  2. Удаление пользовательских сетей Удалите созданные сети:

    1docker network rm my-custom-network frontend-network backend-network
    

    Проверьте, что остались только стандартные сети:

    1docker network ls
    

Задания для самостоятельного выполнения

  1. Создание сети для микросервисов Создайте сеть 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.

  2. Настройка сетевой изоляции Создайте две сети: public-net и private-net. В public-net разместите nginx-сервер с пробросом порта 8080. В private-net разместите контейнер с PostgreSQL. Убедитесь, что из внешней сети можно достучаться только до nginx, но не до PostgreSQL напрямую.

  3. Исследование DNS-резолюции Запустите контейнер alpine в пользовательской сети. Используйте команды nslookup и dig (установите при необходимости) для исследования DNS-резолюции имен контейнеров. Проверьте, какие DNS-записи создает Docker автоматически.

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

  5. Мониторинг сетевого трафика Используйте команду docker network inspect для мониторинга сетевого трафика между контейнерами. Запустите несколько контейнеров и создайте сетевую нагрузку между ними с помощью ping, wget или curl. Проанализируйте, как изменяется статистика сети.

Контрольные вопросы

  1. Какие типы сетевых драйверов доступны в Docker и в чем их различие?
  2. В чем преимущество использования пользовательских сетей перед стандартной сетью bridge?
  3. Как Docker обеспечивает DNS-резолюцию имен контейнеров в пользовательских сетях?
  4. Как назначить контейнеру статический IP-адрес при запуске?
  5. Что такое сетевая изоляция в Docker и как ее реализовать?
  6. Как подключить существующий контейнер к дополнительной сети?
  7. Почему важно правильно планировать сетевую архитектуру при развертывании микросервисов?

Требования к отчету

Отчет по лабораторной работе должен содержать:

  1. Титульный лист
  2. Цель работы
  3. Пошаговое описание выполнения работы с приведением всех вводимых команд и их выводов (можно в виде скриншотов или текстовых блоков)
  4. Вывод, в котором необходимо кратко описать полученные знания и навыки
  5. Описание выполненных заданий для самостоятельной работы
← Лаб. работа "Основы Docker. Управление … Лаб. работа \"Docker: Образы\" →