Podłącz kontener Docker zarówno do hosta, jak i wewnętrznej sieci mostu

14

Próbuję uruchomić kontener Docker jako router między prywatną ( --internal) siecią Docker a hostsiecią predefiniowaną . Oznacza to, że kontener musi mieć dwa interfejsy sieciowe: jeden interfejs „zewnętrzny”, który może uzyskać dostęp do wszystkich adresów IP hosta, i jeden interfejs „wewnętrzny”, który działa jak brama dla kontenerów w wewnętrznej sieci Docker

Sam kontener routera będzie wtedy ruch sieciowy NAT z / do kontenerów.

Nie znalazłem sposobu na skonfigurowanie Dockera do uruchamiania kontenera z tymi dwoma interfejsami. Najbliższe, jakie mogłem uzyskać, to bridgeprzypisanie dwóch interfejsów, co nie jest dokładnie tym, czego potrzebuję.

Próba ręcznego połączenia powoduje błąd:

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

Czy ktoś może mi pokazać, jak to osiągnąć, najlepiej nawet za pomocą Docker Compose?

Heksaholic
źródło
@PunMum Niestety nie. Skończyło się na podłączeniu wszystkich kontenerów bezpośrednio do sieci hosta i skonfigurowaniu adresów IP wewnątrz kontenerów.
Heksaholijny

Odpowiedzi:

2

Zgodnie z tymi pytaniami i odpowiedziami na github :

Sieć hostów jest wyjątkowa. Musisz użyć trybu_sieciowego: host w usłudze

030
źródło
network_modeNie działa, jeśli trzeba coś połączony z siecią wewnętrzną a siecią gospodarza. Wydaje się szalone, że nie możemy znaleźć dobrego, jasnego rozwiązania tego problemu.
jv-dev,
2

Docker nie pozwala na podłączenie kontenera do sieci hosta i żadnej innej sieci mostu Docker w tym samym czasie. Spróbuję zilustrować przyczynę przykładem:

  • Pomyślmy o pojemniku C1. Hipotetycznie C1 byłby podłączony do sieci hosta (--net = host) i do sieci mostków Docker Br1 (--net = Br1).
  • Drugi pojemnik, powiedzmy C2, jest podłączony do Br1.

Przy powyższej konfiguracji domyślam się, że sieć hosta jest widoczna z C2, i przypuszczam, że to jest powód, dla którego Docker automatycznie uniemożliwia nam niezamierzone wystawienie sieci hosta na kontenery nieokreślone przez hosta.

Biorąc to pod uwagę, jeśli mamy zestaw kontenerów i chcemy, aby wszystkie były ze sobą połączone, a tylko jeden kontener ma dostęp do sieci hosta, moim podejściem byłoby:

  • [C2, ..., CN] są podłączone do zdefiniowanego przez użytkownika mostu dokującego Br1 (--net = Br1)
  • C1 jest podłączony do sieci hosta (--net = host)
  • C1 odsłania port, aby był dostępny z reszty kontenerów

EDYCJA: Musielibyśmy jeszcze dostosować zasady iptables w taki sposób, aby C1 był dostępny z pozostałych kontenerów (patrz https://docs.docker.com/network/iptables/ )

JJFanFer
źródło