Продвинутый Docker
1Volumes: типы и продакшн-практики2Сети Docker: bridge, host, overlay← вы здесь3Docker Hub и private registry
Урок 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 bridge

User-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 в продакшне?