Ответ
В 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: Только когда тебе реально, до пизды, важна каждая микросекунда в сетевой задержке. Типа для какого-нибудь высоконагруженного прокси, балансировщика или сетевого анализатора, который должен видеть сеть как есть. И будь готов, что можешь наступить на грабли с портами.
Вот и вся философия, блядь. Не усложняй.