Beheben Sie das Problem, dass Änderungen an der Docker MySQL-Containerdatenbank nicht wirksam werden

Beheben Sie das Problem, dass Änderungen an der Docker MySQL-Containerdatenbank nicht wirksam werden

Die Verwendung des offiziellen MySQL-Images erfordert einige Änderungen, z. B. an Konfigurationsdateien, DB-Datendateiverzeichnissen usw. Wenn Sie den Container nach den Änderungen erneut ausführen, sind die geänderten Dateien ungültig und der neu generierte Container verfügt nicht über den zuvor geänderten Inhalt.

Die erste besteht darin, das von der offiziellen Website heruntergeladene Image zu ändern und dann eine neue Image-Datei (Docker Commit -m) und andere neu generierte Image-Informationen zu übermitteln.

Der zweite Typ von MySQL-DB-Daten: Wenn Sie denselben Container nach dem Schließen des Containers mit Docker-Neustart neu starten, sind die Daten normal. Wenn Sie den Container erneut mit Docker ausführen, werden die Daten nicht angezeigt, da jeder Container eine Dateiadresse hat

Dies erfordert das Mounten der Datendatei, damit sie von anderen Containern gelesen werden kann.

Starten Sie den MySQL-Container im Docker, nehmen Sie Änderungen an der Datenbank im MySQL-Container vor (z. B. Erstellen einer Datenbank, Ändern von Daten usw.) und rufen Sie den Container nach dem Commit erneut auf. Dabei stellen Sie fest, dass alle vorherigen Änderungen nicht gespeichert wurden.

1. Führen Sie den MySQL-Container im Hintergrund aus und legen Sie den Containernamen auf MySQL fest:

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql

f80791a0daf194fdba94f16a9d89ebec8ba8fbd8af28d3ea8b599b9d705f85ba

2. Geben Sie den Container Bash und MySQL ein, erstellen Sie eine Datenbank TEST_DB und überprüfen Sie, ob TEST_DB erfolgreich erstellt wurde:

[root@localhost ~]# docker exec -it mysql bash root@f80791a0daf1:/# mysql -uroot -p 
Datenbanken anzeigen; 
Datenbank TEST_DB erstellen;

3. Beenden Sie den Container und übernehmen Sie die Änderungen in das Image: Diese Daten werden tatsächlich auf dem Hostcomputer geändert, nicht im MySQL-Image. Es funktioniert also nicht

mysql> beenden
Tschüss
root@f80791a0daf1:/# beenden
Ausfahrt
[root@localhost ~]# Docker-Commit MySQL Owenchen1992/MySQL

4. Starten Sie den Container neu und geben Sie Bash und MySQL ein. Sie werden feststellen, dass der zuvor erstellte TEST_DB verschwunden ist, was darauf hinweist, dass die vorherigen Änderungen ungültig sind:

[root@localhost ~]# Docker-Container stoppt MySQL
MySQL
[root@localhost ~]# Docker-Container rm mysql 
MySQL
[root@localhost ~]# docker run --name=mysql -p 3306:3306 -d owenchen1992/mysql
a1a1b4174caaadda0ec4b01b9fe5f92d6b3464d85284042274f71aebde0915dd
[root@localhost ~]# docker exec -it mysql bash
root@a1a1b4174caa:/#mysql -uroot -p
Passwort eingeben: 
Willkommen beim MySQL-Monitor. Befehle enden mit ; ​​oder \g.
Ihre MySQL-Verbindungs-ID ist 3
Serverversion: 5.7.20 MySQL Community Server (GPL)
 
mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|mysql |
| Leistungsschema |
|System|
+--------------------+
4 Zeilen im Satz (0,00 Sek.)

Ursache des Problems:

Im MySQL-Dockerfile gibt es eine Zeile wie diese:

VOLUME /var/lib/mysql

Dies bedeutet, dass alle Änderungen am Verzeichnis /var/lib/mysql im Container einem bestimmten Speicherort auf dem Host zugeordnet werden. Sie können das entsprechende Host-Verzeichnis mit dem Befehl „docker inspect containerID/name“ anzeigen. Beim Ausführen von „docker commit“ werden Änderungen am Verzeichnis /var/lib/mysql im Container nicht in das Image übernommen, diese Änderungen werden jedoch jederzeit mit dem entsprechenden Verzeichnis auf dem Host synchronisiert.

