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

Lösung für Fehler 1290 beim Importieren von Dateidaten in MySQL

Fehlerszenario Verwenden Sie den MySQL-Befehl in ...

svg+css oder js zum Erstellen eines Tick-Animationseffekts

Mein Chef hatte mich gebeten, ein Programm zu ers...

MySQL-Datenbank-Entwicklungsspezifikationen [empfohlen]

Vor Kurzem haben wir SQL zur Optimierung online e...

So verwenden Sie den Vue-Video-Player für eine Live-Übertragung

Inhaltsverzeichnis 1. Installieren Sie den Vue-Vi...

Das native VIDEO-Tag der HTML-Seite verbirgt die Download-Button-Funktion

Beim Schreiben eines Webprojekts stieß ich auf ei...

So installieren Sie Docker mit YUM

Wie in der folgenden Abbildung dargestellt: Wenn ...

MySQL sollte niemals Update-Anweisungen wie diese schreiben

Inhaltsverzeichnis Vorwort Ursache Phänomen warum...

So erstellen Sie Ihren eigenen privaten Nexus-Server unter Linux

Dieser Artikel beschreibt, wie man über Docker ei...

Detaillierte Analyse des MySQL 8.0-Redo-Logs

Inhaltsverzeichnis Vorwort Generierung eines Redo...

Einfache Tipps zur Erhöhung der Ladegeschwindigkeit von Webseiten

Die Ladegeschwindigkeit einer Webseite ist ein wic...

So lernen Sie algorithmische Komplexität mit JavaScript

Inhaltsverzeichnis Überblick Was ist die O-Notati...