Windows Server: Docker i kontenery na Windows

W jaki sposób zainstalować Docker na Windows Server? Jak pobrać obraz kontenera na Windows? Jak uruchomić kontener na Windows Server? Tego wszystkiego dowiecie się z poniższego wpisu.

Pierwszą rzeczą, którą musimy zrobić, to zainstalować moduł dostawcy Dockera (Docker provider) z galerii PowerShell. Moduł ten zawiera polecenia do instalowania, wykrywania i aktualizowania platformy Docker w systemie Windows. Aby zainstalować Docker providera, uruchommy konsole jako administrator, wydajmy polecenie Install-Module i pobierzmy moduł DoskerMSFTProvider

# Install Docker Provider
Install-Module DockerMSFTProvider -Force

Następnie aby zainstalować samego Dockera, uruchomimy polecenie Install-Package i określimy docker jako nazwę, a także będziemy musieli użyć parametru ProviderName, aby określić wcześniej zainstalowanego dostawcę. Może to potrwać kilka minut, w zależności od środowiska. Po krótkiej chwili i skończonej instalacji będziemy poinformowani o konieczności wykonania restartu naszego komputera.

# Install Docker from provider
Install-Package -Name docker -ProviderName DockerMSFTProvider -Force
# Restart
Restart-Computer

Po restarcie maszyny, weryfikujemy czy pojawiła się usługa Docker w systemie. Użyjemy klasycznego polecenia Get-Service

Get-Service Docker

Jeżeli usługa działa, możemy zacząć używać kontenerów Dockera.

Zacznijmy od sprawdzenia wersji jaką mamy zainstalowaną:

# Check Docker Version
docker version

Mamy zainstalowaną usługę Docker, kolejnym krokiem przed rozpoczęciem przygody z kontenerami jest ich pobranie. Najprostszym sposobem aby uzyskać obraz kontenera jest przeglądanie portalu Docker Hub. Zacznijmy od wyszukania w Docker Hub:

# Search docker for Microsoft images 
docker search microsoft

Obrazów odnośnie wyszukiwanej frazy jest sporo, jest nawet kilka oficjalnych obrazów. My skupimy się jednak na obrazach przygotowanych przez sam Microsoft które są hostowane w ich własnym repozytorium kontenerów Microsoft Container Registry zwanym również Microsoft Artifact Registry.

Po przejściu na stronę i wyszukaniu Windows Server otrzymujemy repozytoria:

W naszym przykładzie chcemy zainstalować obraz kontenera z Windows Server Core, wybieramy więc pierwsze repozytorium i przechodzimy dalej:

Interesuje nas Windows Server Core w wersji Long-Term Servicing Channel przechodzimy na zakładkę Tags i rozwijamy wersje ltsc

Mamy gotową komendę która posłuży nam do pobrania konkretnie tego obrazu kontenera Windows Server Core LTSC 2022. Kopiujemy ją i wracamy do naszego okna PowerShell aby pobrać obraz

# Docker Image Download
docker pull mcr.microsoft.com/windows/servercore:ltsc2022

Po chwili otrzymamy komunikat o udanym pobraniu obrazu kontenera Windows Server Core.

Posiadane przez nas obrazy kontenerów możemy zawsze sprawdzić poleceniem docker images

# Docker downloaded image check
docker images

Mamy pobrany obraz czas go uruchomić! Aby uruchomić kontener, użyjemy polecenia docker run. Następnie musimy określić obraz kontenera, który chcielibyśmy uruchomić. Można to zrobić na kilka różnych sposobów. Najpierw możemy określić nazwę obrazu kontenera wraz z powiązanym tagiem.

# Docker Run 
docker run mcr.microsoft.com/windows/servercore:ltsc2022

W przypadku kontenerów firmy Microsoft jest to oczywiście dużo pisania. Możemy więc również uruchomić kontener, określając identyfikator obrazu. (Uwaga: zamiast określać cały identyfikator, możemy również podać tylko tyle znaków, które są unikalne dla określonego obrazu np pierwsze 3-4 znaki).

lub

Sprawdźmy czy nasz kontener działa:

# Check runing containers
docker ps

Jak widzicie żaden nie jest uruchomiony, sprawdźmy zatem historie:

# Check history of runing containers
docker ps -a

Każda z naszych prób uruchomienia (na rożne sposoby) się powiodła ale kontener przestał działać po chwili.

Dzieje się tak, ponieważ podczas tworzenia obrazu kontenera można określić polecenie do uruchomienia…..po uruchomieniu kontenera. Co nazywa się „punktem wejścia” ale po zakończeniu tego polecenia kontener również się zatrzyma.

Sprawdźmy zawartość „punktu wejścia” / „entry point” używając polecenia docker inspect

# Docker Inspect command to check entry point
docker inspect 903

Nieco wyżej możemy zobaczyć właściwość Cmd, która jest kolejnym sposobem na poinformowanie kontenera, co ma działać po jego uruchomieniu. Obecnie jest ustawiony na uruchamianie cmd.exe.

Dlatego po uruchomieniu obrazu kontenera mogliśmy zobaczyć, jak wiersz polecenia pojawia się na krótko przed zamknięciem kontenera.

Spróbujmy uruchomić kontener w tle używając parametru -d

# Docker Run in background 
docker run -9 903

Uruchomione kontenery otrzymują losową nazwę np:

Nazwę możemy też nadać samodzielnie dodając parametr –name

# Docker Run in background with a specific name
docker run -d --name windowscore 903

Działające kontenery możemy zatrzymać używając polecenia docker stop

# Docker stop container
docker stop 903