Wenn Sie das festgeschriebene Image neu starten, erstellt der Container ein neues Verzeichnis auf dem Host, um seine Datenaktualisierungen zu speichern. Da es sich nicht um das ursprüngliche Hostverzeichnis handelt, kann der neu geöffnete Container die vorherigen Datenänderungen nicht sehen.

Lösung:

Nachdem wir nun die Ursache des Problems kennen, ist es nicht schwer, es zu lösen. Die Schritte sind wie folgt:

Sie können direkt zu diesem Verzeichnis gehen, um das für jeden Container generierte Datenverzeichnis anzuzeigen

1. Suchen Sie das Hostverzeichnis, das dem MySQL-Container "/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data" entspricht:

[root@localhost ~]# Docker untersucht MySQL
[
......
    "Quelle": "/var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data",
    "Ziel": "/var/lib/mysql",
......
]

Wiederholen Sie die vorherigen Schritte zum Erstellen und Ausführen eines Containers, führen Sie einen neuen Container aus und erstellen Sie dann eine TEST-Tabelle. Schließen Sie zuerst den Container und löschen Sie dann den Containerdienst.

4. Führen Sie den neuen Container im Hintergrund aus, mounten Sie das dem Host-Rechner entsprechende Verzeichnis in das /var/lib/mysql-Verzeichnis des Containers und aktivieren Sie Lese- und Schreibberechtigungen (wichtige Schritte):

[root@localhost ~]# docker run --name=mysql -p 3306:3306 -v /var/lib/docker/volumes/8496bbf33782bdadc027cdcf23197e5ebc36d11deb69ee833d63b557b3a7183d/_data:/var/lib/mysql:rw -d owenchen1992/mysql

5. Geben Sie nun den neu geöffneten Container ein und überprüfen Sie die Datenbank: Es wird festgestellt, dass die soeben erstellte Datenbank TEST_DB durch erneutes Ausführen des Containers nicht verschwindet und das Problem behoben ist

Die Schritte sind: 1. Erstellen Sie eine neue Tabelle. 2. Fahren Sie den Container zum Erstellen der Tabelle herunter. 3. Führen Sie den Container erneut aus und mounten Sie das Datenverzeichnis in /var/lib/mysql. Schon ist das Problem gelöst!

Ergänzendes Wissen: So ändern Sie das Kodierungsformat bei Verwendung von MySQL in einer Docker-Umgebung

Methode 1 (für die Modifikation einer einzelnen Maschine)

Stellen Sie zunächst sicher, dass der MySQL-Dienst gestartet ist

Geben Sie docker exec -it + Dienstname/bin/bash ein, um die Konsole aufzurufen

Geben Sie den Befehl apt-get update ein

Geben Sie apt-get install vim ein (die beiden obigen Befehle dienen zum Herunterladen des Vim-Editors).

Geben Sie den Befehl vim /etc/mysql/mysql.conf.d/mysqld.cnf ein, um die Datei mysqld.cnf aufzurufen

4. Öffnen Sie mit i den Editiermodus und geben Sie am Ende des Textes folgendes ein:

Hinweis: Nachfolgende Inhalte dürfen nicht falsch eingetragen werden, da sonst die Konfigurationsdatei ungültig wird.

[Kunde]
Standardzeichensatz = utf8
[mysql]
Standardzeichensatz = utf8
[mysqld]
Zeichensatzserver = utf8

Drücken Sie ESC zum Beenden und Umschalt+Doppelpunkt wq zum Speichern und Beenden.

5. Rufen Sie die MySQL-Konsole auf

6. Geben Sie show variables like 'char%'; ein, um die geänderten entsprechenden Informationen anzuzeigen

Nachdem die Änderung abgeschlossen ist und die Datenbank neu gestartet wurde: Geben Sie Show-Variablen wie „char%“ ein.

Die obigen Ergebnisse zeigen, dass die Änderung erfolgreich war.

Methode 2 (anwendbar auf Cluster-Konstruktion)

Kopieren Sie die Konfigurationsdatei aus dem Originalverzeichnis und ändern Sie sie mithilfe einer externen Datei. Diese Methode wird verwendet, um Dateien an mehrere Server zu senden und so die Standardkodierung der Datenbank zu ändern.

docker exec -it + Dienstname/bin/bash, um die Konsole aufzurufen

Geben Sie cd /etc/mysql/conf.d/ ein, um das Konfigurationsdateiverzeichnis aufzurufen

Geben Sie pwd ein, um den absoluten Pfad der Datei zu erhalten

Geben Sie cd ein, um zur Konsole zurückzukehren, beenden Sie

