Czym jest Docker?
Słowem wstępu:
Jeśli budujemy daną architekturę składającą się z różnych aplikacji powinniśmy mieć na uwadze: co i jak zainstalować. Nierzadko musimy wiedzieć, jak zainstalować na Windows, a jak na Linux, jeśli naszym systemem operacyjnym na środowisku deweloperskim jest Windows bądź odwrotnie. Docker redukuje nam częściowo ten proces, a w szczególności ścieżkę związaną z „jak”.
Powyższe podejście powinno zapewniać jednolitą konfigurację pomiędzy pracownikami pracującymi w rozproszeniu na swoich lokalnych maszynach, jednak pracujących nad jednym repozytorium kodu. Jeśli do zespołu pracującym nad danym rozwiązaniem dołączony nowa osoba, wówczas jedyne co musi wykonać to zainstalować odpowiedni obraz na swojej instancji Dockera za pomocą Docker Desktop.
Schemat ilustrujący zasadę działania mechanizmu Docker:

Omówienie schematu:
System operacyjny jest jednym z głównych procesów obsługiwanych przez hardware.
Jeśli Docker uruchamiany jest bezpośrednio na systemach z rodziny Linux, to powstaje sub-proces w ramach systemu operacyjnego działający na własnej przestrzeni nazw i katalogów.
Co to oznacza?
Powłoka systemowa może komunikować się z katalogami, plikami i uruchamiać dane procesy.
Wewnątrz kontenera Docker powstaje mechanizm mockujący powłokę systemową.
Ów mechanizm zamiast pracować na ścieżkach głównego systemu operacyjnego, korzysta z ścieżek systemowych i przestrzeni nazw katalogów udostępnianych przez silnik Dockera.
Sub-proces wywoływany przez Docker różni się od osobnego wątku w aplikacji wielowątkowej.
Wątek, żeby mógł nieprzerwanie pracować pomimo nie wykonywania żadnego procesu, pozostaje zatrzymany w pętli jednocześnie przechowuje w pamięci podręcznej dane, które zostały zapisane w momencie wykonywania się.
Sub-proces natomiast może pracować nieprzerwanie, nie obciążając pamięci podręcznej. Sub-proces sam zarządza hard-warem, dostosowując żądania do swoich wymagań.
Z drugiej strony, maszyna wirtualna również działa nieprzerwanie, samodzielnie zarządzając hardwarem. Natomiast uruchamiając maszynę wirtualną musimy za wczasu wskazać systemowi operacyjnemu uruchamianemu pod maszyną wirtualną, jaki hard-ware w rzeczywistości przeznaczamy do użytku uruchomionemu systemowi. Dzieje się tak, między innymi ponieważ system jest zaprojektowany w ten sposób, że zapisuje plik tylko jeśli będzie miał wymaganą przestrzeń na dysku, inaczej zostanie zwrócony błąd, a próba zapisu nie powiedzie się.
Docker natomiast działa w ten sposób, że jest sub-procesem uruchomionym bezpośrednio na naszym systemie operacyjnym, natomiast pod spodem tworzy własną przestrzeń nazw, natomiast komendy wykonywane po stronie Dockera w jego mechaniźmie mockującym powłokę systemową przechwytywane są i wykonywane za pomocą naszego systemu operacyjnego (tym właśnie jest ideologia Dockera) na przestrzeni stworzonej wewnątrz Dockera.
Docker Desktop jest aplikacją ilustrującą za pomocą graficznego GUI system działania Dockera.
Różnica pomiędzy obrazem Dockera, kontenerem, a samym Dockerem:
Kontener Docker możemy sobie wyobrazić, jako osobną przestrzeń nazw wraz z własną listą zmiennych środowiskowych.
Kontener ma własną sieć, lecz nie jest ona integralną częścią kontenera, jak ma to miejsce na głównym systemie operacyjnym.
Dlatego może się zdarzyć sytuacja, w której usuniemy kontener, który działał w danej sieci wewnątrz Dockera, a sama sieć pozostanie nie usunięta. Stąd mam wrażenie, panuje trochę przekonanie w branży, że Docker zostawia trochę „śmieci”, które powinniśmy się nauczyć zarządzać. Trochę w tym pomaga Docker Desktop.
Obraz Dockera zawsze jest na podstawie predefiniowanych obrazów przygotowanych przez twórców Dockera tj.
https://hub.docker.com
Obraz dockera jest kompozycją aplikacji wraz z ich konfiguracją w jednym kontenerze.
Natomiast kompozycja Docker Compose stworzy nam dwa osobne kontenery, jeśli mamy dwie zależności w pliku konfiguracyjnym.
Dlatego warto czasami rozważyć instalację bardziej granularnych obrazów, w celu przejrzystego zarządzania.
Pobieranie i instalacja Docker Desktop na Windows:
Docker Desktop możemy pobrać wchodząc na stronę: https://www.docker.com/ i wybierać odpowiednia wersję systemową zainstalowaną na naszej lokalnej maszynie (naszym komputerze).
Co składa się na Docker Desktop?
- Docker Engine – rdzeń odpowiedzialny za zarządzanie kontenerami
- Docker CLI – interfejs wiersza poleceń do obsługi Dockera
- Docker Compose – narzędzie do definiowania i uruchamiania aplikacji wielokontenerowych
- Docker Desktop UI – graficzny interfejs użytkownika
Docker compose:
Wyobraźmy sobie Mozarta, który za pomocą nut tworzy własną kompozycję utworu. Dopiero gdy zaczyna grać swoją kompozycję napisaną za pomocą nut, to jesteśmy w stanie usłyszeć jego muzykę. Bardzo podobnie działa Docker compose, tj. mechanizm, który za pomocą konfiguracji zawartej w pliku .yaml, uruchamia nam kontenery w Dockerze, jednocześnie inicjalizując zapisaną konfigurację sieci, volumenów bądź innych zależności. Możemy korzystać z Docker compose, lecz nie musimy. Osobiście do celów automatyzacji procesów, tylko własne aplikacje uruchamiam za pomocą Docker compose’a, a rozwiązania Open Source z zewnątrz staram się uruchamiać i konfigurować bezpośrednio w Docker engine, czy to za pomocą CLI (Command Line Interface), jak i również można posiłkować się Docker Desktop.
Przykładowa zawartość pliku docker-compose.yaml
Jak uruchomić kontener?
Warto zaznaczyć, że przygotowałem dla Was osobny wpis, w którym przedstawiam najczęściej używane polecenia Docker w kontekście automatyzacji procesów.
Kontener uruchamiamy w terminalu z linii poleceń wpisując: docker run -d -p 8000:80 docker/welcome-to-docker
, gdzie:
- flaga
- d
oznacza uruchomienie kontenera w tle. Nie strumieniujemy bajtów na uruchomioną instancję powłoki. - flaga
- p
oznacza mapowanie portów z wewnątrz kontenera, które nie są widziane przez clientów na naszym systemie do portów widzianych z poziomu naszego komputera. - następnie podajemy ścieżkę do obrazu na Docker Hub, który chcielibyśmy pobrać, rozpakować i uruchomić.
Czym jest WSL (Windows Subsystem for Linux)?
WSL (Windows Subsystem for Linux) – rodzaj wirtualizacji innego systemu (Linux) na systemie Windows (WSL 2 korzysta z lekkiej maszyny wirtualnej). Będący alternatywą do uruchamiania tradycyjnej maszyny wirtualnej na Windowsie. WSL 1 jest jedynie warstwą kompatybilności, która przedkłada wywołania systemowe Linux na odpowiadające im funkcje w systemie Windows. Narzędzie umożliwiające wirtualizację częściowego środowiska Linux bezpośrednio na uruchomionym systemie Windows.
Jak zainstalować WSL na Windows?
wsl --install
Uruchomienie AI na lokalnej maszynie:
Tworzenie volumenu przechowującego pobrane modele LLM na lokalnym komputerze:mkdir ollama_images
Uruchomienie kontenera z obrazem narzędzia „Ollama”:docker run -d -v ${PWD}/ollama_images:/root/.ollama -p 11434:11434 --name ollama_ai ollama/ollama
Sprawdzenie logów:logs -f ollama_ai
Przełączniki, które alokują GPU.
Podnoszenie kontenera:docker start ollama_ai
Uruchomienie w mechaniźmie mockującym powłokę systemową Ollamę i tunelowanie wyświetlanych komunikatów wraz z interakcją do powłoki systemowej głównego systemu operacyjnego:docker exec -it ollama_ai ollama run deepseek-r1:1.5b
Interaktywna sesja z przestrzenią kontenera, z jednoczesną alokacją terminala strumieniowanego na naszą powłokę systemową.
Zwróćcie uwagę, że domyślnie model DeepSeek-r1, jest modelem instruct dodatkowo reasoning. Więc można mu wydawać polecenia (instrukcje), którymi ma się kierować udzielając nam odpowiedzi. Modele, które nie są douczone w formie instruct dopełniają jedynie kolejną część tekstu o prawdopodobieństwo wystąpienia kolejnych tokenów.