
Co to jest Docker i jak działa?
docker wysyła polecenia poprzez REST API do demona dockerd, który
buduje obrazy i uruchamia z nich kontenery.Dlaczego istnieje. Docker umożliwia spakowanie aplikacji ze wszystkimi jej zależnościami (biblioteki, konfiguracja, środowisko wykonawcze) w jeden artefakt — obraz — i uruchomienie go w identyczny sposób na laptopie programisty, w CI i w środowisku produkcyjnym. To rozwiązuje klasyczny problem „działa na moim komputerze”.
Kontenery a maszyny wirtualne. Maszyna wirtualna wirtualizuje sprzęt i dostarcza cały system operacyjny gościa z własnym jądrem. Kontener to izolowany proces korzystający z jądra hosta. W rezultacie kontenery są lżejsze, uruchamiają się w ułamkach sekundy i zużywają mniej zasobów. Ale kontener nie jest lekką maszyną wirtualną: jest powiązany z jądrem hosta, a jego granica izolacji jest słabsza niż granica maszyny wirtualnej. Maszyna wirtualna ma izolację wymuszoną sprzętowo, podczas gdy luka we współdzielonym jądrze może potencjalnie zostać usunięta z kontenera — to kompromis w zakresie szybkości i gęstości. Host musi odpowiadać typowi kontenera: kontenery systemu Linux wymagają jądra systemu Linux, kontenery systemu Windows wymagają jądra systemu Windows. W systemach macOS i Windows Docker Desktop w przezroczysty sposób uruchamia małą maszynę wirtualną z systemem Linux (np. poprzez WSL2), więc znajdujące się tam kontenery systemu Linux współdzielą jądro tej maszyny wirtualnej, a nie jądro systemu operacyjnego.
Architektura (klient-serwer). Według dokumentacji Dockera:
- Klient
dockerto podstawowy sposób interakcji użytkowników z Dockerem; polecenia takie jakdocker runsą wysyłane do demona. - Demon
dockerd„wykonuje najcięższe zadania” związane z budowaniem, uruchamianiem i dystrybucją kontenerów oraz zarządza obiektami, takimi jak obrazy, kontenery, sieci i woluminy. - Klient komunikuje się z demonem za pośrednictwem REST API poprzez gniazdo UNIX lub interfejs sieciowy, dzięki czemu mogą działać na różnych komputerach.
- Rejestr przechowuje obrazy; domyślny publiczny to Docker Hub.
Obrazy i kontenery. Przydatna analogia: obraz jest jak klasa (lub program na dysku), a kontener jest jej instancją (działającym procesem); możesz uruchomić wiele kontenerów z jednego obrazu.
- Obraz to szablon tylko do odczytu zawierający instrukcje dotyczące tworzenia kontenera zbudowanego z warstw. Jest zdefiniowany przez Dockerfile; kiedy to zmienisz, odbudowane zostaną tylko zmienione warstwy.
- Kontener to uruchamialna instancja obrazu. Na wierzchu warstw obrazu tylko do odczytu dodaje cienką warstwę zapisywalną (kopiowanie przy zapisie); wszystko, co jest tam zapisane, zostanie utracone po usunięciu kontenera — właśnie dlatego trwałe dane wymagają woluminów.
Jak działa izolacja (pod maską). dockerd nie wywołuje bezpośrednio jądra — deleguje zarządzanie cyklem życia kontenera do containerd, który wywołuje środowisko wykonawcze OCI; w Dockerze domyślnie jest to runc, ale środowisko wykonawcze można podłączyć (crun, gVisor, Kata itp.). Rzeczywista izolacja wynika z funkcji jądra Linuksa:
- przestrzenie nazw izolują zasoby (na stronie man7 dostępnych jest 8 typów: PID, sieć, montowanie, UTS, IPC, użytkownik, cgroup, czas). Proces „widzi” tylko swoje własne PID, swój własny stos sieciowy i tak dalej.
- cgroups (grupy kontrolne) ograniczają i uwzględniają wykorzystanie zasobów (procesor, pamięć, wejścia/wyjścia).
Częste działania następcze. Warstwy obrazu są buforowane; docker compose obsługuje aplikacje wielokontenerowe; dane są utrwalane poprzez woluminy (domyślnie kontener jest tymczasowy); a OCI standaryzuje format obrazu (specyfikacja obrazu), środowisko wykonawcze (specyfikacja środowiska wykonawczego) i protokół dystrybucji rejestru (specyfikacja dystrybucji) — te trzy specyfikacje zapewniają interoperacyjność ekosystemu.
