Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Сеть в Docker
networking

Сеть в Docker

Типы сетей, изоляция, коммуникация между контейнерами

Сеть в Docker: Полное руководство

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


#Архитектура сети Docker

#Как работает сеть Docker

Docker использует виртуализированную сеть на основе Linux-контейнеров (LXC). При создании контейнера Docker:

  1. Создаёт пару veth-интерфейсов (virtual ethernet) — виртуальный кабель с двумя концами
  2. Один конец помещает в контейнер как eth0
  3. Другой конец подключает к сетевому мосту (bridge) на хосте
  4. Настраивает iptables для NAT и фильтрации трафика
  5. Выделяет IP-адрес из пула сети через встроенный DHCP-сервер

ASCII Diagram

#Ключевые компоненты

КомпонентОписание
veth pairВиртуальный сетевой кабель. Пакет, отправленный в один конец, появляется на другом
docker0Мост по умолчанию, создаваемый при установке Docker
iptablesПравила фильтрации и NAT для маршрутизации трафика
docker-proxyПроцесс, пересылающий трафик с портов хоста в контейнеры
embedded DNSВстроенный DNS-сервер (127.0.0.11) для разрешения имён

#Просмотр сетевой конфигурации

# Показать все сети docker network ls # Детальная информация о сети docker network inspect bridge # Показать сетевые интерфейсы хоста ip link show # Показать мосты brctl show # Показать iptables правила Docker sudo iptables -t nat -L -n -v | grep docker # Показать процессы docker-proxy ps aux | grep docker-proxy

#Сетевые драйверы

Docker поддерживает несколько типов сетевых драйверов через Container Network Model (CNM):

#Сравнительная таблица драйверов

ДрайверИзоляцияПроизводительностьDNSСценарий
bridgeВысокаяХорошая✅Локальная разработка, одиночные хосты
hostНетНативная❌High-performance, monitoring
noneПолнаяН/Д❌Безопасность, batch processing
overlayВысокаяХорошая✅Swarm, multi-host
macvlanСредняяНативная⚠️Legacy apps, прямой доступ к LAN
ipvlanСредняяНативная⚠️Специфичные конфигурации
noneПолнаяН/Д❌Изоляция

#Выбор драйва: дерево решений

Нужна ли связь между хостами?
├─ ДА → Использовать overlay (Swarm) или CNI (Kubernetes)
└─ НЕТ → Продолжить
         │
         ▼
Нужна ли максимальная производительность?
├─ ДА → Использовать host или macvlan
└─ НЕТ → Продолжить
         │
         ▼
Нужен ли прямой доступ к физической сети?
├─ ДА → Использовать macvlan
└─ НЕТ → Использовать bridge (рекомендуется)

#Bridge network

#Default bridge (docker0)

Сеть bridge создаётся автоматически при установке Docker:

# Информация о сети по умолчанию docker network inspect bridge

Характеристики default bridge:

  • Подсеть: обычно 172.17.0.0/16
  • Шлюз: 172.17.0.1
  • IP контейнеров: назначаются последовательно
  • DNS не работает — контейнеры не видят друг друга по именам
# Запуск в default bridge docker run -d --name web1 nginx docker run -d --name web2 nginx # Проверка IP docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web1 # 172.17.0.2 # Пинг по IP работает docker exec web1 ping 172.17.0.3 # ✅ # Пинг по имени НЕ работает docker exec web1 ping web2 # ❌ ping: bad address 'web2'

Почему DNS не работает в default bridge: Встроенный DNS Docker разрешает имена только в пользовательских сетях. В default bridge эта функция отключена для обратной совместимости.

#Пользовательская bridge-сеть

Создание собственной сети включает полный функционал:

# Создать сеть docker network create my-network # Запустить контейнеры docker run -d --name web --network my-network nginx docker run -d --name api --network my-network myapi # DNS работает! docker exec web ping api # ✅ Работает docker exec api ping web # ✅ Работает

