Продвинутый Docker
Урок 2~9 минут
Сети Docker: bridge, host, overlay
Docker предоставляет несколько типов сетей для разных сценариев изоляции и коммуникации.
Default Bridge
По умолчанию контейнеры подключаются к сети bridge. Но стандартная bridge-сеть не поддерживает DNS-резолвинг по имени контейнера.
bash
docker run -d --name web nginx
docker run -d --name app myapp
docker exec app ping web # НЕ РАБОТАЕТ в default bridgeUser-defined Bridge (рекомендуется)
bash
docker network create my-net
docker run -d --name web --network my-net nginx
docker run -d --name app --network my-net myapp
docker exec app ping web # РАБОТАЕТ — DNS по имениПользовательские bridge-сети:
- Поддерживают DNS-резолвинг по имени
- Лучшая изоляция (только явно добавленные контейнеры)
- Можно подключать/отключать на лету
Host Network
bash
docker run --network host nginx
# Nginx слушает порт 80 прямо на хосте
# Не нужен -p 80:80Плюсы: максимальная производительность (нет NAT). Минусы: нет изоляции, конфликты портов, только Linux.
None Network
bash
docker run --network none alpine ip addr
# Только loopback: 127.0.0.1Для задач, не требующих сети: обработка файлов, вычисления.
Overlay — для Swarm
Overlay-сети работают поверх нескольких Docker-хостов:
bash
# Инициализировать Swarm
docker swarm init
# Создать overlay-сеть
docker network create --driver overlay --attachable my-overlay
# Сервисы в Swarm видят друг друга через overlayИспользуется в Docker Swarm и часто в Kubernetes CNI plugins.
Практика: изоляция по слоям
yaml
networks:
dmz: # публичная зона
internal: # внутренняя
services:
nginx:
networks: [dmz, internal] # знает всех
ports: ["80:80", "443:443"]
api:
networks: [internal] # только внутренняя
# НЕТ публичных портов
db:
networks: [internal] # только внутренняя
# НЕТ публичных портовNginx — единственная точка входа. База данных недостижима снаружи даже если api взломан.
Диагностика
bash
docker network ls # все сети
docker network inspect my-net # детали сети + контейнеры
# Изнутри контейнера
docker exec myapp nslookup db # DNS
docker exec myapp curl http://api:8000 # HTTP
docker exec myapp netstat -an # открытые порты
# Снаружи
docker port myapp # маппинг портовВ следующем уроке — Docker Hub и private registry.
bridge = изолированная сеть на одном хосте. host = без изоляции. overlay = несколько хостов (Swarm).
🕸️
Docker сети: изоляция сервисовНажми на сервис, чтобы увидеть кто его видит
FRONTEND NETWORK
🌐
nginx
:80
⚡
api
:8000
BACKEND NETWORK
⚡
api
:8000
🐘
db
:5432
🔴
redis
:6379
nginx → api (frontend), api → db, redis (backend). nginx не видит db напрямую.
🎯
Миссия 1 из 3
Почему не стоит использовать network_mode: host в продакшне?