Geben Sie den Docker-CP-Dienstnamen ein: /etc/mysql/conf.d/mysql.cnf /usr/soft (kopieren Sie die Datei mysql.cnf im Docker in den Soft-Ordner unter Linux)

Öffnen Sie einen externen Editor (z. B. Notepad++) und schreiben Sie die Konfigurationsdatei wie folgt:

[Kunde]
Standardzeichensatz = utf8

[mysql]
Standardzeichensatz = utf8

[mysqld]
init_connect = 'SET-Sortierung_Verbindung = utf8_unicode_ci'
init_connect='Namen festlegen utf8'
Zeichensatzserver = utf8
Sortierserver = utf8_unicode_ci
Zeichensatz-Client-Handshake überspringen

PS: Es ist wichtig zu beachten, dass zwischen den Inhalten der Konfigurationsdatei Abstände vorhanden sein müssen.

Gut sparen

7.docker cp /usr/soft/mysql.cnf Dienstname: /etc/mysql/conf.d/ Kopieren Sie die geänderte Datei in das ursprüngliche Verzeichnis und überschreiben Sie sie

8. Starten Sie den MySQL-Dienst im Docker neu.

9. Geben Sie den Befehl show variables like 'char%' ein, um das geänderte Zeichenkodierungsformat anzuzeigen

Der obige Artikel zur Lösung des Problems, dass Änderungen an der Docker MySQL-Containerdatenbank nicht wirksam werden, ist der gesamte Inhalt, den der Herausgeber mit Ihnen teilt. Ich hoffe, er kann Ihnen als Referenz dienen, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

Das könnte Sie auch interessieren:
  • Der Docker-Container wird direkt ausgeführt, um den öffentlichen IP-Vorgang über Ping abzurufen
  • Docker-Dateispeicherpfad, Befehlsvorgang zum Starten des Containers abrufen
  • Zwei Möglichkeiten zum Beenden von Bash im Docker-Container unter Linux
  • Starten Sie alle gestoppten Docker-Container mit einem Befehl neu
  • Detaillierte Erklärung der Startbefehle für Docker-Versionen es, milvus und minio
  • Docker startet das Elasticsearch-Image und behebt den Fehler nach dem Mounten des Verzeichnisses
  • Lösen Sie das Problem der Docker-Protokollmontage

<<:  HTML-Tutorial: Definitionsliste

>>:  Tabellen-Paging-Funktion implementiert durch Vue2.0+ElementUI+PageHelper

Artikel empfehlen

Verbesserung der Aktualisierungsfunktion für Zen-Codierungsressourcen

Offizielle Website: http://code.google.com/p/zen-c...

JavaScript zum Hinzufügen und Löschen von Nachrichten im Message Board

Dieser Artikel zeigt ein kleines Beispiel für das...

HTML+Sass implementiert HambergurMenu (Hamburger-Menü)

Vor ein paar Tagen habe ich mir ein Video von ein...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.17

Dieser Artikel enthält das grafische Tutorial zur...

Gestaltung von Popup-Fenstern und schwebenden Ebenen im Webdesign

Im Zuge des schrittweisen Übergangs von herkömmli...

Installieren Sie zwei MySQL5.6.35-Datenbanken unter Win10

Notieren Sie die Installation von zwei MySQL5.6.3...

Die Tücken der automatischen Inkrementierung numerischer MySQL-Typen

Beim Entwurf von Tabellenstrukturen gehören numer...

js, css, html bestimmen die verschiedenen Versionen des Browsers

Verwenden Sie reguläre Ausdrücke, um die IE-Browse...

Implementierung der VUE-Anzeige unendlicher Ebenenbaum-Datenstrukturen

Inhaltsverzeichnis Rekursiver Aufruf der Komponen...

Basiswissen: Was bedeutet http vor einer Website-Adresse?

Was ist HTTP? Wenn wir eine Website durchsuchen m...

Lösung für das MySQL IFNULL-Beurteilungsproblem

Problem: Die von mybatis zurückgegebenen Daten vo...

VPS erstellt Offline-Download-Server (nach der Ära der Netzwerkfestplatten)

Motivation Aus Lerngründen habe ich einen VPS-Die...

So implementieren Sie ein responsives Layout mit CSS

Implementieren eines responsiven Layouts mit CSS ...

Lösen Sie das Problem beim Laden der Vektorkartenquelle in OpenLayers 3

1. Vektorkarte Vektorgrafiken verwenden gerade Li...