SQL Server ganz ohne Windows

Vor einem Jahr hätte ich nicht gedacht, dass ich einmal einen Artikel zum Thema „SQL Server ganz ohne Windows“ schreiben würde (und nein, es geht nicht um MySQL sondern schon um den SQL Server von Microsoft), aber offensichtlich ist dieser Tag heute gekommen. In der letzten Woche ist die public preview vom SQL Server auf Linux erschienen und ich möchte in diesem Artikel ein kleines Experiment starten und mal folgende Kombination ausprobieren. Ich möchte den SQL Server auf meinem Mac Book Pro (ist von Anfang 2013, hat 1TB Festplatte und 16 GB RAM) unter Docker laufen lassen. Wenn das soweit klappt hätte ich dann auf jeden Fall schon mal einen SQL Server am Start. Natürlich müssen wir auf den SQL Server auch irgendwie zugreifen können. Hierzu nutze ich Visual Studio Code, was es ja auch auf dem Mac gibt. Für Visual Studio Code gibt es eine SQL-Server Erweiterung (vscode-mssql) die man installieren kann und mit der man sich dann direkt mit dem SQL Server verbinden kann um z.B. Tabellen abzufragen. Wenn das soweit läuft haben wir tatsächlich einen SQL Server ganz ohne Windows gebaut. Interessant bei diesem kleinen Experiment ist, dass ich weder Ahnung von Docker noch von Linux habe und dass auch meine Kenntnisse auf dem MacOSX Betriebssystem eher begrenzt sind. Wird also spannend die Reise.

Nachdem ich die Mac Version von Docker von der Website heruntergeladen habe und das DMG Image gemountet habe muss Docker auf die übliche MacOSX Art per Drag&Drop installiert werden.

01_docker_mac

Das funktioniert sehr gut und innerhalb von ein paar Sekunden ist offenbar Docker auf meinem Mac installiert. Es taucht auch unter den Anwendungen auf und durch einen beherzten Klick auf den freundlichen Wal starte ich Docker was sich erstmal bei mir meldet und weitergehende Systemberechtigungen anfordert.

03_docker_mac

Kein Problem, kleiner Wal, die sollst Du haben. Nachdem ich durch Eingabe meiner Benutzerkennung bestätigt habe dass die Systemberechtigungen vergeben werden sollen bin ich zunächst ein wenig verwirrt. Irgendwie kann ich Docker nirgendwo sehen. Und auch das mehrfache Starten und Klicken auf das Wal Icon bringt mich irgendwie nicht weiter. Schließlich erkenne ich meinen Fehler: Docker läuft ja bereits. Hat sich aber oben in die Menüleiste eingebettet. Dort wird nun ein kleiner Docker Wal mit einem Menü angezeigt.

05_docker_mac

Die nächste Aktion die ich durchführen werde ist die Konfiguration von Docker. Dazu rufe ich die Preferences auf und gebe Docker 4 Prozessor-Kerne und 4 GB Speicher.

06_docker_mac

Es geht mir hier in diesem Artikel ja erstmal nur um eine Testumgebung und darum zu schauen ob das alles überhaupt läuft und wie ich damit arbeiten kann. Nach den Änderungen startet Docker neu. Ich denke ich bin jetzt soweit, dass ich den nächsten Schritt wagen kann und mir mal anschaue wie man auf dieser Umgebung einen SQL Server unter Linux zum Laufen bringt.

Nun geht es in die Vollen und MacOSX zeigt, dass eigentlich ein Linux/Unix unten drunter liegt. Damit ich mir das Linux-Docker-Image vom SQL Server herunterladen kann muss ich ein Terminal starten und dort den Befehl

sudo docker pull microsoft/mssql-server-linux

eingeben.

07_docker_mac

Nachdem ich für diese priviligierte Operation mein Kennwort bereitgestellt habe geht es auch schon los und es wird irgendetwas (wahrscheinlich das MSSQL Docker/Linux Image) von irgendwo (wahrscheinlich Microsoft) heruntergeladen.

08_docker_mac

Bei meiner leider sehr suboptimalen Internetverbindung zu Hause dauert das Herunterladen der knapp 230 MB ziemlich lange. Irgendwann ist das Image dann aber tatsächlich auch heruntergeladen und ich kann weitermachen.

09_docker_mac

Als nächstes muss dieses Image innerhalb von Docker bereitgestellt bzw. gestartet werden. Außerdem wird hier dann auch noch das Kennwort für den Systemadministrator des SQL Servers vergeben. Das funktioniert mit dem folgenden Befehl:

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -d microsoft/mssql-server-linux

