Главная/Docker Networking/Обзор

Раздел 8. Docker Networking

Этот раздел объясняет, как Docker использует Linux network namespaces, virtual Ethernet pairs, bridges, routing и NAT — и почему из-за непонимания этих механизмов возникает самая частая проблема в контейнеризованных приложениях: «порт опубликован, но сервис недоступен».

Каждый container получает собственный сетевой стек: свои интерфейсы, свою таблицу маршрутизации, свои правила фильтрации. Он соединён с host через veth pair, один конец которого подключён к bridge. Публикация порта — это правило DNAT, а не «открытие порта». Слово localhost внутри container означает сам container, а не host. Всё это следствия одного факта: сетевой namespace изолирован.

Раздел даёт не только модель, но и методику диагностики: последовательность проверок от процесса внутри container до правила в netfilter.

Цели обучения

После раздела учащийся сможет:

  • объяснить, из чего состоит сетевой стек container: namespace, veth pair, bridge, routing;
  • назвать различия default bridge и user-defined bridge и объяснить, почему второй предпочтителен;
  • объяснить, что происходит при -p 8080:80, и найти соответствующее правило в netfilter;
  • различать published и exposed ports и объяснить, что EXPOSE не публикует порт;
  • использовать встроенный DNS Docker и network aliases для service discovery;
  • объяснить, почему приложение, слушающее 127.0.0.1, недоступно снаружи container;
  • выбрать network mode: bridge, host, none — и назвать последствия каждого;
  • объяснить, что такое host.docker.internal и почему в Linux он требует явной настройки;
  • изолировать группы сервисов через отдельные networks;
  • диагностировать сетевую проблему по воспроизводимой последовательности проверок.

Предварительные знания

Материалы

  1. Основы Docker networking
    Network namespace container. Virtual Ethernet pair и как он соединяет namespace с host. Bridge docker0. Таблица маршрутизации внутри container. Типы сетей Docker и критерии выбора. Схема прохождения пакета.

  2. Bridge networks
    Default bridge и его ограничения. User-defined bridge: автоматический DNS, изоляция, подключение и отключение на лету. Создание сети, выбор подсети, docker network inspect. Подключение container к нескольким сетям.

  3. Port publishing
    -p и --publish: полный синтаксис, привязка к конкретному адресу host, диапазоны, ephemeral ports. Правила DNAT в iptables или nftables. Разница между EXPOSE, --expose и -p. Почему приложение должно слушать 0.0.0.0. Проверка через ss и docker port.

  4. Docker DNS
    Встроенный DNS-резолвер на 127.0.0.11. Разрешение имён по имени сервиса и по имени container. Network aliases. Настройка --dns и --dns-search. Диагностика разрешения имён изнутри container. Почему DNS не работает в default bridge.

  5. Network modes
    bridge, host, none, container:<name>. Что даёт и что отнимает каждый режим. Обзор overlay networks для многохостовых сценариев. IPv6 в Docker как дополнительная тема. host.docker.internal в Linux.

  6. Диагностика
    Методика от симптома к причине: слушает ли процесс, на каком адресе, доступен ли изнутри, доступен ли из соседнего container, доступен ли с host, есть ли правило DNAT. Инструменты внутри container без установки лишнего. Разбор пяти типичных ошибок, включая неверное использование localhost.

  7. Практические задания
    Лабораторные задания раздела с проверкой результата.

Рекомендуемый порядок чтения

Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → exercises.

Урок 06 стоит перечитать после раздела 09. Docker Compose: большинство сетевых проблем проявляются именно в многосервисных конфигурациях.

Практические задания

ЗаданиеТип
1Создать user-defined network, подключить два containers, проверить связь по имениобяз.
2Опубликовать порт FastAPI-приложения и проверить доступность через curl с hostобяз.
3Запустить приложение, слушающее 127.0.0.1, воспроизвести недоступность и исправитьобяз.
4Показать сетевые интерфейсы внутри container и найти парный veth на hostобяз.
5Сравнить поведение DNS в default bridge и в user-defined bridgeобяз.
6Найти правило DNAT, созданное публикацией портадоп.
7Запустить container в режиме host и объяснить, куда делась публикация портовдоп.
8Изолировать базу данных в отдельной сети так, чтобы она была недоступна из web-сетидоп.
9Приложение в container обращается к localhost:5432 и не находит PostgreSQL. Объяснить и исправитьдиаг.
10Войти в network namespace container с host через nsenter и выполнить в нём ss -tlnp

Полные формулировки — в exercises.md.

Критерии завершения раздела

Раздел пройден, когда учащийся может без подсказок:

  1. Нарисовать путь пакета от curl на host до процесса внутри container.
  2. Объяснить, почему EXPOSE 8000 в Dockerfile не делает порт доступным с host.
  3. Объяснить, что означает localhost внутри container, и назвать корректную альтернативу.
  4. Связать два сервиса по имени и объяснить, какой компонент разрешает это имя.
  5. Провести диагностику недоступного сервиса по шагам, не угадывая.
  6. Назвать два последствия использования --network=host.

Проверьте себя: Quiz 08. Затем выполните Проект 2. FastAPI service.

Что дальше

Мы умеем собирать образы, хранить данные и связывать сервисы вручную. Следующий раздел заменяет длинные команды docker run декларативным описанием всей системы.

Навигация

Диаграмма: топология сети

← Предыдущий раздел: Storage
Вернуться к главному оглавлению
Следующий раздел: Docker Compose →

Markdown на GitHub ↗