Docker network — сетевое взаимодействие контейнеров

По умолчанию контейнеры изолированы друг от друга. Docker network позволяет им общаться — по имени контейнера, без прописывания IP-адресов. Разбираем типы сетей и как их использовать.

Вся рубрика Docker: уроки, команды и практические сценарии

Типы сетей Docker

ТипОписаниеКогда использовать
bridgeИзолированная сеть (по умолчанию)Большинство случаев
hostКонтейнер использует сетевой стек хостаМаксимальная производительность (только Linux)
noneБез сетевого доступаПолностью изолированные задачи
overlayСеть между несколькими хостамиDocker Swarm кластеры

Проблема: default bridge сеть

# Запустить два контейнера (без указания сети — попадают в default bridge)
docker run -d --name app myapp
docker run -d --name db postgres

# Из app — db недоступен по имени!
docker exec app ping db
# ping: db: Name or service not known  ← ОШИБКА

# В default bridge резолюция по имени не работает
# Нужно использовать пользовательскую сеть

Создать и использовать пользовательскую сеть

# Создать сеть
docker network create mynet

# Запустить контейнеры в этой сети
docker run -d --name db --network mynet postgres:16 \
  -e POSTGRES_PASSWORD=secret
docker run -d --name app --network mynet myapp

# Теперь app видит db по имени!
docker exec app ping db       # ✅ работает
docker exec app curl http://db:5432  # ✅

# Имя контейнера = DNS имя в пользовательской сети

Команды управления сетями

# Список всех сетей
docker network ls
# NETWORK ID     NAME      DRIVER    SCOPE
# abc123         bridge    bridge    local
# def456         host      host      local
# ghi789         mynet     bridge    local

# Информация о сети (IP-адреса, подключённые контейнеры)
docker network inspect mynet

# Подключить существующий контейнер к сети
docker network connect mynet my-container

# Отключить контейнер от сети
docker network disconnect mynet my-container

# Удалить сеть
docker network rm mynet

# Удалить все неиспользуемые сети
docker network prune

Схема сети: app + db + nginx

# Архитектура с двумя сетями:
#
#  Интернет
#      │
#  ┌───┴────────────────────────┐  frontend сеть
#  │   nginx (порт 80 открыт)  │
#  └───┬────────────────────────┘
#      │
#  ┌───┴────────────────────────┐  backend сеть
#  │   app                     │
#  │   db (порт НЕ открыт!)    │
#  └────────────────────────────┘
#
# db доступен только для app — снаружи недоступен

Сети в Docker Compose

version: "3.9"

services:
  nginx:
    image: nginx
    ports:
      - "80:80"  # публикуем наружу
    networks:
      - frontend

  app:
    build: .
    networks:
      - frontend   # nginx → app
      - backend    # app → db

  db:
    image: postgres:16
    # порт НЕ публикуем — доступен только для app
    environment:
      POSTGRES_PASSWORD: secret
    networks:
      - backend

networks:
  frontend:
  backend:

# app обращается к db: postgresql://db:5432/mydb
# nginx обращается к app: http://app:5000

host network — сеть хоста

# Контейнер использует сетевой стек хоста напрямую
docker run --network host nginx
# Nginx слушает на порту 80 хоста — не нужен -p 80:80

# localhost внутри контейнера = localhost хоста
# Нет изоляции по сети, максимальная скорость

# ⚠️ Работает только на Linux!
# На macOS и Windows Docker Desktop — не работает как ожидается

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

# -p ПОРТ_ХОСТА:ПОРТ_КОНТЕЙНЕРА
docker run -p 8080:80 nginx         # все интерфейсы хоста
docker run -p 127.0.0.1:8080:80 nginx  # только localhost (безопаснее)
docker run -p 80 nginx              # случайный порт хоста

# Несколько портов
docker run -p 80:80 -p 443:443 nginx

# Узнать на каком порту хоста доступен контейнер
docker port my-nginx
# 80/tcp -> 0.0.0.0:8080

Часто задаваемые вопросы

Как контейнеры Docker общаются между собой?

Контейнеры в одной пользовательской сети (не default bridge) видят друг друга по имени контейнера. Это работает через встроенный DNS сервер Docker. Например: app обращается к PostgreSQL как postgresql://db:5432, где db — имя контейнера базы данных. В Docker Compose это работает автоматически — все сервисы помещаются в одну сеть и видят друг друга по имени сервиса.

Разница bridge и host network?

Bridge — контейнер получает собственный сетевой namespace и IP-адрес. Трафик между хостом и контейнером проходит через виртуальный сетевой мост. Изолировано, безопасно. Host — контейнер использует сетевой стек хоста напрямую, без изоляции. Нет overhead от моста — максимальная скорость сети. Но контейнер видит все порты хоста, меньше изоляции. Работает только на Linux.

Как проверить IP адрес контейнера?

Через docker inspect: docker inspect my-container | grep IPAddress — покажет IP-адрес в каждой сети. Или через форматирование: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container. Внутри контейнера: docker exec my-container hostname -I. Обычно IP знать не нужно — используй имена контейнеров для обращения внутри сети.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x