Раздел 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;
- диагностировать сетевую проблему по воспроизводимой последовательности проверок.
Предварительные знания
- Раздел 04. Containers и lifecycle — запуск и
exec; - Раздел 02. Основы Containerization — что такое namespace;
- базовое понимание TCP/IP: IP-адрес, порт, маршрут, что делает
curl; - Раздел 06 желательно — примеры используют FastAPI.
Материалы
-
Основы Docker networking
Network namespace container. Virtual Ethernet pair и как он соединяет namespace с host. Bridgedocker0. Таблица маршрутизации внутри container. Типы сетей Docker и критерии выбора. Схема прохождения пакета. -
Bridge networks
Default bridge и его ограничения. User-defined bridge: автоматический DNS, изоляция, подключение и отключение на лету. Создание сети, выбор подсети,docker network inspect. Подключение container к нескольким сетям. -
Port publishing
-pи--publish: полный синтаксис, привязка к конкретному адресу host, диапазоны, ephemeral ports. Правила DNAT вiptablesилиnftables. Разница междуEXPOSE,--exposeи-p. Почему приложение должно слушать0.0.0.0. Проверка черезssиdocker port. -
Docker DNS
Встроенный DNS-резолвер на127.0.0.11. Разрешение имён по имени сервиса и по имени container. Network aliases. Настройка--dnsи--dns-search. Диагностика разрешения имён изнутри container. Почему DNS не работает в default bridge. -
Network modes
bridge,host,none,container:<name>. Что даёт и что отнимает каждый режим. Обзор overlay networks для многохостовых сценариев. IPv6 в Docker как дополнительная тема.host.docker.internalв Linux. -
Диагностика
Методика от симптома к причине: слушает ли процесс, на каком адресе, доступен ли изнутри, доступен ли из соседнего container, доступен ли с host, есть ли правило DNAT. Инструменты внутри container без установки лишнего. Разбор пяти типичных ошибок, включая неверное использованиеlocalhost. -
Практические задания
Лабораторные задания раздела с проверкой результата.
Рекомендуемый порядок чтения
Последовательный: 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.
Критерии завершения раздела
Раздел пройден, когда учащийся может без подсказок:
- Нарисовать путь пакета от
curlна host до процесса внутри container. - Объяснить, почему
EXPOSE 8000вDockerfileне делает порт доступным с host. - Объяснить, что означает
localhostвнутри container, и назвать корректную альтернативу. - Связать два сервиса по имени и объяснить, какой компонент разрешает это имя.
- Провести диагностику недоступного сервиса по шагам, не угадывая.
- Назвать два последствия использования
--network=host.
Проверьте себя: Quiz 08. Затем выполните Проект 2. FastAPI service.
Что дальше
Мы умеем собирать образы, хранить данные и связывать сервисы вручную. Следующий раздел заменяет длинные команды docker run декларативным описанием всей системы.
Навигация
← Предыдущий раздел: Storage
Вернуться к главному оглавлению
Следующий раздел: Docker Compose →