Datenverwaltung mit Docker Volumes
Eine Herausforderung bei der Arbeit mit Docker-Containern ist die Datenpersistenz. Container sind kurzlebig, was bedeutet, dass alle innerhalb eines Containers erstellten Daten verloren gehen, wenn der Container entfernt wird. Docker Volumes lösen dieses Problem, indem sie eine Möglichkeit bieten, Daten außerhalb von Containern zu persistieren.
Docker Volumes verstehen
Docker Volumes sind der bevorzugte Mechanismus zur Persistenz von Daten, die von Docker-Containern generiert und verwendet werden. Sie werden vollständig von Docker verwaltet und sind von der Verzeichnisstruktur des Host-Dateisystems isoliert.
Vorteile der Verwendung von Volumes sind:
- Volumes lassen sich einfacher sichern oder migrieren als Bind-Mounts
- Sie können Volumes mit Docker CLI-Befehlen verwalten
- Volumes funktionieren sowohl auf Linux- als auch auf Windows-Containern
- Volumes können sicherer zwischen mehreren Containern geteilt werden
- Volume-Treiber ermöglichen es Ihnen, Volumes auf Remote-Hosts, Cloud-Anbietern zu speichern oder den Inhalt von Volumes zu verschlüsseln
Erstellen und Verwenden von Docker Volumes
Lassen Sie uns einen einfachen MySQL-Datenbank-Container erstellen, der ein Volume verwendet, um seine Daten zu persistieren.
Erstellen eines Volumes
Erstellen Sie zuerst ein Docker Volume:
docker volume create mysql-data
Sie können alle Volumes mit folgendem Befehl auflisten:
docker volume ls
Sie sollten Ihr neues Volume in der Liste sehen:
DRIVER VOLUME NAME
local mysql-data
Ausführen eines Containers mit einem Volume
Lassen Sie uns nun einen MySQL-Container ausführen, der dieses Volume verwendet:
docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=mysecretpassword -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
Dieser Befehl:
--name mysql-db
: Benennt den Container "mysql-db"
-e MYSQL_ROOT_PASSWORD=mysecretpassword
: Legt eine Umgebungsvariable zur Konfiguration von MySQL fest
-v mysql-data:/var/lib/mysql
: Mountet das Volume "mysql-data" in das Verzeichnis, in dem MySQL seine Daten speichert
-p 3306:3306
: Ordnet Port 3306 auf dem Host Port 3306 im Container zu
-d
: Führt den Container im Detached-Modus aus
mysql:5.7
: Gibt das zu verwendende Image an
Warten Sie einen Moment, bis der Container gestartet ist, und überprüfen Sie dann, ob er läuft:
docker ps
Interaktion mit der Datenbank
Lassen Sie uns eine Datenbank und eine Tabelle erstellen, um die Datenpersistenz zu demonstrieren. Stellen Sie zuerst eine Verbindung zum MySQL-Container her:
docker exec -it mysql-db bash
Stellen Sie innerhalb des Containers eine Verbindung zum MySQL-Server her:
mysql -u root -pmysecretpassword
Erstellen Sie eine neue Datenbank und Tabelle:
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
INSERT INTO users (name) VALUES ('John'), ('Jane'), ('Bob');
SELECT * FROM users;
Sie sollten die eingefügten Daten sehen:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Jane |
| 3 | Bob |
+----+------+
Beenden Sie die MySQL-Eingabeaufforderung und den Container:
exit
exit
Testen der Volume-Persistenz
Lassen Sie uns nun den Container stoppen und entfernen und dann einen neuen Container mit demselben Volume erstellen:
docker stop mysql-db
docker rm mysql-db
Erstellen Sie einen neuen Container mit demselben Volume:
docker run --name mysql-db-new -e MYSQL_ROOT_PASSWORD=mysecretpassword -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:5.7
Stellen Sie nun eine Verbindung zum neuen Container her und überprüfen Sie, ob unsere Daten persistent sind:
docker exec -it mysql-db-new bash
mysql -u root -pmysecretpassword
USE testdb
SELECT * FROM users
Sie sollten dieselben Daten sehen, die wir zuvor eingefügt haben:
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Jane |
| 3 | Bob |
+----+------+
Beenden Sie die MySQL-Eingabeaufforderung und den Container:
exit
exit
Dies zeigt, dass die Daten auch nach dem Entfernen des ursprünglichen Containers persistent waren, da sie in einem Docker Volume gespeichert wurden.
Untersuchen und Verwalten von Volumes
Sie können ein Volume untersuchen, um weitere Informationen darüber zu erhalten:
docker volume inspect mysql-data
Dies zeigt Details wie den Mount-Punkt und den verwendeten Treiber an:
[
{
"CreatedAt": "YYYY-MM-DDTHH:MM:SS+00:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
"Name": "mysql-data",
"Options": {},
"Scope": "local"
}
]
Um aufzuräumen, lassen Sie uns den Container stoppen und entfernen:
docker stop mysql-db-new
docker rm mysql-db-new
Wenn Sie auch das Volume entfernen möchten:
docker volume rm mysql-data
Sie haben nun gelernt, wie Sie Docker Volumes verwenden, um Daten zwischen Container-Lebenszyklen zu persistieren, was für zustandsbehaftete Anwendungen wie Datenbanken unerlässlich ist.