So deployen Sie MySQL/MariaDB in Docker mit persistentem Datenspeicher. | INTROSERV
EUR
european

EUR

usa

USD

German De
Ex. VAT Ex. VAT 0%

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

Tip

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.

Info

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

Info

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

Info

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 ps ausfü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:

Info

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

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA