Kiedyś
Jako developer często tworzę różnego rodzaju bazy danych na platformie SQL Server. Są one wykorzystywane w różnego rodzaju aplikacjach. Już jakiś czas temu odszedłem od instalowania SQL Servera lokalnie i wykorzystywałem do tego maszyny wirtualne. Ostatnio również zacząłem wykorzystywać chmurę publiczną do hostowania tworzonych przeze mnie baz danych.
Jednakże żadne z podanych wyżej rozwiązań nie jest wygodne bo niesie ze sobą spory narzut czasowy. O ile wygodniej byłoby móc postawić SQL Server za pomocą kilku linijek skryptu w niecałe kilka minut nie wykorzystując przy tym zbyt wielu zasobów? W tym wpisie pokażę, że jest to możliwe.
Obecnie
Z pomocą przychodzi tutaj Docker i jego możliwość hostowania kontenerów lokalnie za pomocą Docker dla Windows. Wiedza o Docker nie jest tutaj konieczna, ale zachęcam tych, którzy jeszcze nie zetknęli się z tą technologią do zapoznania się. Poza wykorzystaniem go do “stawiania” instancji SQL Server w mniej niż 10 sekund, można za jego pomocą hostować też aplikacje .NET na linuksie.
Wymagania dla Docker dla Windows:
- Microsoft Hyper-V – instalator włącza tą opcję automatycznie podczas instalacji o ile nie jest włączona.
- Wirtualizacja musi musi być włączona w BIOS i wspierana przez komputer na którym instalujemy środowisko. Jeśli sprzęt wspiera wirtualizację to będzie ona najprawdopodobniej domyślnie włączona.
- Aktualna wersja Docker dla Windows działa na wersjach Windows 10 64bit Pro, Enterprise i Education (build 14393 lub starsze).
Instalacja Docker dla Windows zawiera: Docker Engine, Docker CLI Client, Docker Compose, Docker Machine i Kitematic.
Konfiguracja na “gołym środowisku” powinna przebiegać w następujących krokach:
- Pobranie Docker dla Windows download.docker.com.
- Instalacja Docker dla Windows.
- Pobranie kontenera SQL Server 2017 dla Linux
- Uruchomienie kontenera
Instalacja Docker dla Windows
- Podwójne kliknięcie w Docker for Windows Installer.exe w celu uruchomienia instalatora.
- Postępujemy zgodnie z wytycznymi kreatora instalacji w celu akceptacji licencji, autoryzacji instalacji (wymagane uprawnienia do instalacji) i kontynuacji instalacji.
- Klikamy przycisk “Finish” w oknie dialogowym kończącym instalację w celu uruchomienia Docker. Jeśli nie wystartuje automatycznie to klikamy Windows Start i wpisujemy “docker” i uruchamiamy aplikację Docker for Windows.
Docker – wyszukiwanie aplikacji Jeśli w pasku stanu pojawi się ikonka wieloryba to znaczy że Docker wystartował i działa i jest dostępny z każdego okna terminala.
Docker w pasku stanu Windows - Zalecam jeszcze drobną zmianę konfiguracji – zwiększenie zasobów dostępnych dla Docker. O ile dobrze pamiętam domyślnie limit CPU i pamięci dla Docker jest ustawiony na 1 CPU i 1024 Mb Memory. Ja to zwiększyłem do 2 CPU i 2048Mb Memory. Oczywiście musimy dysponować odpowiednimi zasobami – Docker dla Windows nie wystartuje jeśli ilość dostępnej pamięci będzie za mała. U mnie to wygląda tak:
Docker – ustawienia zaawansowane
Uwaga! Docker może działać w dwóch konfiguracjach przeznaczonych odpowiednio dla kontenerów Linux i Windows. W zależności od tego jakie kontenery chcemy wykorzystywać to tak musimy ustawić nasz Docker dla Windows. Domyślnie ustawiona jest konfiguracja dla kontenerów Linux. Żeby zmienić typ wykorzystywanych kontenerów na Windows należy w menu Docker wybrać opcję “Switch to Windows containers…”. Menu Docker otwiera się poprzez kliknięcie prawym przyciskiem na ikonkę wieloryba w pasku stanu.

Pobranie i uruchomienie kontenera
Jak wspomniałem wyżej po instalacji Docker dla Windows jest on dostępny z każdego okna terminala. Ja korzystam z terminala wbudowanego w Visual Studio Code, ale można użyć dowolnego np. PowerShell albo Bash. Do prezentacji działania tego mechanizmu wykorzystam kontener z obrazu mssql-server-linux:2017-latest. Kod skryptów prezentuję zgodnie ze składnią PowerShell-a. Różnica w stosunku do bash-a jest taka, że przed każdym skryptem trzeba użyć słowa kluczowego sudo.
Pobieranie obrazu kontenera SQL Server 2017 Linux z Docker Hub
docker pull microsoft/mssql-server-linux:2017-latest
Pobieranie nie powinno zająć dużo czasu ponieważ obraz zajmuje niespełna 500Mb.
Uruchomienie kontenera docker z pobranego obrazu
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Strong!Passw0rd" `
-p 1433:1433 --name sql1 `
-d microsoft/mssql-server-linux:2017-latest
W celu sprawdzenia czy nasz kontener wystartował możemy wykorzystać komendę docker ps -a. Wyświetla ona wszystkie kontenery podłączone do naszego lokalnego środowiska. W celu sprawdzenia jakie kontenery działają wystarczy komenda docker ps
docker ps -a
Dodatkowe komendy Docker które mogą się przydać:
Zmiana hasła sa (sysadmin):
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd `
-S localhost -U SA -P "Strong!Passw0rd" `
-Q "ALTER LOGIN SA WITH PASSWORD='NewStrong!Passw0rd'"
Usunięcie kontenera:
docker kill sql1
docker rm sql1
Uruchomienie kontenera:
docker start <CONTAINER ID>
gdzie CONTAINER ID to identyfikator kontenera – można go sprawdzić za pomocą komendy docker ps -a
Przykładowe wykorzystanie
Utworzymy dwa kontenery o nazwach sql1 i sql2. Wywołanie skryptów przedstawiłem na poniższym zrzucie:
Można się teraz połączyć z tymi serwerami przykładowo za pomocą SQL Server Management Studio. Nazwy serwerów to odpowiednio localhost,14331 oraz localhost,14332. Nazwa użytkownika to sa a hasło jest takie jakie zostało podane podczas uruchamiania kontenera. Wynik podłączenia przedstawiłem na poniższym zrzucie:

Podsumowanie
Jak przedstawiłem powyżej tworzenie instancji SQL Server jest bardzo proste i przede wszystkim szybkie. Nie licząc czasu na instalację Docker dla Windows oraz pobranie obrazu kontenera przygotowanie silnika bazy danych zajmie nie więcej niż 10 sekund. Ponadto możemy sobie takich instancji “postawić” kilka w zależności od potrzeb.