#Расширенные опции создания сети

# Сеть с кастомной подсетью и шлюзом docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ --gateway 172.20.0.1 \ --ip-range 172.20.0.0/24 \ --aux-address "host1=172.20.0.10" \ --aux-address "host2=172.20.0.11" \ my-custom-network # Сеть с отключённым ICC (Inter-Container Communication) docker network create \ --driver bridge \ --opt com.docker.network.bridge.enable_icc=false \ isolated-network # Сеть с кастомным DNS docker network create \ --driver bridge \ --opt com.docker.network.driver.mtu=1450 \ --dns 8.8.8.8 \ --dns 1.1.1.1 \ dns-network

Параметры конфигурации:

ПараметрОписаниеПример
--subnetCIDR подсети172.20.0.0/16
--gatewayIP шлюза172.20.0.1
--ip-rangeДиапазон для DHCP172.20.0.0/24
--aux-addressЗарезервированные IPhost1=172.20.0.10
enable_iccРазрешить связь контейнеровtrue/false
mtuМаксимальный размер пакета1450

#Управление сетями

# Посмотреть все сети docker network ls docker network ls --filter driver=bridge docker network ls --format "{{.Name}}\t{{.Driver}}" # Детали сети docker network inspect my-network docker network inspect -f '{{.IPAM.Config}}' my-network # Подключить запущенный контейнер docker network connect my-network container1 # Подключить с алиасом docker network connect \ --alias database \ --alias db-primary \ my-network container1 # Отключить от сети docker network disconnect my-network container1 # Принудительно отключить (даже если контейнер использует сеть) docker network disconnect --force my-network container1 # Удалить сеть docker network rm my-network # Очистить неиспользуемые сети docker network prune docker network prune --filter "until=24h" # Старше 24 часов

#ICC (Inter-Container Communication)

ICC контролирует, могут ли контейнеры в одной сети общаться друг с другом:

# ICC включено (по умолчанию) — контейнеры видят друг друга docker network create my-network # ICC выключено — полная изоляция docker network create \ --opt com.docker.network.bridge.enable_icc=false \ isolated-network docker run -d --name app1 --network isolated-network alpine sleep infinity docker run -d --name app2 --network isolated-network alpine sleep infinity docker exec app1 ping app2 # ❌ Не работает

Сценарии использования ICC=false:

  • Микросервисы с явным разрешением коммуникации
  • Соответствие требованиям безопасности (PCI DSS, HIPAA)
  • Сегментация по принципу наименьших привилегий

#Host network

Режим host убирает сетевую изоляцию — контейнер использует стек хоста напрямую:

docker run -d --network host nginx

#Как это работает

ASCII Diagram

#Особенности

ХарактеристикаОписание
ИзоляцияОтсутствует
ПроизводительностьНативная (нет NAT, нет veth)
ПортыНе требуется -p, конфликтуют порты
DNSИспользует DNS хоста
/etc/hostsКопируется с хоста

#Примеры использования

# ✅ Monitoring agent — нужен доступ ко всем интерфейсам docker run -d \ --network host \ --name netdata \ netdata/netdata # ✅ High-performance proxy docker run -d \ --network host \ --name haproxy \ haproxy:latest # ❌ Ошибка — порт 80 уже занят docker run -d --network host nginx docker run -d --network host apache # Конфликт!

#Когда использовать host network

✅ Подходит:

  • Сетевые сканеры и мониторы (Wireshark, tcpdump)
  • High-performance приложения (CNI, service mesh)
  • Приложения, требующие широковещательный трафик (mDNS, SSDP)
  • Временные контейнеры для отладки сети

❌ Не подходит:

  • Веб-приложения (конфликты портов)
  • Микросервисы (нет изоляции)
  • Мульти-тенант окружения
  • Продакшен с несколькими версиями одного сервиса

#None network

Полная сетевая изоляция — только loopback интерфейс:

docker run --network none alpine ip addr # 1: lo: <LOOPBACK,UP,LOWER_UP> ... # inet 127.0.0.1/8 scope host lo

#Сценарии использования

# ✅ Batch processing без сети docker run --rm \ --network none \ -v ./data:/data \ alpine sh -c "process-data /data" # ✅ Безопасная обработка секретов docker run --rm \ --network none \ --env-file secrets.env \ vault encrypt # ✅ Изолированная тестовая среда docker run --rm \ --network none \ --cap-drop=ALL \ --cap-add=NET_BIND_SERVICE \ test-image

#Ручная настройка сети

Можно подключить сеть после запуска:

# Запустить без сети docker run -d --network none --name isolated alpine sleep infinity # Позже подключить к сети docker network connect my-network isolated # Или создать пару veth вручную и настроить через iproute2 ip link add veth0 type veth peer name veth1 # ... сложная ручная настройка

#Overlay network

Overlay сети обеспечивают связь между контейнерами на разных хостах через инкапсуляцию трафика (VXLAN):

ASCII Diagram

#Настройка overlay сети

# Инициализировать Swarm (требуется для overlay) docker swarm init --advertise-addr 192.168.1.10 # Добавить worker docker swarm join --token <token> 192.168.1.10:2377 # Создать overlay сеть docker network create \ --driver overlay \ --subnet 10.0.0.0/24 \ --gateway 10.0.0.1 \ my-overlay # Создать зашифрованную overlay сеть docker network create \ --driver overlay \ --opt encrypted \ secure-overlay # Запустить сервисы docker service create \ --name web \ --network my-overlay \ --replicas 3 \ --publish 80:80 \ nginx docker service create \ --name api \ --network my-overlay \ --replicas 2 \ myapi:latest

#Как работает VXLAN

VXLAN (Virtual Extensible LAN) инкапсулирует L2-фреймы в UDP-пакеты:

ASCII Diagram

Преимущества:

  • Контейнеры на разных хостах в одной L2-сети
  • Автоматическая маршрутизация через overlay driver
  • Поддержка до 16 миллионов сегментированных сетей (VNI)

Недостатки:

  • Накладные расходы на инкапсуляцию (~50 байт на пакет)
  • Требует UDP порт 4789 открытым между хостами
  • Сложнее отладка

#Macvlan и Ipvlan

#Macvlan

Macvlan позволяет контейнеру иметь собственный MAC-адрес и подключаться напрямую к физической сети:

ASCII Diagram

# Создать macvlan сеть docker network create -d macvlan \ --subnet 192.168.1.0/24 \ --gateway 192.168.1.1 \ -o parent=eth0 \ macvlan-net # Запустить контейнер docker run -d \ --network macvlan-net \ --ip 192.168.1.10 \ --mac-address "02:42:ac:11:00:0a" \ nginx

Ограничения macvlan:

  • Контейнеры не могут общаться с хостом напрямую (требуется macvlan bridge)
  • Требует поддержки на сетевом оборудовании
  • Не работает с Docker Desktop (Mac/Windows)

#Ipvlan

Упрощённая версия macvlan — один MAC-адрес на все контейнеры:

docker network create -d ipvlan \ --subnet 192.168.1.0/24 \ --gateway 192.168.1.1 \ -o parent=eth0 \ -o ipvlan_mode=l2 \ ipvlan-net

Режимы ipvlan:

  • L2: Коммутация на уровне MAC
  • L3: Маршрутизация на уровне IP (требует настройки на хосте)

#Сравнение

ХарактеристикаBridgeMacvlanIpvlan
MAC-адресаОдин на хостеНа контейнерОдин на хост
Видимость в сетиЧерез NATПрямаяПрямая
ИзоляцияВысокаяСредняяСредняя
ПроизводительностьХорошаяНативнаяНативная
СложностьНизкаяСредняяВысокая

#Публикация портов

#Механизм port mapping

Docker использует iptables NAT и docker-proxy для публикации портов:

ASCII Diagram

