Collegare il contenitore Docker sia alla rete host che a quella bridge interna


14

Sto cercando di eseguire un contenitore Docker come router tra una --internalrete Docker privata ( ) e la hostrete predefinita . Ciò significa che il contenitore deve avere due interfacce di rete: un'interfaccia "esterna", che può accedere a tutti gli indirizzi IP host e un'interfaccia "interna", che funge da gateway per i contenitori nella rete Docker interna

Il contenitore del router stesso trasferirà quindi il traffico di rete NAT da / verso i contenitori.

Non ho trovato un modo per configurare Docker per eseguire il contenitore con queste due interfacce. Il più vicino che potrei ottenere è avere due bridgeinterfacce assegnate, che non è esattamente quello di cui ho bisogno.

Tentare di connettersi manualmente provoca un errore:

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

Qualcuno può mostrarmi come raggiungere questo obiettivo, preferibilmente anche con Docker Compose?


@PunMum Purtroppo no. Abbiamo finito per collegare tutti i container direttamente alla rete host e configurare gli IP all'interno dei container.
Esaolico il

Risposte:


2

Secondo queste domande e risposte su github :

La rete host è speciale. Devi usare network_mode: host sul servizio


Il network_modenon funziona se avete bisogno di qualcosa collegato ad una rete interna e la rete ospite. Sembra folle che non possiamo trovare una buona soluzione chiara a questo problema.
jv-dev,

2

Docker non consente di connettere un contenitore alla rete host e a qualsiasi altra rete bridge Docker contemporaneamente. Proverò a illustrare il motivo con un esempio:

  • Pensiamo a un contenitore C1. Ipoteticamente, C1 sarebbe connesso alla rete host (--net = host) e una rete bridge Docker Br1 (--net = Br1).
  • Un secondo contenitore, diciamo C2, è collegato a Br1.

Con la configurazione sopra, la mia ipotesi è che la rete host sia visibile da C2, e suppongo che questo sia il motivo per cui Docker ci impedisce automaticamente di esporre involontariamente la rete host a contenitori non specificati dall'host.

Detto questo, se abbiamo un set di container e vogliamo che siano tutti interconnessi, con un solo container che abbia accesso alla rete host, il mio approccio sarebbe:

  • [C2, ..., CN] sono collegati a un bridge Docker definito dall'utente Br1 (--net = Br1)
  • C1 è connesso alla rete host (--net = host)
  • C1 espone una porta per essere accessibile dal resto dei contenitori

EDIT: Dovremmo comunque adattare le politiche di iptables in modo tale che C1 possa essere raggiunto dal resto dei container (vedi https://docs.docker.com/network/iptables/ )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.