cs.Tutorial();

MariaDB im Docker Container bereitstellen

  • MariaDB
  • Docker
  • Spring Boot

In diesem Post zeige ich am Beispiel einer MariaDB, wie eine Datenbank mit wenig Aufwand in einem Docker Container installiert und für die Nutzung in einer Spring-Boot Applikation bereitgestellt werden kann.

Docker installieren

Als erstes muss sichergestellt werden, dass auf dem aktuellen System eine Dockerinstallation vorhanden ist. Sofern man sich nicht auf einem Linux-System bewegt, muss Docker über eine Installationsdatei, die für Windows oder Mac OS von www.docker.com bezogen werden kann, installiert werden. Ob eine Installation vorhanden ist und in welcher Version sie vorliegt, kann über den Kommandozeilenbefehl docker --version herausgefunden werden.

> docker --version
Docker version 19.03.8, build afacb8b

Starten einer neuen MariaDB Instanz

Mit dem Befehl docker run können neue Docker Container aus einem Image erzeugt und gestartet werden. So kann z.B. das Image mariadb genutzt werden, um eine neue MariaDB Instanz zu initialisieren und sie in einem Docker Container laufen zu lassen.

> docker run --name codesnacks-db -e MYSQL_ROOT_PASSWORD=geheim -d mariadb:10.2

Das mariadb Image wird dabei automatisch von Docker Hub heruntergeladen, wenn es nicht bereits auf dem lokalen Rechner verfügbar ist. Über den Parameter -e können Umgebungsvariablen des Containers gesetzt werden. So kann z.B. das Passwort für den Root-User über die Umgebungsvariable MYSQL_ROOT_PASSWORD angeben werden.

Auf die Datenbank zugreifen

Sollte man auf den im Docker Container laufenden MariaDB-Server zugreifen wollen, so kann dies mit den folgenden zwei Befehlen bewerkstelligt werden. Der Erste öffnet eine Bash innerhalb des Containers:

> docker exec -it codesnacks-db bash

Der zweite Befehl sorgt dafür, dass man sich mit der MariaDB als Root-User verbindet. Anschließend kann z.B. ein SQL-Statement abgefeuert werden um ein neues Schema anzulegen.

> mysql -uroot -p
# passwort eingeben

Docker Compose

Noch einfacher ist die Verwendung einer docker-compose.yml, in der sowohl die Angaben zum Image und dem für die Daten benötigten Volume, als auch der Datenbank-spezifischen Umgebungsvariablen festgelegt werden können. In dieser Datei wird eine MariaDB als Service deklariert, der über entsprechende Befehle gestartet und wieder beendet werden kann. Docker Compose ist sehr mächtig und eignet sich vor allem für den Einsatz mehrererer Services, die gleichzeitig bzw. in einer bestimmten Reihenfolge hochgefahren werden müssen. Diese Services sind in ihren eigenen Docker Containern gekapselt und kommunizieren nur über exponierte Ports miteinander.

Auch wenn es sich bei diesem Beispiel nur um einen einzigen Service handelt und der Einsatz von Docker-Compose auf den ersten Blick als übertrieben erscheinen mag, so überzeugt meiner Ansicht nach dennoch die Lesbarkeit einer YML-Datei und die Anwendung des Patterns "Write Once, Use Often". Die docker-compose-Datei für das obige Beispiel könnte wie folgt definiert werden:

version: '3.4'
services:
codesnacks_db:
image: mariadb:10.2
environment:
MYSQL_ROOT_PASSWORD: geheim
MYSQL_DATABASE: codesnacks
MYSQL_USER: codesnacks
MYSQL_PASSWORD: geheim
restart: always
ports:
- '3306:3306'
expose:
- '3306'
volumes:
- codesnacks_db:/var/lib/mysql
volumes:
codesnacks_db: { }

Die docker-compose.yml wird im Hauptverzeichnis des Projekts abgelegt und kann über die Befehle docker-compose up und docker-compose stop gestartet und wieder beendet werden. Führt man also die oben definierte docker-compose.yml mit docker-compose up aus, dann wird das MariaDB-Image in der Version 10.2 heruntergeladen, daraus ein Docker Container erzeugt und gestartet. Anschließend kann auf die Datenbank, wie zuvor beschrieben, zugegriffen werden.

Konfiguration in Spring-Boot

Auf eine MariaDB oder auch eine andere MySQL-Implementierung kann in Java über den MySQL Java Connector zugegriffen werden. Die URL für die in der docker-compose definierten Datenbank lautet jdbc:mysql://localhost:3306/codesnacks. Die Datenbank kann also in einer Spring-Boot-Anwendung über die folgenden Angaben in der application.yml zugegriffen werden:

spring:
datasource:
url: jdbc:mysql://localhost:3306/codesnacks
username: codesnacks
password: geheim
driverClassName: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MariaDBDialect

Mit dieser Konfiguration baut eine Spring-Boot Applikation beim Starten eine Verbindung zu der im Docker Container liegenden Datenbank auf und legt ggf. ein über JPA oder entsprechende Migrationsskripte definiertes Schema in der Datenbank an.

Auf Github habe ich als Beispiel ein kleines Spring Boot Projekt angelegt, das beim Starten die Verbindung zu der im docker-compose definierten Datenbank aufbaut. Die docker-compose.yml ist im Hauptverzeichnis des Projekts abgelegt. Sie enthält die oben beschriebene Konfiguration und muss vor dem Start der Anwendung über docker-compose up ausgeführt werden.

Zur Blog-Post Übersicht