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

Tipps zur HTML-Formatierung und langen Dateien für das Webdesign

<br />Verwandte Artikel: 9 praktische Vorsch...

Detaillierte Erläuterung der häufig verwendeten Filter von Tomcat

Inhaltsverzeichnis 1. Domänenübergreifender Filte...

Alibaba Cloud Ubuntu 16.04 baut IPSec-Dienst auf

Einführung in IPSec IPSec (Internet Protocol Secu...

HTML-Elemente (Tags) und ihre Verwendung

a : Gibt die Start- oder Zielposition eines Hyper...

CSS-Tricks zum Erstellen von Welleneffekten

Es war schon immer sehr schwierig, Welleneffekte ...

Die Popup-Maske der Frontend-Seite verhindert das Scrollen der Seite

Ein Problem, auf das Frontend-Entwickler häufig s...

Spezifische Verwendung des Stapelkontexts in CSS

Vorwort Unter dem Einfluss einiger CSS-Interaktio...

Mit Mailto ist das Senden von E-Mails im HTML-Format ganz einfach

Kürzlich habe ich dem Footer-Postfach des Kunden e...

Erklärung der Rückgabe einer MySQL-Tabelle führt zur Ungültigkeit des Index

Einführung Wenn die MySQL InnoDB-Engine Datensätz...

Lösen Sie das Problem „Rand: oberer Kollaps“ in CCS

Die HTML-Struktur ist wie folgt: Die CCS-Struktur...

Mehrere spezifische Methoden zur MySQL-Speicherplatzbereinigung

Inhaltsverzeichnis Vorwort 1. Überprüfen Sie die ...

Der Unterschied zwischen Datenzeit und Zeitstempel in MySQL

In MySQL gibt es drei Datumstypen: Datum (Jahr-Mo...

Installation und Verwendung von MySQL unter Ubuntu (allgemeine Version)

Unabhängig von der verwendeten Ubuntu-Version ist...

SQL-Implementierung von LeetCode (184. Das höchste Gehalt der Abteilung)

[LeetCode] 184. Abteilung Höchstes Gehalt Die Mit...