Перейти к содержимому

8. Сети Docker

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

Тип сети по умолчанию. Создаёт виртуальный коммутатор, к которому подключаются контейнеры. Контейнеры в одной bridge-сети могут общаться по имени контейнера.

Окно терминала
# Сеть bridge по умолчанию
docker run -d --name web nginx
# Создать пользовательскую bridge-сеть
docker network create mynetwork
# Запустить контейнер в пользовательской сети
docker run -d --name web --network mynetwork nginx
docker run -d --name api --network mynetwork node:20-alpine
# Теперь api может обращаться к web по имени:
# http://web:80

Контейнер использует сетевой стек хост-машины напрямую. Нет изоляции на уровне сети. Максимальная производительность, только на Linux.

Окно терминала
docker run -d --network host nginx
# nginx доступен на хосте на порту 80 напрямую

Полная сетевая изоляция. Нет доступа ни к внешней сети, ни к другим контейнерам.

Окно терминала
docker run -d --network none myapp
# Контейнер изолирован от всех сетей

Для коммуникации контейнеров на разных хостах (Docker Swarm).

Окно терминала
docker network create --driver overlay myswarm-net
Окно терминала
# Список сетей
docker network ls
# Подробная информация о сети
docker network inspect mynetwork
# Создать сеть с подсетью
docker network create \
--driver bridge \
--subnet=172.20.0.0/16 \
--ip-range=172.20.240.0/20 \
mynetwork
# Подключить контейнер к сети
docker network connect mynetwork container_name
# Отключить контейнер от сети
docker network disconnect mynetwork container_name
# Удалить сеть
docker network rm mynetwork
# Удалить все неиспользуемые сети
docker network prune

В пользовательских bridge-сетях Docker автоматически обеспечивает DNS-разрешение по именам контейнеров:

Окно терминала
docker network create backend
docker run -d --name postgres --network backend postgres:15
docker run -d --name api --network backend \
-e DATABASE_URL=postgresql://postgres/mydb \
myapi
# В коде api можно обращаться к postgres по имени:
# postgresql://postgres:5432/mydb
Окно терминала
# -p hostPort:containerPort
docker run -p 8080:80 nginx # localhost:8080 → container:80
docker run -p 3000:3000 myapp
docker run -p 127.0.0.1:3000:3000 myapp # только localhost
docker run -p 3000-3005:3000-3005 myapp # диапазон портов
# Случайный порт хоста
docker run -P nginx
docker port nginx # узнать назначенный порт
version: '3.8'
services:
frontend:
image: nginx
ports:
- "80:80"
networks:
- frontend-net
api:
image: node:20-alpine
networks:
- frontend-net
- backend-net
postgres:
image: postgres:15
networks:
- backend-net
# frontend НЕ может обратиться к postgres!
networks:
frontend-net:
driver: bridge
backend-net:
driver: bridge
internal: true # нет доступа в интернет