web-dev-qa-db-ger.com

Wie erreiche ich Docker-Container über den Namen anstelle der IP-Adresse?

Kann ich meine Docker-Container über Namen anstelle von IP-Adressen erreichen?

Ich habe von Rohrleitungen gehört und habe einige DNS- und Hostnamen-Typoptionen für Docker gesehen, aber ich kann immer noch nicht alles zusammenfügen.

Vielen Dank für Ihre Zeit.

Ich bin mir nicht sicher, ob dies hilfreich ist, aber das habe ich bisher getan:

  • docker-Container-Host mit Docker-Maschine und dem vmwarevsphere-Treiber installiert
  • startete alle dienste mit docker-compose
  • Ich kann alle Dienste über IP und Port von jedem anderen Computer im Netzwerk aus erreichen

Ich habe meinem privaten Netzwerk-DNS-Server einen DNS-Alias-Eintrag hinzugefügt, der dem von docker-machine verwendeten Computernamen entspricht. Das Gerät erkennt jedoch immer eine andere IP-Adresse, wenn es startet und eine Verbindung zum Netzwerk herstellt.

Ich habe nur keine Ahnung, wo ich das angehen soll:

  • netzwerk-DNS-Server
  • hostname des Docker-Rechners
  • hostname des Docker-Containers
  • wahrscheinlich eine Kombination von allen

Ich suche wahrscheinlich nach etwas ähnlichem wie dieser Frage:

Wie kann Docker meinen Netzwerkrouter verwenden, um Containern auf einfache Weise DHCP-IP-Adressen zuzuweisen?

Jede allgemeine Richtung wird fantastisch sein ... Nochmals vielen Dank!

31
A L

Docker 1.10 hat einen eingebauten DNS. Wenn Ihre Container mit demselben benutzerdefinierten Netzwerk verbunden sind (erstellen Sie ein Netzwerk docker network create my-network und starte deinen Container mit --net my-network) Sie können unter Verwendung des Containernamens aufeinander verweisen. ( Docs ).

Cool!

Eine Einschränkung, wenn Sie Docker Compose verwenden, ist, dass Ihren Containernamen ein Präfix hinzugefügt wird, d. H. <project name>_<service name>-#. Dies macht die Kontrolle Ihrer Containernamen etwas schwieriger, kann jedoch für Ihren Anwendungsfall in Ordnung sein. Sie können die Docker-Funktion zum Erstellen von Namen überschreiben, indem Sie den Containernamen manuell in Ihrer Erstellungsvorlage festlegen. In diesem Fall können Sie jedoch nicht mit compose skalieren .

21
datacarl

Erstellen Sie ein neues Brückennetzwerk außer docker0, führen Sie Ihre Container darin aus, und Sie können die Container in diesem Netzwerk anhand ihrer Namen referenzieren.

Der Docker-Dämon führt einen eingebetteten DNS-Server aus, um die automatische Diensterkennung für Container bereitzustellen, die mit benutzerdefinierten Netzwerken verbunden sind. Anforderungen zur Namensauflösung aus den Containern werden zuerst vom eingebetteten DNS-Server verarbeitet.

Versuche dies:

docker network create <network name>
docker run --net <network name> --name test busybox nc -l 0.0.0.0:7000
docker run --net <network name> busybox ping test

Zunächst erstellen wir ein neues Netzwerk. Dann führen wir einen Busybox-Container mit dem Namen test aus, der Port 7000 überwacht (nur um ihn am Laufen zu halten). Schließlich pingen wir den Testcontainer nach seinem Namen und es sollte funktionieren.

5
rogamba

BEARBEITEN 2018-02-17: Docker entfernt möglicherweise den links -Schlüssel von Docker-Compose. Daher wird empfohlen, benutzerdefinierte Netzwerke wie hier angegeben zu verwenden => https : //docs.docker.com/compose/compose-file/#links


Angenommen, Sie möchten den Container mysql aus dem Container web Ihrer Datei docker-compose.yml Erreichen, z. B .:

web:
  build: .
  links:
    - mysql

mysqlservice:
  image: mysql

Sie werden erfreut sein, dass Docker Compose bereits einen mysqlservice -Domänennamen (im web -Container /etc/hosts) Hinzufügt, der auf den mysql -Container verweist.

Anstatt nach der IP-Adresse des Containers mysql zu suchen, können Sie einfach den Domänennamen mysqlservice verwenden.

Wenn Sie benutzerdefinierte Domainnamen hinzufügen möchten, ist dies auch mit dem Parameter extra_hosts möglich.

4
Oliboy50

Vielleicht möchten Sie dnsdock ausprobieren. Sieht einfach aus und ist einfach (!) Einzurichten. Schauen Sie sich http://blog.brunopaz.net/easy-discover-your-docker-containers-with-dnsdock/ und https://github.com/tonistiigi/ dnsdock .

3
Andreas Steffan

Wenn Sie eine sofort einsatzbereite Lösung wünschen, können Sie beispielsweise Kontena . Es kommt mit Netzwerk-Overlay-Technologie von Weave und diese Technologie wird verwendet, um virtuelle private LAN-Netzwerke zwischen Diensten zu erstellen. Dadurch ist jeder Service/Container mit service_name.kontena.local Erreichbar.

3
Lauri

Ich habe den --net Parameter mit --network Parameter und es läuft wie erwartet:

docker network create <network name>
docker run --network <network name> --name <container name> <other container options>
docker run --network <network name> --name <container name> <other container options>
2
Oscar Llop