Wie löse ich die IP eines anderen Containers in einem Docker-Schwarm richtig auf? (DNS)

1540
Hubro

Ich spiele mit dem Bereitstellen von Diensten in einem Docker-Schwarm. Ich habe Probleme, einen Container konsistent mit einem Container auf einem anderen Knoten verbinden zu lassen.

Nehmen wir an, ich baue einen GlusterFS-Pool. Ich muss ein Terminal in jedem Container öffnen und den Glanzdämon zum Pool hinzufügen. Wie verweise ich auf andere Container im Pool? Derzeit verwende ich eine IP-Adresse, aber was ist, wenn ein Container stirbt und neu erstellt wird? Soweit ich weiß, kann nicht garantiert werden, dass der neue Container dieselbe IP-Adresse hat. Ich könnte den eingebetteten DNS-Server verwenden, um auf die anderen Container zu verweisen, aber ich kann scheinbar nur die Containernamen und Container-IDs in IP-Adressen auflösen. Beide ändern sich, wenn ein Container stirbt und neu erstellt wird, sodass es keinen Sinn macht.

Sollte ich die Hostnamen der anderen Container nicht in ihre IP-Adressen auflösen können ? Ich nahm an, dass es so wäre, aber nicht.

Gibt es Lösungen für mein Rätsel? (Ich habe das Gefühl, dass ich mit Diensten völlig falsch umgehen möchte und dass ich in diesem Fall manuell einen Container auf jedem Knoten erstellen sollte.)

2
Versuchen Sie, Hostnamen für eine Situation wie "Container A von Service X + Container B von Service Y" oder für "Container A von Service X + Container B von Service X" aufzulösen? Sprichst du also von Replikaten, die sich unter Verwendung ihres Hostnamens verbinden können, oder ist deine Frage nach zwei verschiedenen Diensten, die sich miteinander verbinden müssen? Später sollte leicht mit der `--name`-Option des Andockdienstes erreichbar sein Murmel vor 6 Jahren 0

1 Antwort auf die Frage

3
Murmel

Abhängig von Ihrer genauen Situation müssen Sie unterschiedliche Lösungen verwenden:

Dienstinterne Hostnamenauflösung

Problem: Sie haben mehrere Container (/ Replikate) desselben Dienstes serviceX, zB:

  • Container a1b3d130275amit HostnameserviceX.1.nq4rjbae
  • Container 65040b1cada6mit HostnameserviceX.2.m9wl1f1r
  • Container 944704427b9emit HostnameserviceX.3.3d08baql

Nun möchten Sie den Hostnamen des zweiten ( serviceX.2.m9wl1f1r) und des dritten ( serviceX.3.3d08baql) Containers aus dem Container one ( serviceX.1.nq4rjbae) abrufen .

Docker bietet eine Lösung namens Container Discovery mit einer DNS-Abfrage gegen tasks.$serviceName:

nslookup tasks.serviceX [...] Name: tasks.serviceX Address 1: 10.0.0.205 a1b3d130275a (<- resolved locally by /etc/hosts) Address 2: 10.0.0.206 serviceX.2.m9wl1f1r Address 3: 10.0.0.207 serviceX.3.3d08baql 

Darüber hinaus gibt es Diskussionen über die Herstellung von serviceX.auflösbaren und somit vorhersehbar hostnames.¹ Schaffung ² ³ ⁴ Aber jetzt, keiner von ihnen umgesetzt wird, so dass diese Lösung funktioniert nur zur Laufzeit.

Hinweis: Wenn Sie den Hostnamen mithilfe der Vorlagenfunktion (wie docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}) festlegen, werden die Hostnamen lokal vorhersehbar, sie können jedoch von anderen Containern nicht aufgelöst werden.

Auflösung der Hostnamen zwischen Diensten

Problem: Sie haben mutliple Behälter der verschiedenen Dienste serviceX, serviceY. Aber nur ein Container pro Service, zB:

  • Container a1b3d130275amit HostnameserviceX.1.nq4rjbae
  • Container 65040b1cada6mit HostnameserviceY.2.m9wl1f1r

Und Sie möchten eine Verbindung zu einem Container eines anderen Dienstes ( serviceX) von einem Dienst ( serviceY) herstellen und umgekehrt. Sie müssen nur den --nameParameter verwenden:

docker service create --name=serviceX serviceX docker service create --name=serviceY serviceY 

Sie können sich darauf verlassen, dass der Container a1b3d130275anach Hostname serviceXund Container 65040b1cada6nach Hostname auflösbar ist serviceY.

Referenz: