SQL Server draaien op Docker deel 1 De basis

Door: Taco Zoetemelk 23-12-2019

Categorieën
:
BLOG, Cloud, DBMS, MS SQL Server, Technisch,

Geïnspireerd door mijn collega Craig en zijn blogs over het draaien van PostgreSQL in Docker, was ik benieuwd of dit ook zou kunnen met een SQL Server database. Het korte antwoord? Dat is gelukt. Het lange antwoord? Daarvoor moet je even verder lezen.

SQL Server op Linux

Sinds de release candidate (RC) van SQL Server 2017 uitkwam, bleek dat Microsoft met zijn databaseplatform niet alleen het Windows-besturingssysteem ondersteunde, maar ook Linux en Docker-containers. Microsoft is hiermee een nieuwe weg ingeslagen, wat voor mij heel interessant blijkt te zijn. De mogelijkheid om SQL Server op Linux of in een Docker-container te draaien, brengt allerlei interessante mogelijkheden met zich mee. In deze blog zoom ik in op het draaien van SQL Server in een Docker-container.

Docker

Microsoft heeft het zeer makkelijk gemaakt om zelf te beginnen met het draaien van SQL Server in Docker. Er zijn een aantal officiële images beschikbaar gesteld op de Docker Hub (Microsoft op Docker Hub). Het enige wat je hoeft te doen is een container starten en verwijzen naar een image van Microsoft en je hebt een SQL Server draaiende.

Hoe draai je SQL Server in Docker?

Voor het daadwerkelijk draaien van SQL Server op een Docker-image, zijn de volgende zaken nodig:

Start

Om een nieuw Docker-image te starten met daarop Microsoft SQL Server, gebruik je het volgende commando:

docker run --name some-mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=VeryStrongPassword@2019' -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

Wanneer Docker helemaal klaar is met het binnenhalen van de image, wordt deze gestart en wordt er een id teruggegeven van de image. Omdat ik als naam ‘some-mssql’ heb opgegeven, is de image zowel via dit id als via de naam te beheren en benaderen.

Het werkt! Of toch niet?

Ik dacht dat ik hiermee een draaiende SQL Server-instantie had in een container omdat docker geen foutmeldingen gaf, maar dat bleek niet het geval. Het commando docker ps geeft geen draaiende containers:

docker ps

Als ik met docker ps -a kijk, geeft dit commando aan dat mijn container de status "exited" heeft.

docker ps -a

Gelukkig is er wel de mogelijkheid om de logs van een container te bekijken:

docker logs some-mssql

Hierin staat duidelijk dat de betreffende container te weinig geheugen heeft om SQL Server te kunnen draaien.
Dus ik heb mijn default docker machine voorzien van wat extra geheugen (van 1024MB naar 4096MB).
Let erop dat je elke keer dat je "schoon" begint met docker, tegen dit probleem aan kan lopen!

Nadat ik de docker machine voorzien had van extra geheugen en de some-mssql container gestart had, zag alles er een stuk beter uit:

En de logs:

Connectie maken

Er zijn meerdere manieren om verbinding te maken met de SQL Server instance in deze container.

Rechtstreeks op de container

Je kan gebruik maken van de bash shell in de container, om rechtstreeks in te loggen op de container:

docker exec -it some-mssql bash

Je kan hiermee navigeren binnen de linux container en van daar uit sqlcmd starten

SQLCMD vanaf prompt

Ook is het mogelijk om direct sqlcmd te starten vanaf je eigen prompt in de container:

docker exec -it some-mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P VeryStrongPassword@2019

Queries vanaf de prompt

Of je kan direct een query afvuren, zonder dat je deze handmatig invoert in sqlcmd, rechtstreeks van de commandline waar je docker commando's aanroept:

docker exec -it some-mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P VeryStrongPassword@2019 -Q "select @@version"

Remote Verbinding

Zoals nu de container gestart is, is het nog niet mogelijk om de container te benaderen met tools als SQL Server Management Studio. Om dit voor elkaar te krijgen, zal er een port open gezet moeten worden naar de container waarin SQL Server draait.
De default port 1433 kan gebruikt worden om verbinding te leggen met de SQL Server instance in de container. Wel moet daarvoor de container anders gestart worden:

docker run --name some-mssql -p 1433:1433 -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=VeryStrongPassword@2019' -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

Met de toevoeging van -p wordt de port 1433 van buiten de container bereikbaar en kan je met bijvoorbeeld een tool als SSMS verbinding maken met de SQL Server instance in de container. Let erop dat je voor de hostname het ip adres gebruikt van docker (deze is te zien wanneer je de docker console opstart). de forwarding port kan je zelf kiezen, deze wordt vanaf je docker machine doorgezet naar de container. Wanneer je meerdere SQL Server containers gaat draaien, is het verstandig om voor elke een andere forwarding port te kiezen, zodat er geen conflicten optreden bij porten die al in gebruik zijn.

Gebruik dit ip adres in management studio en geef de port op welke gekozen is als forwarding port:

Vanaf dat moment kan je de server administreren middels SSMS zoals je gewent bent.

Containers + blijvende storage

Het voordeel en nadeel van containers is dat ze vluchtig zijn. Wanneer er een stuk gaat, start je gewoon een nieuwe op en je bent weer up en running. Voor databases is het juist erg belangrijk dat data bewaard blijft, zelf als een container stuk zou gaan. Binnen docker wordt dit geregeld door het gebruik van persistent storage volumes.
Om een volume aan te maken gebruik je het commando:

docker volume create vol-some-mssql-01

Dit volume kan nu gebruikt worden om de data van je SQL Server instance op te slaan. SQL Server in docker gebruikt de locatie /var/opt/mssql voor de opslag van database bestanden, logs en andere zaken welke bewaard moeten blijven. Wanneer ik een container start en daarbij een persistent volume wil gebruiken, moet ik deze mounten op de locatie van deze map, zodat SQL Server vanaf dat moment al zijn belangrijke data op het (buiten de container aanwezige) volume wegschrijft in plaats van op de lokale disk:

docker run --name some-mssql -p 1433:1433 -v vol-some-mssql-01:/var/opt/mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=VeryStrongPassword@2019' -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

middels sqlcmd maak ik een database aan en daarin creer ik een tabel.

docker exec -it some-mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P VeryStrongPassword@2019 -Q "CREATE DATABASE DockerTest"

docker exec -it some-mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P VeryStrongPassword@2019 -d DockerTest -Q "CREATE TABLE DockerTestTable (id int, name nvarchar(50))"

Als we dan de container weggooien en een nieuwe opstarten, maar wel blijven verwijzen naar het eerder gemaakte volume:

docker rm some-mssql --force

docker run --name some-mssql -p 1433:1433 -v vol-some-mssql-01:/var/opt/mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=VeryStrongPassword@2019' -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu

Dan zal je zien dat de database en de gemaakte tabel blijft bestaan!

…dan zul je zien dat de database en de gemaakte tabel blijft bestaan!

In deel twee van deze blog zal ik inzoomen op de backup- en restorefunctie.

Leestips

Blog deel 1 Postgres on Docker
https://www.optimadata.nl/blogs/1/7yg3ux-how-to-postgres-on-docker-deel-1-van-3

Blog deel 2 Postgres on Docker
https://www.optimadata.nl/blogs/1/mintzk-how-to-postgres-on-docker-deel-2-van-3

Blog deel 3 Postgres on Docker
https://www.optimadata.nl/blogs/1/lpwv06-how-to-run-postgres-on-docker-deel-3

Terug naar blogoverzicht