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:
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:
Ich suche wahrscheinlich nach etwas ähnlichem wie dieser Frage:
Jede allgemeine Richtung wird fantastisch sein ... Nochmals vielen Dank!
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 .
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.
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.
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 .
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.
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>