8. Сети Docker
Docker предоставляет мощную систему сетей, позволяющую контейнерам взаимодействовать друг с другом и с внешним миром. По умолчанию контейнеры изолированы, но могут быть подключены к одной или нескольким сетям.
Типы сетей Docker
Заголовок раздела «Типы сетей Docker»Bridge (мостовая сеть)
Заголовок раздела «Bridge (мостовая сеть)»Тип сети по умолчанию. Создаёт виртуальный коммутатор, к которому подключаются контейнеры. Контейнеры в одной bridge-сети могут общаться по имени контейнера.
# Сеть bridge по умолчаниюdocker run -d --name web nginx
# Создать пользовательскую bridge-сетьdocker network create mynetwork
# Запустить контейнер в пользовательской сетиdocker run -d --name web --network mynetwork nginxdocker 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# Контейнер изолирован от всех сетейOverlay
Заголовок раздела «Overlay»Для коммуникации контейнеров на разных хостах (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 pruneDNS и Service Discovery
Заголовок раздела «DNS и Service Discovery»В пользовательских bridge-сетях Docker автоматически обеспечивает DNS-разрешение по именам контейнеров:
docker network create backend
docker run -d --name postgres --network backend postgres:15docker run -d --name api --network backend \ -e DATABASE_URL=postgresql://postgres/mydb \ myapi
# В коде api можно обращаться к postgres по имени:# postgresql://postgres:5432/mydbМаппинг портов
Заголовок раздела «Маппинг портов»# -p hostPort:containerPortdocker run -p 8080:80 nginx # localhost:8080 → container:80docker run -p 3000:3000 myappdocker run -p 127.0.0.1:3000:3000 myapp # только localhostdocker run -p 3000-3005:3000-3005 myapp # диапазон портов
# Случайный порт хостаdocker run -P nginxdocker port nginx # узнать назначенный портСети в Docker Compose
Заголовок раздела «Сети в Docker Compose»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 # нет доступа в интернет