Подключите Docker-контейнер как к хосту, так и к внутренней мостовой сети

14

Я пытаюсь запустить контейнер Docker в качестве маршрутизатора между частной ( --internal) сетью Docker и предопределенной hostсетью. Это означает, что контейнер должен иметь два сетевых интерфейса: один «внешний» интерфейс, который может получить доступ ко всем IP-адресам хоста, и один «внутренний» интерфейс, который действует как шлюз для контейнеров во внутренней сети Docker.

Контейнер маршрутизатора сам затем будет передавать сетевой трафик NAT из / в контейнеры.

Я не нашел способ настроить Docker для запуска контейнера с этими двумя интерфейсами. Самое близкое, что я мог получить, - это назначить два bridgeинтерфейса, что не совсем то, что мне нужно.

Попытка подключения вручную приводит к ошибке:

# docker network connect host root_router_1
Error response from daemon: Container cannot be disconnected from host network or connected to host network

Кто-нибудь может показать мне, как этого добиться, желательно даже с помощью Docker Compose?

Hexaholic
источник
@PunMum К сожалению нет. В итоге мы подключили все контейнеры напрямую к сети хоста и настроили IP-адреса внутри контейнеров.
Гексаголик,

Ответы:

2

Согласно этому Q & A на github :

Сеть хоста особенная. Вы должны использовать network_mode: host на сервисе

030
источник
network_modeНе работает , если вам нужно что - то связанное с внутренней сетью и принимающей сети. Кажется безумным, что мы не можем найти хорошее и ясное решение этой проблемы.
JV-Dev
2

Docker не позволяет подключать контейнер к сети хоста и любой другой сети моста Docker одновременно. Я постараюсь проиллюстрировать причину на примере:

  • Давайте подумаем о контейнере C1. Гипотетически, C1 будет подключен к сети хоста (--net = host) и сети моста Docker Br1 (--net = Br1).
  • Второй контейнер, скажем, C2, связан с Br1.

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

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

  • [C2, ..., CN] подключены к заданному пользователем мосту Docker Br1 (--net = Br1)
  • C1 подключен к сети хоста (--net = хост)
  • C1 выставляет порт, чтобы быть доступным из остальных контейнеров

РЕДАКТИРОВАТЬ: Нам все равно придется адаптировать политики iptables таким образом, чтобы можно было получить доступ к C1 из остальных контейнеров (см. Https://docs.docker.com/network/iptables/ ).

JJFanFer
источник