Jedes Mal, wenn Docker einen Container startet, werden die IP und die Hosts mit den angegebenen Operationen

Jedes Mal, wenn Docker einen Container startet, werden die IP und die Hosts mit den angegebenen Operationen

Vorwort

Jedes Mal, wenn Sie Docker verwenden, um einen Hadoop-Cluster zu starten, müssen Sie die Netzwerkkarte neu binden, die IP korrigieren und die Datei /etc/hosts ändern. Dies ist sehr problematisch, daher möchte ich die Ursache untersuchen und Optimierungsmöglichkeiten finden.

1. Gründe

/etc/hosts, /etc/resolv.conf und /etc/hostname, diese drei Dateien im Container existieren nicht im Image. Beim Starten des Containers werden diese Dateien in Form von Mount in den Container eingebunden. Wenn diese Dateien im Container geändert werden, sind die geänderten Teile daher nicht in der obersten Ebene des Containers vorhanden, sondern werden direkt in diese drei physischen Dateien geschrieben.

Warum verschwinden die Änderungen nach dem Neustart? Der Grund ist: Jedes Mal, wenn Docker einen Container startet, erstellt es eine neue /etc/hosts-Datei. Warum ist das so? Der Grund ist: Der Container wird neu gestartet, die IP-Adresse wird geändert und die ursprüngliche IP-Adresse in der Hosts-Datei ist ungültig. Daher sollte die Hosts-Datei geändert werden, da sonst fehlerhafte Daten generiert werden.

2. Lösung

Geben Sie bei jedem Start des Containers die IP-Adresse und den Hostnamen an und fügen Sie Hosts zu /etc/hosts hinzu. Der Befehl lautet wie folgt:

docker run -itd --name hadoop0 --hostname hadoop0 --net network_my --ip 192.168.10.30 --add-host hadoop1:192.168.10.31 --add-host hadoop2:192.168.10.32 -d -P -p 50070:50070 -p 8088:8088 hadoop:master

Docker-Netzwerkmodus und Konfigurationsvorgänge

--hostname: Hostnamen angeben;
--net: Netzwerkmodus angeben --ip: IP angeben
--add-host: Geben Sie den Host an, der zu /etc/hosts hinzugefügt werden soll.

Die obigen Befehle erfordern Docker-Version 1.9 oder höher;

Nachdem Sie den Container gestartet haben, betreten Sie den Container, um /etc/hosts anzuzeigen

[root@centos-linux-7 /]# docker exec -it hadoop0 bash
[root@hadoop0 /]# cat /etc/hosts
127.0.0.1 lokaler Host
::1 lokaler Host ip6-lokaler Host ip6-Loopback
fe00::0 ip6-lokales Netz
ff00::0 ip6-mcastprefix
ff02::1 ip6-alle Knoten
ff02::2 ip6-allerouter
192.168.10.31 hadoop1
192.168.10.32 hadoop2
192.168.10.30 hadoop0
[root@hadoop0 /]# 

Der obige Befehl ist zu lang und kann als Shell-Skript geschrieben werden. Im Internet werden mehrere andere Möglichkeiten erwähnt:

1. Verwenden Sie Dockerfile, um ein Image zu erstellen

2. Beginnen Sie mit der Verwendung von Docker-Compose

3. Ändern Sie die Konfigurationsdatei der Umgebungsvariablen, die der Docker-Container öffentlich zu laden beginnt (ich habe die Konfigurationsdatei für meine Version nicht gefunden).

Die erste Methode sollte nicht funktionieren. Obwohl Dockerfile beim Erstellen eines Images relevante Umgebungsvariablen festlegen kann, werden, wie bereits erwähnt, IP, Hostname und /etc/hosts alle neu geladen, sodass sie beim Starten des Docker-Containers angegeben werden müssen. Diese im Image sind nicht akzeptabel.

Zweitens bin ich mit Docker-Compose noch nicht vertraut und werde vorerst nicht näher darauf eingehen.

Der dritte ist für mich unpraktisch, da er öffentlich ist und nicht für verschiedene Container personalisiert werden kann;

Zusammenfassend halte ich es für am bequemsten, über die Befehlszeile anzugeben, wann der Container gestartet wird. Der Nachteil besteht jedoch darin, dass die Befehlszeile zu lang ist. Sie können es jedoch einfach als Shell-Skript schreiben!

Ergänzung: Linux Docker legt eine feste Container-IP fest (Docker-Standardcontainer-IP ändert sich)

1. Erstellen Sie Ihren eigenen Netzwerktyp und geben Sie das Netzwerksegment an

Befehl

Docker-Netzwerk erstellen --subnet=172.18.0.0/16 meinNetzwerk

2. Beim Starten des Images die eigene Netzwerk-IP angeben

Befehl

docker run -itd -p 5001:5001 --name Bildname --net mein Netzwerk --ip 172.18.0.2 --privileged=true --restart=always -d Bildname

3. Starten Sie Docker neu und zeigen Sie die Container-IP an

Docker neu starten

Befehl

Dienst Docker Neustart

Alle Container anzeigen

Befehl

Docker ps -a

Containerinformationen anzeigen

Befehl

Docker überprüft den Containernamen

Auf diese Weise ändert sich die Container-IP nicht

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung der Startreihenfolge des Docker-Containers mithilfe eines Shell-Skripts
  • Docker ändert die Konfigurationsinformationen eines nicht gestarteten Containers
  • Dockerfile-Implementierungscode beim Starten von zwei Prozessen in einem Docker-Container
  • Docker-Dateispeicherpfad, Befehlsvorgang zum Starten des Containers abrufen
  • Lösen Sie das Problem, dass Docker-Container sofort nach dem Start beendet werden
  • Docker-Batch starten und alle Container schließen

<<:  HTML-Tags dl, dt, dd zum Erstellen einer Tabelle vs. Tabellenerstellungstabelle

>>:  Vue realisiert einfachen Effekt des Lauflichts

Artikel empfehlen

Lassen Sie uns ausführlich über die LIMIT-Anweisung in MySQL sprechen

Inhaltsverzeichnis Frage Serverebene und Speicher...

Einige Hinweise zu MySQL-Routineberechtigungen

1. Wenn der Benutzer über die Berechtigung zum Er...

Tutorial zum Anzeigen und Ändern von MySQL-Zeichensätzen

1. Überprüfen Sie den Zeichensatz 1. Überprüfen S...

Installationsprozess von MySQL5.7.22 auf dem Mac

1. Verwenden Sie das Installationspaket, um MySQL...

Schritte zum Übertragen von Dateien und Ordnern zwischen zwei Linux-Servern

Heute habe ich mich mit der Migration eines Proje...

Die perfekte Lösung für das MySql-Versionsproblem sql_mode=only_full_group_by

1. Überprüfen Sie sql_mode wählen Sie @@sql_mode ...

XHTML-Einführungstutorial: Verwendung von Listen-Tags

Listen werden verwendet, um eine Reihe ähnlicher o...

So zeigen Sie den Kennwortablauf unter Linux an und konfigurieren ihn

Mit den richtigen Einstellungen können Sie Linux-...

JavaScript-Grundlagenvariablen

Inhaltsverzeichnis 1. Variablenübersicht 1.1 Spei...

Der visuelle Designpfad der Website sollte den Benutzergewohnheiten entsprechen

Cooper sprach über den visuellen Pfad des Benutze...