uzyskując uprzednio jego ID z polecenia dokcer ps

Historyczną listę możemy również czyścić używając polecenia docker container rm

# Docker remove container form history - check your ID
docker container rm bf3d

lub całą jednorazowo. Uwaga wtedy należy przejść do „czystej” konsoli (nie działa w PowerShell ISE) i wprowadzić: docker container prune

# Docker remove all containers form history
docker container prune

Wiemy jak uruchamiać i zatrzymywać kontenery. Ale jak uruchamiać polecenia w samych kontenerach Dockera? Nic prostszego uruchamiamy nasz kontener i podajemy polecenie jakie ma się wykonać w naszym wypadku hostname:

# Docker Run with a specific name and give command hostname
docker run --name windowscore 903 hostname

Tak jak poprzednio, nasz kontener uruchomił się i wykonał polecenie hostname po czym się zatrzymał (ponieważ nie ma zdefiniowanego punktu Entry level).

Spróbujmy uruchomić nasz kontener interaktywnie, po to aby uruchomić w nim PowerShell, UWAGA: tutaj też polecenie wydamy z poziomu samej konsoli – nie dziala w PowerShell ISE:

docker run -it --name windowscore 903 PowerShell

Uruchomi się nam powłoka PowerShell w kontenerze – sprawdźmy gdzie jesteśmy wpisując polecenie hostname:


Aby wyjść z kontenera wystarczy wpisać exit lub wcisnąć Ctrl + P +Q (wyjście z kontenera bez wychodzenia z PowerShell lub dowolnego polecenia, które uruchamiamy interaktywnie). Skrótu klawiszowego możnarównież użyć, gdy uruchomiłeś nowy kontener w trybie interaktywnym. Kiedy naciśniesz Ctrl + P + Q, Docker wyjdzie z kontenera, utrzymując ten kontener działający w tle, tak jakbyś uruchomił go za pomocą opcji -d.

Właśnie dlatego cześć funkcji dotyczących dockera musimy wykonywać w czystym wierszu poleceń który doskonale radzi sobie z trybem interaktywnym – w przeciwieństwie do PowerShell ISE.

Czas na dane w kontenerach. Jak wiecie kontenery i dane w nich zawarte są bytami „jednorazowymi” – gdy kontener wykona swoje zadanie jest zatrzymywany i usuwany – również zawarte w nim dane. Jak zatem zachować dane lub wykorzystać je w innych kontenerach?

Załóżmy że mamy zasoby plikowe które chcemy aby były używane przez nasz kontener i chcemy aby były one również dostępne później (po zatrzymaniu, usunięciu kontenera) lub dla innych kontenerów. Wskazanym sposobem jest użycie woluminów Dockera i zamontowanie ich do utworzonych kontenerów.

Zacznijmy od użycia polecenia doker volume

# Docker volume - list of commands
docker volume

Poznaliśmy właśnie dostępne opcje – sprawdźmy więc czy mamy jakieś wolumeny używając docker volume ls :

docker volume ls

Nie mamy żadnego wolumenu, utworzymy więc nowy o nazwie dane

docker volume create dane

Następnie sprawdźmy czy jest on widoczny, użyjmy jeszcze raz docker volume ls

# Docker volume list
docker volume ls

Mamy wolumen, ale gdzie fizycznie znajdują się jego dane? Użyjemy do tego celu polecenia docker volume inspect

# Docker volume check details
docker volume inspect dane

Wynik polecenia przedstawi nam punkt montowania wolumenu na naszym systemie plików, przejdźmy zatem do tego katalogu i utwórzmy tam dowolny plik tekstowy:

Mamy volumen, spróbujmy go podmontować do kontenera. W tym celu uruchomimy interaktywnie nowy kontener o nazwie windowscore i nasz wolumen zmapujemy do katalogu c:\dane w środku kontenera. W kontenerze uruchomimy powłokę Powershell. Całe polecenie poniżej:

# Docker run interactivly new container with name, mount volume, run PowerShell in
docker run -it --name windowscore --mount source=dane,destination=c:\dane 903 PowerShell

Jesteśmy w naszym kontenerze sprawdźmy czy jest widoczny katalog dane i czy ma jakąś zawartość:

Mamy podmontowany wolumen dane do katalogu c:\dane – dla testu czy działa to w dwie strony, utwórzmy plik z poziomu kontenera i zapiszmy go w naszym wolumenie:

Działa! Utworzyliśmy plik z poziomu PowerShell w kontenerze – plik jest widoczny w lokalnym punkcie montowania.Wyjdźmy do lokalnej konsoli z użyciem skrótu Ctrl + P + Q nasz kontener nadal działa, sprawdźmy to poleceniem docker ps

Zatrzymajmy kontener aby dla pewności sprawdzić czy dane nie znikają, użyjemy polecenia docker stop

Dane są nadal dostępne:

Wolumen możemy mapować do następnego kontenera! Prawda że proste?

Na koniec usuńmy nasz wolumen (pamiętajcie że nie może on być używany przez inne kontenery, nie może być nawet zmapowany do archiwalnych wystąpień kontenerów). W celu usunięcia wolumenu używamy polecenia docker volume rm

# Docker volume delete
docker volume rm dane

Podsumowując dzisiejszy wpis: potrafimy zainstalować dockera, pobrać obraz kontenera, uruchomić kontener i go zatrzymać. Nauczyliśmy się wydać polecenia w kontenerze, używać danych wewnątrz kontenera. Całkiem solidne podstawy! A to dopiero początek 🙂

Użyte w dzisiejszym wpisie komendy znajdziecie tutaj.