Ein Port-Mapping auf den bekannten Port 1433 kann ich auch erkennen. Gut, dann probiere ich das mal auf meiner Umgebung aus.

10_docker_mac

Fast sofort nach dem Eingeben dieses Befehls gibt es die folgende Ausgabe:

11_docker_mac

Also jetzt mal ehrlich: Eine weniger aussagekräftige Meldung habe ich in meiner beruflichen Laufbahn bisher selten gesehen. Was soll mir der Text der da ausgegeben wird sagen? Ist das eine Fehlermeldung? Hat es geklappt? WTF? Wahrscheinlich werden sich jetzt alle Docker-Profis vor Lachen auf dem Boden winden, aber ich kann mit dieser Fehlermeldung momentan überhaupt nichts anfangen.

Nach etwas Recherche im Internet habe ich herausgefunden, dass man über den Befehl

docker -h

eine Hilfeseite bekommt. Mit

docker ps

bekommt man die registrierten Container angezeigt. In meinem Fall sieht die Ausgabe dann so aus:

13_docker_mac

Es scheint also mindestens schon mal so zu sein, dass der Microsoft SQL Server unter Linux in meiner Docker-Umgebung angekommen ist. Über den Befehl

docker stats

kann man sich aktuelle Statusinformationen aus der Docker-Umgebung zurückgeben lassen. Bei mir sieht das dann aktuell so aus.

14_docker_mac

Offenbar scheint dort auch etwas zu laufen. Wenn man die Container-ID mit dem Screenshot oben vergleicht ist das wohl der SQL Server Docker Container. Somit ist der erste Teil der Aufgabe aus meiner Sicht schon einmal abgeschlossen, ich habe hier jetzt auf meinem MacOSX einen Docker Container laufen in dem sich ein Linux befindet auf dem wiederum ein Microsoft SQL Server installiert ist. Insgesamt relativ cool, auch wenn ich momentan von dem SQL Server noch nicht wirklich viel sehen kann, aber das wird hoffentlich noch.

Als nächstes widme ich mich der spannenden Aufgabe eine Verbindung zum SQL Server hinzubekommen. Das Kennwort und den User habe ich mir gemerkt, und oben über den Kommandozeilen-Befehl scheint auch der Port 1433 freigegeben worden zu sein, so dass ich mich mit diesem Port verbinden können müsste. Die spannende Frage ist nun aber – welche IP-Adresse hat der Server oder wie kann ich mich sonst mit diesem Server verbinden?

Um etwas über Docker-Container herauszufinden kann man den Befehl

docker inspect <ContainerID>

nutzen. Oben hatte ich ja schon ermittelt dass die Container ID meines SQL Server Containers f728b4bf2367 ist. Diese gebe ich als ID im Befehl an:

15_docker_mac

Daraufhin bekomme ich eine ganze Menge Informationen als JSon Datei zurückgeliefert:

16_docker_mac

Unter anderem kann man dort die IP-Adresse 172.17.0.2 erkennen. Möglicherweise handelt es sich dabei um die von mir gesuchte IP-Adresse des Docker Containers. Weder ein ping noch ein telnet auf die Adresse haben aber irgendein Ergebnis geliefert. Hier komme ich also erstmal nicht weiter und muss überlegen wie ich auf den SQL Server zugreifen kann. Ich denke ich werden die Strategie mit Visual Studio Code weiterverfolgen. Wenn ich recht überlege habe ich momentan auf meinem MacBook Pro unter MacOSX kein Programm mit dem man sich mit dem SQL Server verbinden kann.

Eine kurze Internet-Recherche später habe ich herausgefunden dass man unter MacOSX als offenbar OpenSSL als Voraussetzung benötigt um sich mit einem SQL Server über Visual Studio Code zu verbinden.

Das ist jetzt meine nächste Option die ich ausprobieren möchte – zunächst die Erweiterung unter Visual Studio Code für den SQL Server installieren um dann damit auf meinen SQL Server im Docker Container zugreifen zu können. Da wir ja OpenSSL benötigen starte ich erstmal damit und installiere das auf meinem Mac. Hierzu öffne ich ein neues Terminal-Fenster und muss dort die folgenden Befehle eingeben.

brew update
brew install openssl
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/

Dummerweise scheint auf meinem Mac Homebrew nicht installiert zu sein (das ist ein Paket-Manager für MacOSX). Daher muss ich das erst mit dem Befehl

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

nachinstallieren. Der Befehl liefert mir die folgende Ausgabe:

17_docker_mac

