Was tun, wenn der von Docker Run gestartete Container hängt und Daten verliert?

Was tun, wenn der von Docker Run gestartete Container hängt und Daten verliert?

Szenariobeschreibung

In einem bestimmten System wird der funktionale Dienst mit docker stack deploy xxx gestartet und der Dienst einer inländischen Datenbank wird separat mit docker run xxx gestartet. Der Datenbankdienst mountet den Speicherort nicht;

Daraufhin startete der Kunde den Server neu ... Als er sich beim Server anmeldete, um den Dienst neu zu starten, stellte er ein Problem fest: Die vorherigen Daten in der Datenbank konnten verschwinden (wenn Docker Run verwendet wird, um den Dienst erneut zu starten).

Lösung

Versuch 1

Ich dachte zunächst, die Daten seien definitiv verloren und musste die Daten noch einmal wiederherstellen, doch der Arbeitsaufwand war zu groß...

Aber es gibt keine Möglichkeit, beim nächsten Start einfach den Speicher auf der Festplatte zu mounten, Orz

Nach einer Diskussion mit meinen Kollegen fand ich jedoch eine einfachere (aber nicht dauerhafte) Lösung. Siehe Versuch 2.

Versuch 2

Ein Kollege hat erwähnt, dass man mit docker start container_name den Container erneut starten kann, sodass die Daten noch da sind. Ich habe es später versucht und die Daten waren immer noch da … obwohl es nur eine vorübergehende Lösung war

Später habe ich darüber nachgedacht: Wenn die Daten des von Docker gestarteten Images nicht zugeordnet werden, werden sie im Standardvolume gespeichert. Selbst wenn der Container mit Docker-Neustart xxx neu gestartet wird, sind die geänderten Daten immer noch vorhanden. Das heißt, an diesem Punkt wird der Server neu gestartet und der Container hängt (verwenden Sie Docker PS zum Anzeigen, der Containerstatus lautet „Beendet“). Tatsächlich befinden sich die vorherigen Daten jedoch noch im Standardvolume, und die geänderten Daten gehen erst verloren, wenn der Container gelöscht wird.

Verifizierungstest

Packen Sie einfach ein Image, starten Sie den Container, erstellen Sie eine Datei, stoppen Sie ihn, starten Sie ihn erneut und prüfen Sie, ob die Datei vorhanden ist.

# Starten Sie den Container ➜ docker_start_test docker run -itd --name docker_run_test 4cbf48630b46 ping 127.0.0.1
d6278f537113122d4ccbe00950790750215c5a09002bcbd1ef6f9e660fc9eaac
➜ docker_start_test docker ps -a
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
d6278f537113 4cbf48630b46 "ping 127.0.0.1" vor 3 Sekunden Up 2 Sekunden docker_run_test
# Dateien zum Container hinzufügen ➜ docker_start_test docker exec -it docker_run_test /bin/sh
sh-4.2# pwd
/
sh-4.2# Berührungstest
sh-4.2# beenden
Ausfahrt
# Starten Sie den Container neu ➜ docker_start_test docker stop docker_run_test
docker_run_test
➜ docker_start_test docker ps -a | grep docker_run_test
d6278f537113 4cbf48630b46 "ping 127.0.0.1" Vor etwa einer Minute Beendet (137) vor 12 Sekunden docker_run_test
# Gehen Sie hinein und prüfen Sie, ob die Datei existiert ➜ docker_start_test docker start docker_run_test
docker_run_test
➜ docker_start_test docker exec -ti docker_run_test /bin/sh
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 verloren+gefunden Medien mnt opt ​​proc root run sbin srv sys test tmp usr var

Wie Sie sehen, ist die Datei test immer noch vorhanden. Wenn Sie den Container stoppen, den Container mit docker rm löschen und einen Container mit demselben Namen neu starten, können Sie sehen, dass sich im Container keine Testdatei befindet.

