Inhalt

Linux SQL Server 2017 auf Docker mit der Stack Overflow Demo Datenbank

Durch die Veröffentlichung von SQL Server für die Linux Plattform hat Microsoft auch gleich Docker Images für den SQL Server veröffentlicht. Diese gibt es in zwei Geschmacksrichtungen: Linux oder Windows So wird es für Entwickler noch einfacher neue SQL Server Versionen zu testen. Wie einfach das ist und wie man eine Beispieldatenbank in diesem Container nutzt zeigt dieser Beitrag.

Voraussetzungen

Um Docker auf einer Windows betreiben zu können muss Hyper-V auf der Maschine laufen. Das bedeutet, dass nur Windows 10 in der Professional, Enterprise oder Education Edition unterstützt wird! Außerdem muss der SQL Server später mindestens 2 GB Arbeitsspeicher erhalten, also sollte man es nicht auf dem alten Notebook mit 1024 MB ausprobieren.

Hyper-V

Der folgende PowerShell Befehl aktiviert das Hyper-V Feature inklusive aller Managementkomponenten. Diese werden für Docker nicht zwingend benötigt, sind aber für einen Blick hinter die Kulissen interessant.

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

Docker Community Edition

Die “Docker Community Edition for Windows” ist kostenfrei auf der Homepage des Docker Projektes zu beziehen. Die Installation ist selbsterklärend. Bei der Abfrage welcher Typ Container ausgeführt werden soll, muss Linux ausgewählt werden.

/linux-sql-server-2017-auf-docker-mit-der-stack-overflow-demo-datenbank/images/Installing-Docker-for-Windows.png

Docker auf Hyper-V

Bevor wir nun mit dem SQL Server starten noch ein kurzer Ausflug wie Docker auf Windows funktioniert. Mit dem Start von Docker wird eine virtuelle Maschine im Hintergrund gestartet in deren Kontext alle weiteren Docker Container laufen. Diese hat im Standard 2 GB RAM zugewiesen. Exakt das Minimum für unseren SQL Server.

/linux-sql-server-2017-auf-docker-mit-der-stack-overflow-demo-datenbank/images/DockerVMRunningOnHyperV.png

Stack Overflow Demo Datenbank

Stack Overflow veröffentlicht in regelmäßigen Abständen die Rohdaten hinter dem Projekt. Brent Ozar hat sich die Mühe gemacht und den Datenschatz in eine MSSQL Daten zu konvertieren.

Für unser Beispiel benötigen wir den 1 GB Datensatz.

/linux-sql-server-2017-auf-docker-mit-der-stack-overflow-demo-datenbank/images/2018-04-05-12_24_05-Updated-and-Smaller-Stack-Overflow-Demo-Databases-Brent-Ozar-Unlimited%C2%AE.png

Die runtergeladenen Datei muss mit 7zip entpackt werden. Anschließend eine PowerShell starten und in den entsprechenden Ordner wechseln. In dieser PowerShell Sitzung können nun alle Kommandos ausgeführt werden.

/linux-sql-server-2017-auf-docker-mit-der-stack-overflow-demo-datenbank/images/StackOverflowFolder.png

SQL Server

Nachdem Docker gestartet ist kann mit dem Kommando “Docker” alles weitere von der Kommandozeile gesteuert werden.

SQL Docker Image

Der SQL Server muss nicht wie auf Windows bekannt installiert werden, sondern es wird einfach die gewünschte Version als Image runtergeladen.

docker pull microsoft/mssql-server-linux:2017-latest

In diesem Container ist alles enthalten um den SQL Server zu betreiben.

Volume

Da wir am Ende nicht nur einen SQL Server betreiben wollen, sondern auch die Stack Overflow Datenbank verwenden möchten, müssen diese Daten irgendwo persistent abgelegt werden.

Das Image selbst ist nicht beschreibbar und wird z.B. bei einem Update einfach gelöscht. Um die Daten also nicht jedes Mal zu verlieren benötigt man einen anderen Speicherort. In unserem Fall ein Docker Volume.

docker volume create vol_mssqllinux

[Update 28.05.2018] Mit dem Bugfix 4212960 hat Microsoft den Fehler behoben, dass der Docker Container beim der Verwendung Volume basierten Mount Points nicht startet. Diese Anleitung verwendet weiterhin ein Volume um die Daten sauber zu kapseln.[/Update]

Image mit Volume starten

Damit dieses Volume auch an der korrekten Stelle im SQL Server eingebunden wird muss dies beim Erstellen des Docker Container mit angegeben werden.

docker run –name “mssqllinux” -v vol_mssqllinux:/var/opt/mssql -e “ACCEPT_EULA=Y” -e “SA_PASSWORD=yourStrong(!)Password” -e “MSSQL_PID=Developer” -p 1433:1433 -d microsoft/mssql-server-linux:2017-latest

Dieser Befehl startet einen Docker Container mit dem Namen “mssqllinux” und bindet das Volume “vol_mssqllinux” im Pfad “/var/opt/mssql” ein. Außerdem wird die EULA akzeptiert, das sa Kennwort “youtStrong(!)Password) vergeben und die SQL Edition “Developer” verwendet. Damit auf den SQL Server zugegriffen werden kann wird der TCP Port 1433 auf dem Host ebenfalls als 1433 veröffentlicht. Sollte also eine zweite SQL Instanz gestartet werden muss ein anderer Port für den Host verwendet werden.

Fertig! Der SQL Server läuft und speichert seine master, model und tempdb in das erstellte Volume!

Datenbank einbinden

Um die Datenbank einzubinden benutzen wir den Docker Kopierbefehl “cp”. Dieser ermöglicht es vom Host Daten in einen Container zu kopieren. Im Beispiel werden alle Dateien aus dem aktuellen Ordner in das Verzeichnis “/var/opt/mssql/data” kopiert. Nach dem Kopieren prüfen wir mit dem Linux Befehl “ls” ob die Datenbankdateien auch korrekt kopiert wurden.

docker cp . mssqllinux:/var/opt/mssql/data docker exec mssqllinux ls /var/opt/mssql/data

/linux-sql-server-2017-auf-docker-mit-der-stack-overflow-demo-datenbank/images/CopyFileToDocker.png

Datenbank einbinden und verwenden

Hier kommen wieder altbekannte T-SQL Befehle oder das SSMS zum Einsatz.

USE [master]
GO
CREATE DATABASE [StackOverflow2010] ON 
( FILENAME = N'/var/opt/mssql/data/StackOverflow2010.mdf' ),
( FILENAME = N'/var/opt/mssql/data/StackOverflow2010\_log.ldf' )
 FOR ATTACH
GO

/linux-sql-server-2017-auf-docker-mit-der-stack-overflow-demo-datenbank/images/2018-04-05-13_48_03-SQLQuery2.sql-localhost.master-sa-54-Microsoft-SQL-Server-Management-Stu.png

Alle Änderungen an diesen Daten werden ebenfalls im Volume gespeichert und überleben somit das Update des Docker Containers ohne weiteres.

Fazit

Mit Docker können SQL Entwickler schnell und ohne Installationsaufwand viele Versionen von SQL Server testen Ihre Applikation auf Kompatibilität prüfen. Durch den Einsatz von Volumes bleiben die Daten persistent.