#Базовое использование

# Публикация на все интерфейсы docker run -d -p 8080:80 nginx # Доступно: http://0.0.0.0:8080 # Публикация на конкретный IP docker run -d -p 192.168.1.100:8080:80 nginx # Доступно только с 192.168.1.100 # Публикация только на localhost docker run -d -p 127.0.0.1:8080:80 nginx # Доступно только локально # Публикация нескольких портов docker run -d \ -p 80:80 \ -p 443:443 \ -p 8080:8080 \ nginx # Диапазон портов docker run -d -p 8000-8010:8000-8010 myapp # Динамический порт docker run -d -p 80 nginx docker port <container_id> # 80/tcp -> 0.0.0.0:32768

#Протоколы

# TCP (по умолчанию) docker run -d -p 80:80 nginx # UDP docker run -d -p 53:53/udp dns-server # TCP и UDP одновременно docker run -d -p 53:53 -p 53:53/udp dns-server # SCTP (редко) docker run -d -p 9898:9898/sctp sctp-app

#EXPOSE vs -p

# Dockerfile FROM nginx EXPOSE 80 443

EXPOSE — это документация, а не публикация:

  • Указывает, какие порты использует приложение
  • Не публикует порты автоматически
  • Используется -P (заглавная) для публикации всех EXPOSE
# Опубликовать все EXPOSE порты (динамические порты) docker run -d -P nginx # Явная публикация (контролируемые порты) docker run -d -p 8080:80 -p 8443:443 nginx

#Проброс портов в Kubernetes

# Docker Compose services: web: ports: - "8080:80" # host:container - "127.0.0.1:9090:90" # ip:host:container - "6000-6010:6000-6010" # диапазоны

#DNS и сервис-дискавери

#Встроенный DNS Docker

Docker запускает DNS-сервер на 127.0.0.11 внутри каждого контейнера:

docker exec -it container bash cat /etc/resolv.conf # nameserver 127.0.0.11 # options timeout:2 attempts:3 rotate single-request-reopen ndots:0

Как работает:

  1. Запрос к 127.0.0.11
  2. Docker DNS проверяет имена контейнеров в той же сети
  3. Если не найдено — пересылает внешнему DNS (из хоста)
  4. Кэширует ответы (TTL уважается)

#Разрешение имён

# Создать сеть docker network create my-network # Запустить сервисы docker run -d --name postgres --network my-network postgres docker run -d --name redis --network my-network redis docker run -d --name api --network my-network myapi # Из api можно обратиться: docker exec api nslookup postgres # Server: 127.0.0.11 # Address: 127.0.0.11#53 # Name: postgres # Address: 172.20.0.2 # Проверка из контейнера docker exec api getent hosts postgres # 172.20.0.2 postgres

#Сетевые алиасы

Алиасы позволяют создать несколько имён для одного контейнера:

# Запустить с алиасами docker run -d \ --name db-primary \ --network my-network \ --network-alias db \ --network-alias database \ --network-alias postgres-primary \ postgres:15 # Все алиасы работают: docker exec app nslookup db # ✅ docker exec app nslookup database # ✅ docker exec app nslookup postgres-primary # ✅

Сценарии:

  • A/B тестирование (aliase → разные версии)
  • Миграция БД (переключение алиаса)
  • Мульти-регион (db-us, db-eu)

#Кастомный DNS

# Переопределить DNS серверы docker run -d \ --dns 8.8.8.8 \ --dns 1.1.1.1 \ --dns-opt "options timeout:5" \ nginx # Добавить записи в /etc/hosts docker run -d \ --add-host=database:172.20.0.100 \ --add-host=cache:172.20.0.101 \ myapp # Внутри контейнера: cat /etc/hosts # 172.20.0.100 database # 172.20.0.101 cache

#DNS в Docker Compose

services: web: image: nginx networks: - frontend dns: - 8.8.8.8 - 1.1.1.1 dns_search: example.com api: image: myapi networks: - frontend - backend networks: backend: aliases: - database-api - api-v1 networks: frontend: backend:

