Skip to content

6. Docker Networking — Конспект лекции и практика

📚 Общая идея

Docker создаёт изолированные сетевые пространства для контейнеров, позволяя им взаимодействовать друг с другом и с внешним миром через виртуальные интерфейсы, мосты, NAT и DNS.


1️⃣ Компоненты сети в Docker

🌉 Bridge (docker0 — по умолчанию)

  • Виртуальный Ethernet-коммутатор на хосте
  • Связывает контейнеры в одну общую локальную сеть (172.x.x.x)
  • Используется по умолчанию, если не указана другая сеть

🧠 Network Namespace

  • Изоляция сетевого стека контейнера (интерфейсы, маршруты и т.д.)
  • Каждый контейнер — в отдельном пространстве имён

🔥 iptables

  • Docker автоматически создаёт правила NAT и проброса портов
    iptables -t nat -L     # Посмотреть правила
    
  • Проброс портов работает через DNAT на IP контейнера

2️⃣ Проброс портов (Port publishing)

📦 Синтаксис:

docker run -d -p 8080:80 nginx
- -p 8080:80 — порт 8080 хоста направляется на 80 порт контейнера

📡 Что происходит внутри:

iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80

🧠 В docker-compose.yml:

ports:
  - "8080:80"


3️⃣ Взаимодействие контейнеров

🌐 Доступ в Интернет

  • Контейнеры используют IP хоста через маскарад (MASQUERADE)

🗣 Межконтейнерное общение:

  • В одной сети (bridge или custom):
  • по IP
  • по имени контейнера (только в user-defined сети!)
  • В разных сетях — по умолчанию изоляция

⚙️ Примеры:

docker run --rm -d --name c1 alpine sleep 100
docker run --rm -d --name c2 --network container:c1 alpine sleep 100

4️⃣ Типы сетей в Docker

Тип сети Описание
none Контейнер без сети — для тестов/безопасности
bridge (по умолчанию) Контейнер в приватной сети, NAT + проброс портов
host Контейнер использует сеть хоста — без изоляции
overlay Виртуальная сеть между хостами в Docker Swarm
macvlan/ipvlan Прямой доступ к внешней сети через физический интерфейс

✍️ Пример создания пользовательской сети:

docker network create my-net

⚙️ Использование в docker run:

docker run --rm -d --name web --network my-net nginx

5️⃣ Практика

🔁 Проверка связи между контейнерами

docker network create my-net

docker run --rm -d --name c1 --network my-net alpine sleep 100
docker run --rm -it --name c2 --network my-net alpine sh
# внутри c2
ping c1

⚡ Использование сети host

docker run --rm -d --network host nginx
# NGINX будет доступен сразу на localhost:80

🔒 Изоляция через none

docker run --rm -d --network none nginx
# Никаких подключений к сети

📌 Важные команды

docker network ls                      # Список сетей

docker network inspect <имя_сети>     # Информация о сети

docker network connect <сеть> <контейнер>  # Подключение контейнера к сети

docker network disconnect <сеть> <контейнер>  # Отключение

🧠 Важно помнить

  • Контейнеры в одной user-defined bridge сети видят друг друга по именам
  • Контейнеры не видят друг друга по именам в default bridge
  • host сеть убирает изоляцию — с осторожностью на проде
  • overlay и macvlan — продвинутая тема, не нужна для базовой практики

🚀 Полезные ссылки