Docker nie jest metodologią wirtualizacji. Opiera się na innych narzędziach, które faktycznie wdrażają wirtualizację opartą na kontenerach lub wirtualizację na poziomie systemu operacyjnego. W tym celu Docker początkowo używał sterownika LXC, a następnie przeniósł się do libcontainer, który teraz przemianowano na runc. Docker koncentruje się przede wszystkim na automatyzacji wdrażania aplikacji w kontenerach aplikacji. Kontenery aplikacji są zaprojektowane do pakowania i uruchamiania pojedynczej usługi, podczas gdy kontenery systemowe są zaprojektowane do uruchamiania wielu procesów, takich jak maszyny wirtualne. Docker jest więc uważany za narzędzie do zarządzania kontenerami lub wdrażania aplikacji w systemach kontenerowych.
Aby dowiedzieć się, czym różni się od innych wirtualizacji, przejdźmy do wirtualizacji i jej typów. Wtedy łatwiej byłoby zrozumieć, jaka jest tam różnica.
Wirtualizacja
W swojej wymyślonej formie uznano ją za metodę logicznego dzielenia komputerów mainframe, aby umożliwić jednoczesne działanie wielu aplikacji. Jednak scenariusz drastycznie się zmienił, gdy firmy i społeczności open source były w stanie zapewnić metodę obsługi uprzywilejowanych instrukcji w taki czy inny sposób i umożliwić jednoczesne uruchomienie wielu systemów operacyjnych w jednym systemie opartym na architekturze x86.
Hypervisor
Hiperwizor obsługuje tworzenie wirtualnego środowiska, w którym działają maszyny wirtualne gościa. Nadzoruje systemy gościa i zapewnia, że zasoby są przydzielane gościom w razie potrzeby. Hiperwizor znajduje się pomiędzy maszyną fizyczną a maszynami wirtualnymi i zapewnia usługi wirtualizacji na maszynach wirtualnych. Aby to zrealizować, przechwytuje operacje systemu operacyjnego gościa na maszynach wirtualnych i emuluje operację w systemie operacyjnym hosta.
Szybki rozwój technologii wirtualizacji, przede wszystkim w chmurze, spowodował dalsze wykorzystanie wirtualizacji, umożliwiając tworzenie wielu serwerów wirtualnych na jednym fizycznym serwerze za pomocą hiperwizorów, takich jak Xen, VMware Player, KVM itp., Oraz włączenie obsługi sprzętowej w procesorach towarowych, takich jak Intel VT i AMD-V.
Rodzaje wirtualizacji
Metodę wirtualizacji można podzielić na kategorie na podstawie tego, jak naśladuje sprzęt w systemie operacyjnym gościa i emuluje środowisko operacyjne gościa. Przede wszystkim istnieją trzy typy wirtualizacji:
- Współzawodnictwo
- Parawirtualizacja
- Wirtualizacja oparta na kontenerach
Współzawodnictwo
Emulacja, znana również jako pełna wirtualizacja, uruchamia jądro systemu operacyjnego maszyny wirtualnej całkowicie w oprogramowaniu. Hiperwizor stosowany w tym typie jest znany jako hiperwizor typu 2. Jest instalowany w systemie operacyjnym hosta, który jest odpowiedzialny za tłumaczenie kodu jądra systemu operacyjnego gościa na instrukcje oprogramowania. Tłumaczenie odbywa się całkowicie w oprogramowaniu i nie wymaga udziału sprzętu. Emulacja umożliwia uruchomienie dowolnego niezmodyfikowanego systemu operacyjnego, który obsługuje emulowane środowisko. Wadą tego rodzaju wirtualizacji jest dodatkowy narzut zasobów systemowych, który prowadzi do zmniejszenia wydajności w porównaniu do innych rodzajów wirtualizacji.
Przykłady w tej kategorii to VMware Player, VirtualBox, QEMU, Bochs, Parallels itp.
Parawirtualizacja
Parawirtualizacja, znana również jako hiperwizor typu 1, działa bezpośrednio na sprzęcie lub „bez systemu” i zapewnia usługi wirtualizacji bezpośrednio na uruchomionych na nim maszynach wirtualnych. Pomaga systemowi operacyjnemu, zwirtualizowanemu sprzętowi i prawdziwemu sprzętowi współpracować w celu osiągnięcia optymalnej wydajności. Te hiperwizory zwykle mają raczej niewielką powierzchnię i same w sobie nie wymagają dużych zasobów.
Przykłady w tej kategorii to Xen, KVM itp.
Wirtualizacja oparta na kontenerach
Wirtualizacja oparta na kontenerach, zwana również wirtualizacją na poziomie systemu operacyjnego, umożliwia wiele izolowanych wykonań w ramach jednego jądra systemu operacyjnego. Ma najlepszą możliwą wydajność i gęstość oraz funkcje dynamicznego zarządzania zasobami. Izolowane wirtualne środowisko wykonawcze zapewniane przez ten typ wirtualizacji nazywane jest kontenerem i może być postrzegane jako śledzona grupa procesów.
Koncepcja kontenera jest możliwa dzięki funkcji przestrzeni nazw dodanej do jądra Linuksa w wersji 2.6.24. Kontener dodaje swój identyfikator do każdego procesu i dodaje nowe kontrole kontroli dostępu do każdego wywołania systemowego. Dostęp do niego ma wywołanie systemowe clone () , które umożliwia tworzenie oddzielnych instancji wcześniej globalnych przestrzeni nazw.
Przestrzeni nazw można używać na wiele różnych sposobów, ale najczęstszym podejściem jest utworzenie izolowanego kontenera, który nie ma widoczności ani dostępu do obiektów poza kontenerem. Wydaje się, że procesy działające w kontenerze działają w normalnym systemie Linux, chociaż współużytkują jądro bazowe z procesami znajdującymi się w innych przestrzeniach nazw, tak samo jak w przypadku innych rodzajów obiektów. Na przykład podczas korzystania z przestrzeni nazw użytkownik root w kontenerze nie jest traktowany jak root poza kontem, co zwiększa bezpieczeństwo.
Podsystem Linux Control Groups (cgroups), kolejny główny komponent umożliwiający wirtualizację opartą na kontenerach, służy do grupowania procesów i zarządzania ich zagregowanym zużyciem zasobów. Jest powszechnie stosowany w celu ograniczenia zużycia pamięci i procesora przez pojemniki. Ponieważ kontenerowy system Linux ma tylko jedno jądro, a jądro ma pełny wgląd w kontenery, istnieje tylko jeden poziom alokacji zasobów i planowania.
Dostępnych jest kilka narzędzi do zarządzania kontenerami Linux, w tym LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker itp.
Kontenery kontra maszyny wirtualne
W przeciwieństwie do maszyny wirtualnej, kontener nie musi uruchamiać jądra systemu operacyjnego, więc kontenery można utworzyć w niecałą sekundę. Ta funkcja sprawia, że wirtualizacja oparta na kontenerach jest wyjątkowa i pożądana niż inne metody wirtualizacji.
Ponieważ wirtualizacja oparta na kontenerach wnosi niewielki lub żaden narzut na maszynę hosta, wirtualizacja oparta na kontenerach ma prawie natywną wydajność
W przypadku wirtualizacji opartej na kontenerach nie jest wymagane żadne dodatkowe oprogramowanie, w przeciwieństwie do innych wirtualizacji.
Wszystkie kontenery na maszynie hosta współdzielą program planujący maszynę hosta, oszczędzając zapotrzebowanie na dodatkowe zasoby.
Stany kontenerów (obrazy Docker lub LXC) są małe w porównaniu do obrazów maszyn wirtualnych, więc obrazy kontenerów można łatwo dystrybuować.
Zarządzanie zasobami w kontenerach odbywa się za pomocą cgroups. Cgroups nie pozwala kontenerom zużywać więcej zasobów niż im przydzielono. Jednak na razie wszystkie zasoby maszyny hosta są widoczne na maszynach wirtualnych, ale nie można ich użyć. Można to zrealizować, uruchamiając jednocześnie top
lub htop
na kontenerach i maszynie hosta. Dane wyjściowe we wszystkich środowiskach będą wyglądać podobnie.
Aktualizacja:
Jak Docker obsługuje kontenery w systemach innych niż Linux?
Jeśli kontenery są możliwe ze względu na funkcje dostępne w jądrze Linuksa, oczywistym pytaniem jest, w jaki sposób systemy inne niż Linux uruchamiają kontenery. Zarówno Docker dla komputerów Mac, jak i Windows używają maszyn wirtualnych z systemem Linux do uruchamiania kontenerów. Docker Toolbox służy do uruchamiania kontenerów w maszynach wirtualnych Virtual Box. Ale najnowszy Docker używa Hyper-V w Windows i Hypervisor.framework w Mac.
Teraz opiszę szczegółowo, w jaki sposób Docker dla komputerów Mac szczegółowo uruchamia kontenery.
Docker dla komputerów Mac używa https://github.com/moby/hyperkit do emulowania funkcji hypervisora, a Hyperkit korzysta z hypervisor.framework w swoim rdzeniu. Hypervisor.framework to natywne rozwiązanie hypervisora dla komputerów Mac. Hyperkit używa również VPNKit i DataKit do odpowiednio przestrzeni sieci i systemu plików.
Maszyna wirtualna z systemem Linux, którą Docker działa na komputerze Mac, jest tylko do odczytu. Możesz jednak zaatakować go, uruchamiając:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Teraz możemy nawet sprawdzić wersję tej maszyny wirtualnej w jądrze:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Wszystkie kontenery działają wewnątrz tej maszyny wirtualnej.
Istnieją pewne ograniczenia dotyczące hypervisor.framework. Z tego powodu Docker nie ujawnia docker0
interfejsu sieciowego na komputerze Mac. Tak więc nie możesz uzyskać dostępu do kontenerów z hosta. Na razie docker0
jest dostępny tylko w maszynie wirtualnej.
Hyper-v to natywny hypervisor w systemie Windows. Próbują również wykorzystać możliwości systemu Windows 10 do natywnego uruchamiania systemów Linux.