MySQL Server mit Docker
Marvin Preuss /// d794cd8 /// docker mysql
Es ist schon ein Jahr her das ich mir mal Docker angeschaut habe. Bis dato war meine einzige Erfahrung mit “Virtualisierung” VMware im Desktopeinsatz und Virtualbox wenn ich mal eine Windows-Umgebung unter Linux brauche. Nun gibt es diesen Hype um Docker. Vereinfacht gesagt geht es darum einzellne Anwendungen in seperaten Linux-Container laufen zu lassen. Zum Beispiel kann man als Entwickler seine schöne Webapp komplett zusammen kleben, den Container exportieren und dem Admin zum ausrollen geben. Desweitern ist es auch möglich mehrere Container zusammen zu kleben. Zum Beispiel wenn die App in ihrem eignen Container noch eine Datenbank braucht.
Ich wollte es mal ausprobieren. Und zwar einen einfachen MySQL-Server in einem Docker Container laufen lassen. Problem ist nur: Hat man sein Container fertig und darin entstehen Veränderungen, zum Beispiel in dem Sachen in die Datenbank geschrieben werden, müssten diese Änderungen explizit wieder “committed” werden um sie auch nach einem Neustart zu erhalten. Nun gibt es einen anderen Ansatz für dieses Problem. Es gibt unter Docker Volumes. Diese wollen genau das umgehen. Man definiert Verzeichnisse im Docker-Container die erhalten bleiben sollen. Funktioniert auch ganz fein nur sollte man diese Volumes in einem seperaten Container anlegen und den MySQL-Container anweisen die Volumes aus dem DATA-Container zu benutzen. Dies spielt der Modularität Dockers völlig in die Karten. Docker hat mein Gehirn ziemlich zermatscht, aber im Endeffekt hat es geklappt.
Erstmal habe ich Daten-Container mit dem Namen mysql-data
angelegt:
docker run --name mysql-data -v /var/lib/mysql -v /var/log/mysql 32bit/ubuntu:14.04 true
Der macht nicht viel. Er definiert die Verzeichnisse /var/lib/mysql
und /var/log/mysql
als Volumes, startet ein ubuntu Image und führ den Befehl true
aus. Mit docker ps -a
kann man sich alle Container anschauen:
706e6f2ddc21 32bit/ubuntu:14.04 "true" 10 days ago Exited (0) 10 days ago mysql-data
Dieser muss garnicht laufen. Er definiert quasi nur die Volumes für uns. Nun habe ich mich an den MySQL-Container gemacht. Dafür habe ich von einem Ubuntu-Image eine Bash-Shell gestartet. Wichtig dabei die Angabe die volumes
von unserem Container mit dem Namen mysql-data
zu verwenden. Das -p 3306:3306
sagt das er den Port des MySQL-Servers auf den lokalen Port 3306
auf dem Host-Computer durchleiten soll.
docker run -t -i --name mysql-server --volumes-from mysql-data -p 3306:3306 32bit/ubuntu:14.04 /bin/bash
In der Bash-Shell installieren wir nun den MySQL-Server und alles wird eingerichtet. Ist dies fertig, detached man den Container mit dem Tasterturkürzel CTRL-p CTRL-q
. Der Container sollte nun trotzdem weiterlaufen. Dies kann man sich mit docker ps
anschauen. Um alle Änderungen zu speichern committed man die Änderungen mit:
docker commit 72 mysql-server
Die 72
ist der Anfang des Hashes mit dem unser Container identifiziert wird. Nun haben wir ein Image mit dem Namen mysql-server
. Wir starten nun alles komplett mit folgendem Befehl:
docker run -d --name mysql-server --volumes-from mysql-data -p 3306:3306 mysql-server /usr/bin/mysqld_safe
Dies startet den Container im Daemon-Mode mit dem Namen mysql-server
, den Namen für den Container und nicht für das Image, mit dem Volumes von unserem Data-Container mit dem Namen mysql-data
, den Port 3306
gemappt auf 3306
am Host, und von dem Image mysql-server
. Es wird der Befehl /usr/bin/mysqld_safe
gestartet. Läuft alles können wir später den Container starten mit dem Befehl
docker start mysql-server
Das wars eigentlich. Nun sollte man normal connecten können.
mysql -uroot -p -h127.0.0.1
Ich hoffe ich habe alles zusammen bekommen. War ein ganz schöner Ritt und sehr Braintwisting am Anfang für mich.