#Сетевая безопасность

#Изоляция сетей

# Сеть с отключённым ICC docker network create \ --driver bridge \ --opt com.docker.network.bridge.enable_icc=false \ isolated-network # Контейнеры не могут общаться напрямую # Требуется явное разрешение через линки или прокси

#Ограничение доступа к портам

# ✅ Безопасно — только localhost docker run -d \ -p 127.0.0.1:5432:5432 \ postgres # ✅ Безопасно — конкретный IP docker run -d \ -p 10.0.0.5:5432:5432 \ postgres # ❌ Опасно — доступно всем docker run -d -p 5432:5432 postgres

#Firewall правила

# Просмотр правил Docker sudo iptables -L -n -v | grep docker sudo iptables -t nat -L -n -v | grep docker # Заблокировать доступ к порту контейнера sudo iptables -I DOCKER -p tcp --dport 5432 -j DROP # Разрешить только с определённого IP sudo iptables -I DOCKER -p tcp -s 10.0.0.0/8 --dport 5432 -j ACCEPT sudo iptables -I DOCKER -p tcp --dport 5432 -j DROP

#Security groups в облаках

При развёртывании в облаке:

  • Настройте Security Groups / Firewall Rules
  • Откройте только необходимые порты
  • Используйте private subnets для БД

#TLS для overlay сетей

# Создать зашифрованную сеть docker network create \ --driver overlay \ --opt encrypted \ secure-network # Трафик между хостами шифруется через IPsec

#Best Practices безопасности

  1. Минимальные привилегии: Открывайте только необходимые порты
  2. Изоляция: Разделяйте сети по уровням (frontend/backend)
  3. localhost binding: Базы данных только на 127.0.0.1
  4. Network policies: В Kubernetes используйте NetworkPolicy
  5. Аудит: Регулярно проверяйте docker network inspect
  6. Secrets: Не передавайте секреты через сеть в plain text

#Производительность сети

#Бенчмарки

# Установить iperf3 docker run -d \ --network host \ --name iperf-server \ networkstatic/iperf3 -s # Запустить клиент docker run --rm \ --network host \ networkstatic/iperf3 -c localhost -t 30

#Факторы влияния

ФакторВлияниеРекомендация
NAT+10-20% latencyHost network для критичных
veth pairМинимальноеНе беспокоиться
DNS lookup+1-5ms кэшИспользовать алиасы
Overlay (VXLAN)+5-10% throughputШифрование дороже
MTUФрагментацияНастроить MTU=1450 для overlay

#Оптимизация

# Увеличить MTU для overlay docker network create \ --driver overlay \ --opt com.docker.network.driver.mtu=1450 \ my-overlay # Использовать host network для high-performance docker run --network host nginx # Настроить DNS кэширование docker run \ --dns 127.0.0.1 \ --dns-opt "options ndots:1" \ myapp

#Диагностика производительности

# Запустить netshoot для отладки docker run --rm -it \ --network my-network \ --cap-add=NET_ADMIN \ nicolaka/netshoot # Внутри: tcpdump -i eth0 -n port 80 curl -w "@curl-format.txt" http://api:8000 mtr api:8000

#Практика: микросервисы

#Архитектура

ASCII Diagram

#Развёртывание

