webentwicklung-frage-antwort-db.com.de

Wie kann ich Docker-Compose dazu bringen, die Container nur in einem definierten Netzwerk anstatt in 0.0.0.0 zu binden?

In aktuellen Versionen erstellt docker-compose automatisch ein neues Netzwerk für die von ihm erstellten Dienste. Grundsätzlich erhält jedes docker-compose-Setup einen eigenen IP-Bereich, sodass ich theoretisch meine Dienste über die IP-Adresse des Netzwerks mit den vordefinierten Ports aufrufen kann. Dies ist großartig, wenn Sie mehrere Projekte gleichzeitig entwickeln, da dann die Ports in docker-compose.yml nicht geändert werden müssen (d. H. Ich kann mehrere nginx-Projekte gleichzeitig auf Port 8080 auf verschiedenen Schnittstellen ausführen.)

Dies funktioniert jedoch nicht wie beabsichtigt: Jeder exponierte Port ist immer noch unter 0.0.0.0 verfügbar. Daher gibt es Portkonflikte mit mehreren Projekten. Es ist möglich, die Bindungs-IP in docker-compose.yml zu setzen, dies ist jedoch ein Killer für Portabilität - nicht jeder Entwickler im Team verwendet dasselbe Betriebssystem oder arbeitet in denselben Projekten, daher ist nicht klar, welche IP konfiguriert werden muss.

Es ist großartig, die IP-Adresse zu definieren, an die die Container in Bezug auf das Netzwerk gebunden werden sollen, das für dieses bestimmte Projekt erstellt wurde. docker-compose sollte sowohl wissen, welches Netzwerk er erstellt hat, als auch seine IP-Adresse, daher sollte dies kein Problem sein, jedoch konnte ich keinen einfachen Weg finden. Gibt es einen Weg oder ist das noch zu implementieren?

BEARBEITEN: Ein Beispiel für einen Portkonflikt: Stellen Sie sich zwei Projekte vor, von denen jedes einen Anwendungsserver auf Port 8080 und eine MySQL-Datenbank auf Port 3306 ausführt, die beide als "8080: 8080" und "3306: 3306" bereitgestellt werden. Durch Ausführen des ersten mit docker-compose wird ein Netzwerk mit der Bezeichnung app1_network mit einem IP-Bereich von 172.18.0.0/16 erstellt. Jeder exponierte Port ist an 0.0.0.0, d. H. An 127.0.0.1, an der Adresse WAN, an der Standard-Bridge (172.17.0.0/16) und an der 172.18.0.0/16 verfügbar. In diesem Fall kann ich meinen Anwendungsserver von allen 127.0.0.1:8080, 172.17.0.1:8080, 172.18.0.1:8080 und auch über $WAN_IP:8080 erreichen. Wenn ich jetzt die zweite Anwendung starte, wird ein zweites Netzwerk app2_network 172.19.0.0/16 gestartet, es wird jedoch weiterhin versucht, jeden freigegebenen Port an allen Schnittstellen zu binden. Diese Ports sind natürlich bereits belegt (mit Ausnahme von 172.19.0.1). Wenn es eine Möglichkeit gegeben hätte, jede Anwendung auf ihr Netzwerk zu beschränken, wäre die Anwendung 1 bei 172.18.0.1:8080 und die zweite bei 172.19.0.1:8080 verfügbar, und ich müsste die Portzuordnungen nicht auf 8081 und 3307 ändern beide Anwendungen gleichzeitig ausführen. 

In Ihrer Servicekonfiguration in docker-compose.yml:

ports:
 - "127.0.0.,:8001:8001"

Referenz: https://docs.docker.com/compose/compose-file/#ports

11

Sie können einen Port an einer einzigen IP-Adresse auf dem Host veröffentlichen, indem Sie die IP vor den Ports angeben:

docker run -p 127.0.0.1:80:80 -d nginx

Das obige führt nginx auf der Loopback-Schnittstelle aus. Sie können eine ähnliche Portzuordnung in einer docker-compose.yml-Datei verwenden. z.B.:

ports:
  - "127.0.0.1:80:80"

docker-compose besitzt keine besonderen Fähigkeiten, um auf die Netzwerkschnittstelle zu schließen, die auf dem Docker-Netzwerk basiert. Sie müssen die eindeutige IP-Adresse angeben, die in jeder Zusammenstellungsdatei verwendet werden soll, und diese IP muss für eine Netzwerkschnittstelle auf Ihrem Host sein. Bei einem Entwicklercomputer kann sich diese IP-Adresse ändern, da DHCP dem Laptop/der Workstation neue Adressen gibt.

Aufgrund der Schwierigkeiten bei der Umsetzung Ihres Ziels würden die meisten entweder unterschiedliche Ports auf dem Host verschiedenen Containern zuordnen, also 13307: 3307 für Container a, 23307: 3307 für Container b, 33307: 3307 für Container c, oder was auch immer für ein Zahlenschema sinnvoll ist Sie. Wenn Sie mit HTTP-Datenverkehr arbeiten, ist die Verwendung eines Reverse-Proxy wie Traefik oft am sinnvollsten.

3
BMitch