So deployen Sie MySQL/MariaDB in Docker mit persistentem Datenspeicher.
Einführung
In diesem Tutorial setzen Sie einen MySQL- oder MariaDB-Datenbankcontainer mit Docker und persistentem Datenspeicher ein. Das Ausführen von Datenbanken in Containern vereinfacht die Bereitstellung, Versionskontrolle und Portabilität über verschiedene Umgebungen hinweg. Am Ende dieses Tutorials haben Sie eine produktionsreife MySQL- oder MariaDB-Instanz, die in Docker läuft und deren Daten sicher außerhalb des Containers gespeichert sind.
Voraussetzungen
Zielgruppe: Fortgeschrittene Systemadministratoren
Geschätzte Zeit zur Fertigstellung: ~30–45 Minuten
Betriebssystem
- Ubuntu 24.04 LTS (getestet)
- Auch kompatibel mit: Ubuntu 22.04 LTS, Debian 12 / 13
Softwareanforderungen
- Docker 24.0.6 oder neuer
- Docker Compose v2 (in modernen Docker-Installationen enthalten)
Überprüfen Sie Ihre Docker-Version:
docker --version
Erwartete Ausgabe: Docker version 24.0.6, build ed223bc
Überprüfen Sie die Docker Compose-Version:
docker compose version
Erwartete Ausgabe: Docker Compose version v5.1.0
Wenn Docker nicht installiert ist, installieren Sie es in Schritt 1.
Hardwareanforderungen
- Mindestens 2 GB RAM
- Mindestens 10 GB freier Speicherplatz
Netzwerkanforderungen
- Port 3306 verfügbar (Standard-MySQL/MariaDB-Port)
- Firewall so konfiguriert, dass der Zugriff nur bei Bedarf externer Verbindungen erlaubt ist
Berechtigungen
- Ein Nicht-Root-Benutzer mit
sudo-Rechten - Benutzer zur
docker-Gruppe hinzugefügt (empfohlen)
Vorausgesetztes Wissen
- Grundlegende Docker-Konzepte (Images, Container, Volumes)
- Vertrautheit mit Befehlszeilenoperationen
Schritt 1: Docker installieren und überprüfen
Wenn Docker nicht installiert ist, installieren Sie es:
sudo apt update && sudo apt upgrade -y && sudo apt install curl
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
sudo apt install docker-ce docker-compose-plugin -y
Docker aktivieren und starten:
sudo systemctl enable docker
sudo systemctl start docker
Überprüfen Sie, ob Docker läuft:
sudo systemctl status docker
Erwartetes Ergebnis: Docker-Dienststatus zeigt aktiv (läuft).
Fügen Sie Ihren Benutzer zur Docker-Gruppe hinzu, um die Verwendung von sudo bei der Nutzung von Docker zu vermeiden:
sudo usermod -aG docker <YOUR_USERNAME>
newgrp docker
Schritt 2: Erstellen eines persistenten Datenverzeichnisses
Ein Bind-Mount ordnet ein Verzeichnis des Hostsystems direkt einem Container zu und macht es im Dateisystem des Containers zugänglich.
Erstellen Sie ein Verzeichnis für Datenbankdaten und setzen Sie die richtigen Berechtigungen:
mkdir -p ~/mysql-docker/data
chmod 750 ~/mysql-docker/data
Dieses Verzeichnis speichert Datenbankdateien außerhalb des Containers.
Ohne persistenten Speicher gehen alle Datenbankdaten verloren, wenn der Container entfernt wird.
Schritt 3: Erstellen einer Docker Compose-Konfiguration
Wechseln Sie in Ihr Projektverzeichnis:
cd ~/mysql-docker
Erstellen Sie eine docker-compose.yml-Datei:
nano docker-compose.yml
Fügen Sie die folgende Konfiguration hinzu (MySQL-Beispiel):
services: mysql: image: mysql:8.0.36 container_name: mysql-server restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
MariaDB-Alternative — wenn Sie MariaDB bevorzugen, verwenden Sie:
services: mariadb: image: mariadb:11.3 container_name: mariadb-server restart: unless-stopped environment: MARIADB_ROOT_PASSWORD: <YOUR_STRONG_ROOT_PASSWORD> MARIADB_DATABASE: appdb MARIADB_USER: appuser MARIADB_PASSWORD: <YOUR_STRONG_USER_PASSWORD> ports: - "3306:3306" volumes: - ./data:/var/lib/mysql
Wichtig: Niemals echte Passwörter in der Versionskontrolle fest codieren. Verwenden Sie Umgebungsvariablen oder eine .env-Datei in der Produktion. Ersetzen Sie <YOUR_STRONG_USER_PASSWORD> und <YOUR_STRONG_ROOT_PASSWORD> durch Ihre sicheren Passwörter.
Schritt 4: Starten des Datenbankcontainers
Führen Sie aus:
docker compose up -d
Erwartete Ausgabe:
- Docker lädt das Image herunter (falls noch nicht heruntergeladen)
- Container startet im Hintergrundmodus
Überprüfen Sie den Containerstatus:
docker ps
Erwartete Ausgabe:
CONTAINER ID IMAGE STATUS PORTS abc123def456 mysql:8.0.36 Up 10 seconds 0.0.0.0:3306->3306/tcp
Schritt 5: Überprüfen der Datenbankfunktionalität
Verbindung zum Container herstellen
Für MySQL-Container ausführen:
docker exec -it mysql-server mysql -u root -p
Für MariaDB-Container ausführen:
docker exec -it mariadb-server mysql -u root -p
Geben Sie Ihr Root-Passwort ein.
Erwartetes Ergebnis: MySQL-Shell-Eingabeaufforderung erscheint: mysql>
Datenbanken überprüfen
SHOW DATABASES;
Sie sollten sehen:
- appdb
- information_schema
- mysql
- performance_schema
- sys
EXIT;
Datenpersistenz testen
Erstellen Sie eine Testtabelle
docker exec -it mysql-server mysql -u root -p
Geben Sie in der MySQL-Shell die folgenden Befehle ein:
USE appdb;
CREATE TABLE test_table (id INT PRIMARY KEY);
EXIT;
Stoppen und entfernen Sie den Container
docker compose down
Starten Sie den Container neu
docker compose up -d
Überprüfen Sie, ob die Tabelle noch existiert
docker exec -it mysql-server mysql -u root -p
Geben Sie in der MySQL-Shell die folgenden Befehle ein:
USE appdb;
SHOW TABLES;
Erwartetes Ergebnis: test_table erscheint. Dies bestätigt, dass der persistente Speicher funktioniert.
Schritt 6: Sicherung der Bereitstellung
Externe Zugriffe einschränken
Wenn der Datenbankzugriff nur intern benötigt wird, ändern Sie die Ports in docker-compose.yml:
ports: - "127.0.0.1:3306:3306"
Neustart:
docker compose down
docker compose up -d
Wichtig: Vermeiden Sie es, den Port 3306 öffentlich zugänglich zu machen, es sei denn, es ist unbedingt erforderlich.
Verwenden Sie eine .env-Datei
Erstellen Sie .env:
nano .env
Beispiel:
MYSQL_ROOT_PASSWORD=<YOUR_STRONG_ROOT_PASSWORD> MYSQL_PASSWORD=<YOUR_STRONG_USER_PASSWORD>
Referenz in docker-compose.yml:
environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Verifizierung
Sie können bestätigen, dass alles korrekt funktioniert, indem Sie:
docker psausführen — Container ist Up- Verbindung über MySQL-CLI — Anmeldung erfolgreich
- Container neu starten — Daten bleiben erhalten
- Protokolle überprüfen:
docker logs mysql-server
Erwartete Protokolleinträge: "ready for connections".
Änderungen rückgängig machen
Um den Container zu stoppen und zu entfernen:
docker compose down
Um persistente Daten zu entfernen:
Wichtig: Dadurch werden alle Datenbankdaten dauerhaft gelöscht.
rm -rf ~/mysql-docker/data
Um Docker zu deinstallieren:
sudo apt remove docker-ce docker-compose-plugin -y
Fehlerbehebung
Container startet nicht
Protokolle überprüfen:
docker logs mysql-server
Häufige Ursachen:
- Schwaches Passwort abgelehnt
- Port 3306 bereits in Verwendung
Portnutzung überprüfen:
sudo ss -tulnp | grep 3306
Berechtigungsfehler
Wenn Sie Berechtigungsfehler sehen:
sudo chown -R 999:999 ~/mysql-docker/data
999 ist häufig die MySQL-Container-Benutzer-ID.
Fazit & Nächste Schritte
Sie haben erfolgreich MySQL oder MariaDB in Docker mit persistentem Speicher bereitgestellt. Die Datenbank läuft nun in einem isolierten Container, während die Daten sicher auf dem Hostsystem gespeichert werden.
Nächste Schritte:
- Automatisierte Backups konfigurieren
- Replikation für hohe Verfügbarkeit implementieren
- Integration mit Anwendungscontainern
- Überwachung mit Prometheus und Grafana hinzufügen