# Создать сети docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ frontend-network docker network create \ --driver bridge \ --subnet 172.21.0.0/16 \ --opt com.docker.network.bridge.enable_icc=false \ backend-network # Базы данных (только backend, ICC отключён) docker run -d \ --name postgres \ --network backend-network \ --network-alias db \ -e POSTGRES_PASSWORD=secret \ -v postgres-data:/var/lib/postgresql/data \ postgres:15-alpine docker run -d \ --name redis \ --network backend-network \ --network-alias cache \ redis:7-alpine \ redis-server --appendonly yes # API Gateway (обе сети) docker run -d \ --name api-gateway \ --network backend-network \ --network frontend-network \ --network-alias api \ -e DATABASE_URL=postgresql://postgres:secret@db:5432/app \ -e REDIS_URL=redis://cache:6379 \ myapi-gateway:latest # Микросервисы (только backend) docker run -d \ --name user-service \ --network backend-network \ --network-alias user-svc \ -e DB_HOST=db \ myuser-service:latest docker run -d \ --name order-service \ --network backend-network \ --network-alias order-svc \ -e DB_HOST=db \ -e KAFKA_BROKERS=kafka:9092 \ myorder-service:latest # Frontend (только frontend) docker run -d \ --name frontend \ --network frontend-network \ -p 127.0.0.1:3000:80 \ myfrontend:latest # Nginx Ingress (только frontend) docker run -d \ --name nginx \ --network frontend-network \ -p 80:80 \ -p 443:443 \ -v ./nginx.conf:/etc/nginx/nginx.conf:ro \ -v ./ssl:/etc/nginx/ssl:ro \ nginx:alpine

#nginx.conf