# Container stoppen / rm ➜ docker_start_test docker stop docker_run_test
docker_run_test
➜ docker_start_test docker ps -a | grep docker_run
d6278f537113 4cbf48630b46 "ping 127.0.0.1" vor 7 Minuten Beendet (137) vor 13 Sekunden docker_run_test
➜ docker_start_test docker rm d6278f537113
d6278f537113
# Starten Sie einen neuen Container mit demselben Namen ➜ docker_start_test docker run -itd --name docker_run_test 4cbf48630b46 ping 127.0.0.1
99a6f5df0a86e4c07abf184e322a23e4fbec89ff354691459cdac8fcd8687ba3
# Geben Sie den zu überprüfenden Container ein ➜ docker_start_test docker exec -ti docker_run_test /bin/sh
sh-4.2# ls
anaconda-post.log bin dev etc home lib lib64 verloren+gefunden Medien mnt opt ​​proc root run sbin srv sys tmp usr var
sh-4.2# ls-Test
ls: kann nicht auf Test zugreifen: Keine solche Datei oder kein solches Verzeichnis

Anweisungen für den Docker-Auslauf

Laut der offiziellen Website lautet die Funktion des Startbefehls:

Start one or more stopped containers

Ähm, ziemlich unkompliziert, nicht viel zu sagen

PS

Tatsächlich besteht der beste Weg darin, das Speicherverzeichnis des Containers bereitzustellen. Darüber hinaus sollten Datenbankdienste im Allgemeinen nicht mithilfe von Containern gestartet werden.

Zusammenfassen

Oben habe ich Ihnen erklärt, was zu tun ist, wenn der von Docker Run gestartete Container die Daten aufhängt. Ich hoffe, es wird Ihnen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!
Wenn Sie diesen Artikel hilfreich finden, können Sie ihn gerne abdrucken und dabei bitte die Quelle angeben. Vielen Dank!

Das könnte Sie auch interessieren:
  • docker run -v mountet Datenvolumes abnormal und der Containerstatus wird immer neu gestartet
  • Eine kurze Diskussion zum Problem des Docker-Run-Containers im erstellten Status
  • Lösung zur automatischen Beendigung von Docker Run-Containern
  • Detaillierte Einführung in den Lebenszyklus von Docker Runc-Containern
  • Lösen Sie das Problem, dass der Container nach dem Docker-Lauf „Beendet (0)“ anzeigt.

<<:  Probleme und Lösungen bei der Nutzung der MySQL-Datenbanküberwachungssoftware Lepus

>>:  Beispiel für das Abhören des Vue-Routings zum dynamischen Laden derselben Seite

Artikel empfehlen

Was sind die Unterschiede zwischen SQL und MySQL

Was ist SQL? SQL ist eine Sprache zum Betrieb von...

JavaScript implementiert einen verschiebbaren Fortschrittsbalken

In diesem Artikel wird der spezifische JavaScript...

Linux-Datenträgerverwaltung – LVM-Nutzung

1. Einführung in LVM Bei der Verwaltung von Linux...

25 neue nützliche Icon-Sets zum Download im Ausland

1. E-Commerce-Symbole 2. Symbol Süßigkeiten 2 3. ...

Eine sehr detaillierte Erklärung der Linux C++ Multi-Thread-Synchronisierung

Inhaltsverzeichnis 1. Mutex 1. Initialisierung de...

Verwendung des optionalen Verkettungsoperators von JS

Vorwort Der optionale Verkettungsoperator (?.) er...

Forschung zur Größe von Webseiten

<br />Statistiken zufolge hat sich die durch...

Implementierung der Docker-Container-Verbindung und -Kommunikation

Die Portzuordnung ist nicht die einzige Möglichke...

CentOS7 64-Bit-Installation MySQL Grafik-Tutorial

Voraussetzungen für die Installation von MySQL: I...

Ausführliche Erklärung der Iteratoren in ECMAScript

Inhaltsverzeichnis Vorwort Frühere Iterationen It...

So implementieren Sie ein responsives Layout mit CSS

Implementieren eines responsiven Layouts mit CSS ...