it-swarm.com.de

Einem Docker-Container eine routingfähige IP-Adresse geben

Ich führe dies unter Ubuntu 14.04 aus und habe docker0 Auf eine statische IP eingestellt, die dann von der öffentlichen IP über die Firewall weitergeleitet wird. Ich versuche, meine Back-End-API so einzurichten, dass sie in einem Docker-Container ausgeführt wird, und bin durch einige Dinge verwirrt.

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

2.) Wenn dies noch nicht so geschehen ist, wie kann ich es dann schaffen, dass ich es nicht jedes Mal neu einrichten muss, wenn ich den Docker-Container erneut durchlaufe?

Danke im Voraus!

25
robert

Ich gehe davon aus, dass Sie Ihrem Docker-Container außerhalb von Docker eine IP zuweisen möchten.

Erstellen Sie zunächst eine neue IP und weisen Sie sie der Schnittstelle Ihres Hosts zu (wir gehen davon aus, dass Ihre Schnittstelle eth0 heißt.

$> ip addr add 10.0.0.99/8 dev eth0

Geben Sie nun beim Starten des Containers diese Adresse an und verknüpfen Sie sie mit Ihrem Docker-Container:

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

Das Argument -p veranlasst docker, eine iptables NAT Regel zu erstellen, die den gesamten Datenverkehr, der mit dem Ziel 10.0.0.99:80 übereinstimmt, für Ihren Docker-Container auf Port 8080 nicht berücksichtigt.

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

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

39
nucatus

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

  • Starten Sie meinen "Dienst" -Container, der auf der öffentlichen IP verfügbar sein soll
  • Erstellen Sie einen neuen Netzwerkcontainer, der mit dem Dienstcontainer verknüpft ist und das Routing zu den vom Dienstcontainer bereitgestellten Ports ausführt. Dieser Container verfügt über eine zusätzliche Netzwerkschnittstelle, die mit dem Host verbunden ist, damit er eine IP von DHCP abrufen kann.
  • Erstellen Sie mit jpetazzos Pipework ( https://github.com/jpetazzo/pipework ) eine Netzwerkbrücke vom Docker-Host zum Container.
  • Der Netzwerkcontainer bezieht eine Adresse von DHCP.

Ab diesem Zeitpunkt ist der Netzwerkcontainer im Netzwerk verfügbar und leitet die Ports an den Dienstcontainer weiter. Der Hauptvorteil besteht darin, dass der "Dienst" -Container nicht über die öffentliche IP, DHCP usw. informiert sein muss. Auf diese Weise kann jeder ausgeführte Container im Netzwerk öffentlich gemacht werden.

Der Einfachheit halber habe ich ein Skript erstellt, das all dies auf einmal erledigt. Das Bereitstellen eines laufenden Containers auf einer öffentlichen IP ist so einfach wie:

create-network-container.sh webserver ens32

In diesem Fall benötigen Sie einen laufenden Container namens "Webserver" und eine Netzwerkschnittstelle auf dem Host "ens32". Die Schnittstelle wird benötigt, um die Brücke in den Netzwerkcontainer zu erstellen.

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

9
Jeroen Peeters