2014-10-24 20 views
21

Ich verwende dies auf Ubuntu 14.04 und habe docker0 auf eine statische IP-Adresse gesetzt, die dann von der öffentlichen IP durch die Firewall weitergeleitet wird. Ich versuche, meine Back-End-API so einzurichten, dass sie in einem Andock-Container ausgeführt wird, und bin durch einige Dinge verwirrt.Einem Docker-Container eine routingfähige IP-Adresse geben

1.) Wie würde ich die IP-Adresse docker0 der IP des Containers zuordnen, so dass docker0 wissen würde, die eingehenden Pakete an den Container zu senden (dynamisch wenn möglich).

2.) Wenn ich das nicht schon so gemacht habe, wie kann ich es so einrichten, dass ich es nicht jedes Mal neu einrichten muss, wenn ich diesen Docker-Container neu starte?

Vielen Dank im Voraus!

+1

Haben Sie den Host-Option --net betrachtet =? siehe: https://docs.docker.com/articles/networking/#container-networking –

+0

Was meinst du damit, die eingehenden Pakete dynamisch zu senden? Angenommen, die Backend-API antwortet auf HTTP, was ist mit dem Einrichten eines HTTP-Proxys, der auch andere Dinge, z. SSL-Offloading usw. – andi5

Antwort

35

Ich nehme an, Sie möchten eine IP-Adresse Ihrem Docker-Container außerhalb von Docker zuweisen.

zunächst eine neue IP erstellen und zuweisen Schnittstelle zu Ihrem Host-(wir nehmen Ihre Schnittstelle eth0 genannt wird.

$> ip addr add 10.0.0.99/8 dev eth0 

Wenn Sie nun den Behälter anwerfen, geben Sie die Adresse und verknüpft es mit Ihrem docker Behälter:

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

die -p Argument wird docker eine iptables NAT-Regel machen schaffen, die den gesamten Verkehr nat wird am Hafen das Ziel 10.0.0.99:80 zu Ihrem docker Behälter passend 8080.

Wenn Sie den Prozess automatisieren müssen und es skalieren, konsultieren Sie diese Ressource: https://github.com/jpetazzo/pipework

Die Docker Dokumentation ist ein guter Anfang: https://docker.github.io/engine/userguide/networking/

+2

Ja, aber wie ordnen Sie die ausgehenden Ports eines Containers einer Host-IP zu? –

+1

Ich glaube nicht, dass du das tun musst. In den meisten Situationen, wenn die Kommunikation von einer Anwendung initiiert wird, die sich im Container befindet, ist der Quellport dynamisch, sodass Sie keine Zuordnung benötigen. In welcher Anwendung müssen Sie den Quellport zuordnen? Darüber hinaus stellt die Verwendung von Fixports für die Clientanwendung ein Sicherheitsrisiko dar, weshalb die Quellports zufällig ausgewählt werden müssen. Weitere Details hier [RFC6056] (https://tools.ietf.org/html/rfc6056) – nucatus

+1

> Was wäre die Anwendung, wo Sie den Quellport zuordnen müssen? - Zum Beispiel ein MRCP (RFC 6787) -Server. Gibt es eine Möglichkeit, eine öffentliche IP-Adresse wirklich einem Container zuzuweisen? –

9

Vor kurzem hatte ich das gleiche Problem und löste es Netzwerk Container mit :

  • meine ‚Service‘ Container starten, die ich
  • erstellen Ihnen einen neuen ‚Netzwerk‘ Container, der mit dem serv verfügbar sein soll auf der öffentlichen IP verbunden ist Eiscontainer und führt zu den Ports, die durch den Servicebehälter freigelegt werden. Dieser Container verfügt über eine zusätzliche Netzwerkschnittstelle, die mit dem Host überbrückt ist, sodass er eine IP von DHCP beziehen kann.
  • Erstellen Sie eine Netzwerkbrücke vom Docker-Host zum Container mit der Pipeline von jpetazzo (https://github.com/jpetazzo/pipework)
  • Der Netzwerkcontainer erhält eine Adresse von DHCP.

Ab diesem Zeitpunkt ist der Netzwerkcontainer im Netzwerk verfügbar und leitet die Ports an den Servicebehälter weiter. Der Hauptvorteil ist, dass der 'Service'-Container nicht über die öffentliche IP, DHCP, etc. informiert werden muss. Auf diese Weise kann jeder laufende Container im Netzwerk veröffentlicht werden.

Der Einfachheit halber habe ich ein Skript erstellt, das all dies gleichzeitig ausführt. ein Laufbehälter auf einer öffentlichen IP zu machen ist so einfach wie:

create-network-container.sh webserver ens32 

In diesem Fall müssten Sie einen laufenden Container ‚Webserver‘, und eine Netzwerk-Schnittstelle auf dem Host ‚ens32‘ genannt haben.Die Schnittstelle wird benötigt, um die Brücke in den Netzwerkcontainer zu erstellen.

Das Skript, detailliertere Informationen und Beispiele finden Sie auf: https://github.com/jeroenpeeters/docker-network-containers