Підключіть контейнер 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

Чи може хто-небудь показати мені, як цього досягти, бажано навіть із Докером Композитом?


@PunMum На жаль, ні. Ми підключили всі контейнери безпосередньо до хост-мережі та налаштували IP-адреси всередині контейнерів.
Гексаголік

Відповіді:


2

Відповідно до цього запитання щодо github :

Хост-мережа особлива. Ви повинні використовувати network_mode: хост у сервісі


network_modeЧи не працює , якщо вам потрібно що - щось пов'язане з внутрішньою мережею і приймаючої мережі. Здається божевільним, що ми не можемо знайти чіткого чіткого рішення цієї проблеми.
jv-dev

2

Docker не дозволяє одночасно підключати контейнер до хост-мережі та будь-якої іншої мережі мосту Docker. Спробую проілюструвати причину на прикладі:

  • Подумаємо про контейнер C1. Гіпотетично C1 буде з'єднаний з хост-мережею (--net = хост) і мережею Docker Bridge Br1 (--net = Br1).
  • Другий контейнер, скажімо C2, підключений до Br1.

Згадане вище налаштування, я гадаю, що хост-мережа видно з C2, і я вважаю, що це причина, чому Docker автоматично заважає нам ненавмисно піддавати хост-мережу контейнерам, не визначеним хостом.

При цьому, якщо у нас є набір контейнерів, і ми хочемо, щоб усі вони були з'єднані між собою, і лише один контейнер має доступ до хост-мережі, моїм підходом буде:

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

EDIT: Нам все одно доведеться адаптувати політику iptables таким чином, щоб C1 можна було отримати з решти контейнерів (див. Https://docs.docker.com/network/iptables/ )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.