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 --versionDocker 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.2environment:MYSQL_ROOT_PASSWORD: geheimMYSQL_DATABASE: codesnacksMYSQL_USER: codesnacksMYSQL_PASSWORD: geheimrestart: alwaysports:- '3306:3306'expose:- '3306'volumes:- codesnacks_db:/var/lib/mysqlvolumes: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/codesnacksusername: codesnackspassword: geheimdriverClassName: com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto: updateproperties: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.