Positiv ist hier, dass mehr oder weniger genau beschrieben steht was an meinem System durch den Befehl geändert werden soll. Um die Änderungen durchzuführen drücke ich natürlich wie angegeben auf die Return-Taste. Nachdem ich mein Kennwort eingegeben habe wird homebrew installiert und die angegebenen Änderungen werden auf meinem System durchgeführt. Offenbar hat aber alles gut funktioniert, da mir in meinem Terminal Fenster angezeigt wird dass die Installation erfolgreich verlaufen ist.

18_docker_mac

Durch Eingabe von

brew help

teste ich das noch einmal schnell und auch das funktioniert. Brew zeigt die Hilfe in der Kommandozeile an und daher gehe ich davon aus, dass die Installation geklappt hat.

19_docker_mac

Ich habe nun brew auf meinem Mac installiert. Das nächste was ich nun machen möchte ist OpenSSL zu installieren da dieses Paket ja für die Kommunikation von Visual Studio Code mit einem SQL Server benötigt wird. Hierzu gebe ich die oben beschriebenen Befehle ein. Zunächst

brew update

20_docker_mac

brew zeigt mir an, dass alles Up-To-Date ist, was mich allerdings auch nicht wundert, nachdem ich das ja gerade erst installiert habe. Nun kommt der Befehl

brew install OpenSSL

Schon wieder werden Sachen aus dem Internet heruntergeladen und auf meinem Mac installiert.

21_docker_mac

Die Warnung dass Apple OpenSSL zugunsten seiner eigenen Cryptographie-Bibliotheken abgekündigt hat ignoriere ich einfach mal, weil ich für dieses Szenario zwingend OpenSSL benötige. Ich scheine auf jeden Fall auf dem richtigen Weg zu sein, da ein Bierkrug angezeigt wird :-). Das passt aus meiner Sicht soweit – wenn ein Bierkrug angezeigt wird kann das ja nicht schlecht sein. Nun muss ich den Befehl

ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/

eingeben. Keine Fehlermeldung halte ich auf jeden Fall schon mal für ein gutes Zeichen.

22_docker_mac

Der letzte Befehl um die Installation von OpenSSL abzuschließen lautet

ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/

23_docker_mac

Auch hier gabs keine Fehlermeldung. Daher nehme ich mal an dass nun OpenSSL auf meinem Mac installiert ist.

Die nächste Aktion die ich nun durchführen muss ist die mssql-Extension in Visual Studio Code zu installieren. Endlich hat mein Macbook mal eine der Voraussetzungen die man für mein Projekt „SQL Server ohne Windows“ benötigt – ich habe zumindest irgendwann schon mal Visual Studio Code installiert – Top :). Visual Studio Code kann man sich für den Mac übrigens hier herunterladen. Natürlich ist die Version nicht aktuell, daher spiele ich zunächst einmal das Update ein. Nun bin ich soweit, dass ich die mssql-Extension installieren kann. Hierzu klicke ich in der Randleiste das Symbol für die Visual Studio Code Extensions an, gebe dann oben mssql ein und klicke bei den beiden zurückgelieferten Erweiterungen auf die untere, da bei der oberen Erweiterung dabeisteht dass sie abgegkündigt ist.

24_docker_mac

Nun wird die entsprechende Komponente aus dem Internet heruntergeladen und in meinem Visual Studio Code installiert.

25_docker_mac

Nach der Installation starte ich Visual Studio Code neu und greife über die Tastenkombination SHIFT + CMD + P auf den Befehlsmodus von Visual Studio Code zu. Wenn ich in das Befehls-Eingabefeld oben im Editor nun mal die Buchstaben mss eingebe werden mir die Befehl angezeigt die ich gegen einen SQL-Server ausführen kann. Das hat dann offenbar soweit auch schon einmal funktioniert.

26_docker_mac

Um sich in Visual Studio Code mit einem SQL Server verbinden zu können muss man eine SQL-Datei öffnen oder zumindest die Sprache des Editors in SQL umgeschaltet haben. Ich werde den ersten Weg wählen und eine SQL-Datei erstellen die ich einfach mal test.sql nenne. Danach rufe ich in der Befehlszeile von Visual Studio Code den Befehl MS SQL: Connect auf um mich mit dem SQL Server unter Docker zu verbinden.

27_docker_mac

Nun werde ich dazu aufgefordert ein Connection Profile auszuwählen. Da es bisher noch keins gibt wähle ich hier die Option „Create Connection Profile“ aus.

28_docker_mac