events { worker_connections 4096; multi_accept on; } http { # Upstreams upstream api { least_conn; server api-gateway:8000; keepalive 32; } upstream frontend { server frontend:80; keepalive 16; } # Rate limiting limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=web_limit:10m rate=50r/s; server { listen 80; server_name example.com; # Redirect to HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; # API с rate limiting location /api/ { limit_req zone=api_limit burst=20 nodelay; proxy_pass http://api/; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Timeouts proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # Frontend location / { limit_req zone=web_limit burst=50 nodelay; proxy_pass http://frontend/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; } } }

#Docker Compose и сети

#Базовый пример

version: '3.8' services: postgres: image: postgres:15-alpine networks: - backend environment: POSTGRES_PASSWORD: secret volumes: - postgres-data:/var/lib/postgresql/data redis: image: redis:7-alpine networks: - backend command: redis-server --appendonly yes api: build: ./api networks: - frontend - backend environment: DATABASE_URL: postgresql://postgres:secret@postgres:5432/app REDIS_URL: redis://redis:6379 depends_on: - postgres - redis frontend: build: ./frontend networks: - frontend ports: - "127.0.0.1:3000:80" nginx: image: nginx:alpine networks: - frontend ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro networks: frontend: driver: bridge backend: driver: bridge internal: true # Нет доступа наружу volumes: postgres-data:

#Продвинутая конфигурация

networks: frontend: driver: bridge ipam: driver: default config: - subnet: 172.20.0.0/16 gateway: 172.20.0.1 backend: driver: bridge internal: true ipam: config: - subnet: 172.21.0.0/16 overlay-net: driver: overlay driver_opts: encrypted: "true" attachable: true # Позволяет подключать standalone контейнеры

#Troubleshooting

#Диагностика подключения

# Получить IP контейнера docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container # Проверить сеть контейнера docker inspect -f '{{json .NetworkSettings}}' container | jq # Пинг из контейнера docker exec container ping other-container # Проверить порты docker exec container nc -zv other-container 5432 docker exec container bash -c "echo > /dev/tcp/host/5432" # DNS проверка docker exec container nslookup service-name docker exec container getent hosts service-name # Проверить маршрутизацию docker exec container ip route docker exec container cat /etc/resolv.conf

#Отладка с netshoot

# Запустить отладочный контейнер в той же сети docker run --rm -it \ --network my-network \ --cap-add=NET_ADMIN \ --cap-add=NET_RAW \ nicolaka/netshoot # Внутри netshoot: # Перехват трафика tcpdump -i eth0 -n port 80 -w capture.pcap # Трассировка mtr -n api:8000 # Проверка портов nmap -p 1-1000 api masscan -p1-65535 api # HTTP тесты curl -v http://api:8000/health httpie http://api:8000/health # DNS отладка dig @127.0.0.11 api drill api # Проверка MTU ping -M do -s 1472 api # Максимальный для Ethernet

#Частые проблемы

#1. Контейнеры не видят друг друга

# Проверить, в одной ли сети docker inspect container1 --format '{{json .NetworkSettings.Networks}}' | jq docker inspect container2 --format '{{json .NetworkSettings.Networks}}' | jq # Проверить ICC docker network inspect network-name --format '{{.Options}}'

Решение: Подключить к одной сети или включить ICC.

#2. DNS не разрешает имена

# Проверить DNS внутри контейнера docker exec container cat /etc/resolv.conf # Перезапустить Docker DNS sudo systemctl restart docker

#3. Порты не доступны снаружи

# Проверить iptables sudo iptables -L -n -v | grep docker # Проверить docker-proxy ps aux | grep docker-proxy # Проверить firewall хоста sudo ufw status sudo firewall-cmd --list-all

#4. Медленная сеть

# Проверить MTU docker network inspect network-name --format '{{.Options}}' # Тест производительности docker run --rm --network host networkstatic/iperf3 -c target-host

#Сброс сети

# Очистить все сети docker network prune -af # Перезапустить Docker sudo systemctl restart docker # Полный сброс (Linux) sudo systemctl stop docker sudo rm -rf /var/lib/docker/network sudo systemctl start docker

#Продвинутые сценарии

#Service Mesh с Docker

# Создать сеть для service mesh docker network create \ --driver overlay \ --opt encrypted \ mesh-network # Запустить sidecar proxy docker run -d \ --network mesh-network \ --name api-with-proxy \ -v ./envoy.yaml:/etc/envoy/envoy.yaml \ envoyproxy/envoy:v1.28 # Конфигурация Envoy для service discovery # envoy.yaml static_resources: clusters: - name: api_cluster type: STRICT_DNS lb_policy: ROUND_ROBIN load_assignment: cluster_name: api_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: api port_value: 8000

#Multi-host с WireGuard

# Настроить WireGuard туннель между хостами # Хост A wg genkey | tee privatekey | wg pubkey > publickey cat > /etc/wireguard/wg0.conf <<EOF [Interface] PrivateKey = <private-key> Address = 10.0.0.1/24 ListenPort = 51820 [Peer] PublicKey = <peer-public-key> AllowedIPs = 10.0.0.0/24 EOF # После настройки туннеля создать overlay сеть # Контейнеры на разных хостах будут в одной сети

#Network Policies в Kubernetes

# Ограничить трафик между подами apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: api-network-policy spec: podSelector: matchLabels: app: api policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 8000 egress: - to: - podSelector: matchLabels: app: postgres ports: - protocol: TCP port: 5432

#CNI плагины для Docker

Docker использует libnetwork, но можно интегрировать CNI:

# Установить weave curl -L git.io/weave -o /usr/local/bin/weave chmod +x /usr/local/bin/weave weave launch # Подключить Docker к weave eval $(weave env) # Контейнеры автоматически в overlay сети docker run -d --name web nginx

#Мониторинг сети

# Prometheus + cAdvisor docker run -d \ --name=cadvisor \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ google/cadvisor:latest # Grafana дашборды для сетевых метрик # Метрики: container_network_receive_bytes_total # container_network_transmit_bytes_total

#Чек-лист перед продакшеном

  • Сети разделены по уровням (frontend/backend/database)
  • ICC отключён где не нужен
  • Порты БД доступны только внутри backend сети
  • Использованы пользовательские сети (не default bridge)
  • Настроен firewall хоста
  • DNS алиасы используются для гибкости
  • Overlay сети зашифрованы (если multi-host)
  • MTU настроен для overlay
  • Логирование сети включено
  • Мониторинг сетевых метрик настроен

#Дополнительные ресурсы

  • Официальная документация Docker Networking
  • Container Network Model (CNM)
  • Docker Network Drivers Deep Dive
  • Kubernetes Networking
  • CNI Specification

Далее: Хранение данных