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

- Типы сетей Docker
- Проблема: default bridge сеть
- Создать и использовать пользовательскую сеть
- Команды управления сетями
- Схема сети: app + db + nginx
- Сети в Docker Compose
- host network — сеть хоста
- Публикация портов
- Часто задаваемые вопросы
- Как контейнеры Docker общаются между собой?
- Разница bridge и host 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 знать не нужно — используй имена контейнеров для обращения внутри сети.
Что читать дальше по Docker
Чтобы связать тему с соседними практическими материалами, дальше удобно открыть:
- Docker Compose — собрать сервисы в одну сеть через Compose.
- PostgreSQL в Docker — подключить приложение к PostgreSQL в контейнере.
- Redis в Docker — подключить приложение к Redis в контейнере.
- docker exec — проверить сеть изнутри контейнера.