Als nächstes werde ich gefragt mit welchem Server ich mich denn verbinden möchte. Da ich bisher mit meiner Frage nach der zu verwendenen IP-Adresse (siehe oben) noch nicht wirklich weitergekommen bin entscheide ich mich hier einfach mal für das Naheliegenste (im wahrsten Sinne des Wortes ;-)) nämlich für „localhost“.

29_docker_mac

Optional kann ich im nächsten Schritt eine Datenbank angeben. Da aber momentan noch keine Datenbanken auf meinem Docker-SQL-Server existieren überspringe ich diesen Schritt. Ich nehme an ich werde dann mit der Standard-Datenbank verbunden die meinem User zugeordnet ist.

30_docker_mac

Als Benutzer nutze ich sa für den ich beim Starten des Docker-Containers ja das Kennwort angegeben habe.

31_docker_mac

Als Kennwort gebe ich das oben gesetzte Kennwort ein.

32_docker_mac

Die Frage ob das Kennwort auch gespeichert werden soll beantworte ich mit „Yes“.

33_docker_mac

Nun kann ich noch einen Namen für das Profil angeben – den spare ich mir an dieser Stelle aber einfach mal.

34_docker_mac

Visual Studio Code zeigt mir nachdem ich den letzten Schritt erfolgreich beendet habe an, dass meine Verbindung erstellt wurde und auch dass diese hergestellt werden konnte. Unten im Fenster wird angezeigt dass ich mit dem Server localhost mit der Datenbank master und mit dem User sa angemeldet bin. Das ist ja schon mal sehr spannend.

35_docker_mac

Um meinen Test abzuschließen möchte ich noch gerne einen Befehl an den SQL Server im Docker Container absetzen. Na und was wäre an dieser Stelle wohl geeigneter als

SELECT @@Version as version

Damit können wir nachweisen, dass der SQL Server tatsächlich unter Linux läuft. Ich gebe den Befehl also in mein Editor-Fenster ein. Was mir sofort sehr positiv auffällt ist, dass es offenbar Intellisense gibt:

37_docker_mac

Nachdem ich den Befehl eingegeben habe, drücke ich dann noch mal die Tastenkombination SHIFT + CMD + P um das Befehlseingabefenster anzuzeigen und wähle dort dann MS SQL: Execute Query aus.

38_docker_mac

Das Ergebnis diese Aktion sieht auf jeden Fall schon einmal sehr gut aus. Rechts ist in Visual Studio Code ein Fenster aufgegangen in dem das Ergebnis meiner Abfrage angezeigt wird. Unten in diesem Fenster kann man als Systemmeldung sehen wie lange es gedauert hat die Abfrage auszuführen.

39_docker_mac

Wenn man nun die Tabelle erweitert sehe ich auch endlich das von mir ersehnte Ergebnis: Dort steht tatsächlich, dass der SQL Server mit dem ich verbunden bin unter Linux läuft.

40_docker_mac

Das Experiment bzw. die Fragestellung mit der ich diesen Artikel begonnen habe kann nun mit einem klaren Ja beantwortet werden: Inzwischen ist es möglich einen Microsoft SQL Server ganz ohne die Verwendung von Windows auf einem Macbook Pro unter MacOSX laufen zu lassen. Hervorragend!

Als Fazit meines Testes bleibt festzuhalten: Obwohl ich nicht wirklich Ahnung von den verwendeten Technologien (Docker, Linux, MacOSX) habe ist es mir gelungen einen SQL Server in einem Docker Container unter MacOSX bereitzustellen und mit Hilfe von Visual Studio Code auf diesen SQL Server zuzugreifen. Natürlich musste ich die ein oder andere Information im Internet nachschlagen und meinen Mac entsprechend präparieren (z.B. kein homebrew installiert, kein OpenSSL). Auch bin ich in die ein oder andere falsche Richtung gerannt (was ist die IP-Adresse?). Insgesamt lässt sich aber festhalten dass ich es ohne viel Know-How in 5 Stunden geschafft habe einen SQL Server ohne Windows zum Laufen zu bringen (der nächste Versuch dauert natürlich jetzt nicht mehr so lange). Dabei habe ich mich die ganze Zeit außerhalb meiner Komfort-Zone bewegt und gleichzeitig noch diesen Artikel geschrieben. Das spricht auf jeden Fall dafür, dass sowohl die Bereitstellung als auch die Dokumentation zum SQL Server unter Linux/Docker recht gelungen sind.

Im folgenden YouTube Video kann man sehen, wie diese Installation unter Mac OS verwendet wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

%d Bloggern gefällt das: