В чем разница между сетевыми режимами bridge и host в Docker

Ответ

В Docker bridge и host — это два основных сетевых режима, определяющих, как контейнер взаимодействует с сетью хоста и внешним миром.

Bridge (сетевой мост)

Это режим по умолчанию. Docker создает виртуальную изолированную сеть на хост-машине, и каждый контейнер в этой сети получает свой внутренний IP-адрес.

  • Изоляция: Контейнеры изолированы от сетевого стека хоста.
  • Доступ: Для доступа к сервису внутри контейнера извне требуется явный проброс портов (port mapping) с хоста на контейнер.
  • Безопасность: Считается более безопасным из-за изоляции.

Пример:

# Запустить контейнер Nginx и пробросить порт 8080 хоста на порт 80 контейнера
docker run -d -p 8080:80 nginx

Host (сеть хоста)

В этом режиме контейнер разделяет сетевое пространство с хост-машиной, отключая сетевую изоляцию.

  • Изоляция: Отсутствует. Контейнер использует IP-адрес и сетевые интерфейсы хоста напрямую.
  • Доступ: Проброс портов не нужен. Если сервис в контейнере слушает порт 80, он будет доступен на порту 80 хоста.
  • Производительность: Максимальная, так как отсутствует трансляция сетевых адресов (NAT), что снижает задержки.
  • Риски: Возможны конфликты портов, если несколько контейнеров или сервисов на хосте пытаются использовать один и тот же порт.

Пример:

# Запустить контейнер Nginx, который будет слушать порт 80 напрямую на хосте
docker run -d --network=host nginx

Когда что использовать:

  • bridge: Стандартный выбор для большинства приложений, где важна сетевая изоляция и безопасность.
  • host: Для приложений, где критична максимальная сетевая производительность и минимальные задержки (например, сетевые сервисы, балансировщики нагрузки), и где можно пожертвовать изоляцией.

Ответ 18+ 🔞

А, ну это ж классика, блядь! Docker и его сетевые пиздюлины — bridge и host. Сейчас разжую, как бабушка манную кашу, чтобы даже кот, сука собака, понял.

Представь, что твой хост — это общага, а контейнеры — это комнаты. Так вот, режимы сети — это правила, кто в какую дверь может ломиться.

Bridge (этот самый сетевой мост, ёпта)

Это как у тебя в общаге своя, внутренняя, телефонная сеть. По умолчанию всегда стоит.

  • Изоляция: Каждая комната (контейнер) получает свой внутренний номер (IP). Соседи с пятого этажа просто так к тебе не зайдут — они в другой сети, блядь.
  • Доступ извне: А вот если ты хочешь, чтобы тебе из города позвонили, надо явно пробросить порт. Это как вывесить табличку: "Эй, мир! Чтобы поговорить с Ваней из 505-й, звоните на общий номер общаги, но на добавочный 8080!" Без этого — нихуя, тишина.
  • Безопасность: В целом, да, безопаснее, потому что ты не светишь свою жопу напрямую в интернет.

Пример, чтобы совсем пиздец просто стало:

# Запускаем nginx в контейнере и говорим: "Слушай, дружок, всё, что прилетает на порт 8080 нашей общаги (хоста), тащи сразу в порт 80 в твоей комнате (контейнере)".
docker run -d -p 8080:80 nginx

Теперь открываешь браузер на localhost:8080 — и тебе, сука, привет от nginx! Волшебство, блядь.

Host (сеть хоста, или "пошли все в пизду, я живу как хочу")

А это режим полного распиздяйства. Контейнер просто выламывает дверь в свою комнату и живёт в коридоре общаги, используя её инфраструктуру.

  • Изоляция: Какая, нахуй, изоляция? Ты теперь прямо на хате. Контейнер лезет в сетевой стек хоста и юзает его IP-адрес и порты, как свои родные.
  • Доступ: Пробрасывать порты? Да ты что, охуел? Если твой сервис в контейнере слушает порт 80, он уже торчит на порту 80 самого хоста. Всё, пиздец, приехали.
  • Скорость: Овердохуищная, потому что никаких лишних телодвижений (NAT) нет. Прямой канал, блядь.
  • Риски: А риски, сука, вот какие: если два долбоёба (контейнер или процесс на хосте) захотят слушать один и тот же порт — будет драка, и один из них получит по ебалу с ошибкой "адрес уже используется". Иди разбирайся потом.

Пример, для полного счастья:

# Запускаем nginx и говорим: "Знаешь что? Живи на хате. Делай что хочешь. Твой порт 80 — это теперь порт 80 всей машины".
docker run -d --network=host nginx

Заходишь теперь на localhost:80 прямо с хоста — и опять здравствуй, nginx! Но если у тебя там уже какой-нибудь Apache сидел и порт 80 занимал — будет, блядь, ёперный театр.

Ну и когда что брать, чтобы не обосраться?

  • bridge: Бери всегда, если не знаешь. Для 95% всех твоих поделок. Безопасно, предсказуемо, все довольны.
  • host: Только когда тебе реально, до пизды, важна каждая микросекунда в сетевой задержке. Типа для какого-нибудь высоконагруженного прокси, балансировщика или сетевого анализатора, который должен видеть сеть как есть. И будь готов, что можешь наступить на грабли с портами.

Вот и вся философия, блядь. Не усложняй.