2014-10-24 24 views
21

Lo sto eseguendo su ubuntu 14.04 e ho impostato docker0 su un IP statico che viene poi instradato dall'ip pubblico attraverso il firewall. Sto cercando di configurare la mia API di back-end per l'esecuzione in un contenitore docker e sono confuso da un paio di cose.Dando a un contenitore docker un indirizzo IP instradabile

1.) Come dovrei mappare l'IP dinell'ip del contenitore in modo tale che docker0 sapesse di inviare i pacchetti in ingresso al contenitore (se possibile dinamicamente).

2.) Se non è già stato fatto in questo modo, come posso fare in modo che non debba configurarlo ogni volta che eseguo una nuova corsa di quel container?

Grazie in anticipo!

+1

Avete considerato la possibilità di accoglienza --net =? vedere: https://docs.docker.com/articles/networking/#container-networking –

+0

Che cosa intendi inviando dinamicamente i pacchetti in entrata? Supponendo che l'API di back-end risponda a HTTP, per quanto riguarda l'impostazione di un proxy HTTP che possa gestire anche altre cose, ad es. Offload SSL ecc. – andi5

risposta

35

Presumo che si desideri assegnare un IP al contenitore docker al di fuori della finestra mobile.

In primo luogo, creare una nuova IP e assegnarlo all'interfaccia del padrone di casa (non ci assumiamo l'interfaccia si chiama eth0.

$> ip addr add 10.0.0.99/8 dev eth0 

Ora, quando si accende il contenitore, specificare che l'indirizzo e collegarlo al vostro contenitore finestra mobile:

$> docker run -i -t --rm -p 10.0.0.99:80:8080 base 

l'argomento -p farà finestra mobile creare una regola NAT iptables che nat tutto il traffico che soddisfa la destinazione 10.0.0.99:80 al vostro contenitore di finestra mobile sulla porta 8080.

Se è necessario automatizzare il processo e la scala fuori, consultare questa risorsa: https://github.com/jpetazzo/pipework

La documentazione finestra mobile è un buon inizio: https://docker.github.io/engine/userguide/networking/

+2

Sì, ma come si mappano le porte in uscita di un container a un IP dell'host? –

+1

Non penso che tu abbia bisogno di farlo. Nella maggior parte delle situazioni, quando la comunicazione viene avviata da un'applicazione che risiede nel contenitore, la porta di origine è dinamica, quindi non è necessario un mapping. Quale sarebbe l'applicazione in cui è necessario mappare la porta di origine? Inoltre, disporre di porte di correzione per l'applicazione client comporta un rischio per la sicurezza, pertanto le porte di origine devono essere randomizzate. Maggiori dettagli qui [RFC6056] (https://tools.ietf.org/html/rfc6056) – nucatus

+1

> Quale sarebbe l'applicazione in cui è necessario mappare la porta di origine? - un server MRCP (RFC 6787), ad esempio. C'è un modo per assegnare veramente un indirizzo IP pubblico a un contenitore? –

9

Recentemente ho avuto lo stesso problema e risolto utilizzando Network Contenitori :

  • iniziare il mio contenitore di 'servizio' che voglio essere disponibili sul IP pubblico
  • creare un nuovo contenitore 'rete' che è collegato con il serv contenitore del ghiaccio e fa il percorso verso le porte esposte dal container di servizio. Questo contenitore avrà un'interfaccia di rete aggiuntiva collegata all'host in modo che possa acquisire un IP da DHCP.
  • Creare un bridge di rete dall'host Docker al contenitore utilizzando jpetazzo's Pipework (https://github.com/jpetazzo/pipework)
  • Il contenitore di rete acquisisce un indirizzo da DHCP.

Da questo punto il contenitore di rete è disponibile sulla rete e indirizza le porte al contenitore di servizi. Il vantaggio principale è che il contenitore 'servizio' non deve conoscere l'IP pubblico, il DHCP, ecc. In questo modo ogni contenitore in esecuzione può essere reso pubblico sulla rete.

Per comodità, ho creato uno script che fa tutto questo in una volta. Fare un contenitore in esecuzione disponibile su un IP pubblico è semplice come:

create-network-container.sh webserver ens32 

In questo caso si avrebbe bisogno di avere un contenitore di esecuzione chiamato 'webserver', e un'interfaccia di rete sul 'ens32' host.L'interfaccia è necessaria per creare il bridge nel contenitore di rete.

Lo script, informazioni più dettagliate ed esempi sono disponibili su: https://github.com/jeroenpeeters/docker-network-containers

Problemi correlati