Przy rozwoju programów opartych na serwerach pojawiało się zawsze jedno pytanie – gdzie ono będzie działać? Na początku takie aplikacje działały podobnie jak programy desktopowe – były on instalowane i uruchamiane bezpośrednio na fizycznych maszynach (ang. bare metal). Z czasem jednak zaczęły pojawiać się problemy, m.in.:

  • Maszyny fizyczne zajmowały dużo miejsca. 1 aplikacja = 1 maszyna fizyczna.
  • Jeżeli aplikacja nie wykorzystywała w pełni zasobów maszyny, pozostała pamięć czy procesor była najprościej mówiąc marnowana.
  • Problem z migracją. Serwery i systemy operacyjne są cały czas rozwijane, a kompatybilność wsteczna była ograniczona. Nie mieliśmy pewności czy migracja aplikacji na nowy system operacyjny się powiedzie, ani czy nowy sprzęt nie obsługiwał aktualnego środowiska programu.

Dlatego z czasem powstały programy, które pozwalały nam na wirtualizację środowisk fizycznych, sprawniej symulując działanie systemów operacyjnych, a dzisiaj coraz bardziej zyskuje też konteneryzacja. Możemy się spotkać z określeniem, że konteneryzacja to „inna forma wirtualizacji”. Czy aby na pewno? W tym wpisie postaram się przybliżyć obydwie strategie.

 

Wirtualizacja

 

Wirtualizacja to symulowanie systemu operacyjnego i jego zasobów fizycznych. Maszyna wirtualna zachowuje się jak oddzielny komputer, na którym możemy pracować. Całe środowisko jest odizolowane od środowisko, na którym zostało uruchomione. Tworzenie maszyn wirtualnych jest możliwe dzięki specjalnemu oprogramowaniu nazywane supervisor lub hypervisor, które służy do zarządzania maszynami wirtualnymi. Wyróżniamy dwa typy wirtualizacji:

  • Typ pierwszy – hypervisor/supervisor działa bezpośrednio na maszynie, które służy do tworzenia środowisk wirtualnych. Ma on dostęp do zasobów maszyny oraz pozwala również na emulację takich elementów jak np. karty sieciowe. Do tego typu wirtualizacji należą: Hyper-V od Microsoft czy XenServer od Citrix.

  • Typ drugi – hypervisor/supervisor działa wewnątrz systemu operacyjnego hosta i poprzez ten system zarządza zasobami dla maszyn wirtualnych. Innymi słowy jest to oddzielny program działający w naszym systemie operacyjnym. Do takich wirtualizatorów należą: Oracle VirtualBox czy VMware Workstation Pro.

Podsumowując: wirtualizacja pozwoli nam na uruchomienie kilku środowisk na jednej maszynie fizycznie, gdzie każda maszyna wirtualna będzie posiadała przydzielone zasoby jak pamięć RAM, moc obliczeniowa procesora itp. Dzięki temu możemy sprawnie izolować poszczególne aplikacje od siebie. Kolejnym plusem jest podstawowe bezpieczeństwo – nawet jeżeli ktoś włamie się na naszą maszynę wirtualną, intruz nie będzie miał bezpośrednio dostępu do maszyny fizycznej (niezależnie od typu wirtualizacji – będzie on musiał „pokonać” Supervisora). Dodatkowo nie mamy problemu z tworzeniem kopii bezpieczeństwa i migracji naszej aplikacji – do tego posłużą nam migawki. Mimo wszystko maszyny wirtualne mają swoje minusy: pewien procent zasobów maszyny fizycznej jest zablokowanych, aby zapewnić prawidłowe działanie menadżera maszyn wirtualnych. Dodatkowo, jeżeli maszyna wirtualna nie wykorzysta swoich zasobów np. zostało przydzielone 8GB RAMu, a maszyna wykorzystuje maksymalnie 6GB to pozostałe zasoby są blokowane i nie mogą zostać wykorzystywane przez inne maszyny wirtualne. Powoli wchodzą usprawnienia, które pozwalają na usunięcie tego problemu, ale niestety jest to dodatkowy koszt firm.

 

Konteneryzacja

 

Konteneryzacja to jedno z najgorętszych słów ostatnich lat w branży IT. Cały proces polega ona zamykaniu aplikacji, jej zależności, procesów itp.. w wirtualnej jednostce zwanej kontenerem. Z punktu widzenia aplikacji, kontenery są odrębnymi i niezależnymi od siebie środowiskami. Mimo wszystko to nadal nie jest wirtualizacja. Kontener nie symuluje w 100% systemu operacyjnego – jest on widoczny jako pojedynczy proces w systemie operacyjnymi hosta, który posiada niezbędne elementy do działania aplikacji. Nie znajdziemy tutaj np. zarządzania dyskami czy zaawansowanych systemów sieciowych. Dodatkowo kontener jest niemutowalny (odporny na zmianę) – jeżeli chcemy zapisać informacje wygenerowane przez aplikację to musimy do niego podpiąć zasób zwany inaczej wolumenem.

Tworzenie kontenerów jest możliwe dzięki specjalnemu oprogramowaniu. Do najpopularniejszych należy Docker. Działa on bezpośrednio w systemie operacyjnymi hosta, mając pełen dostęp do zasobów maszyny fizycznej. Jest on odpowiedzialny za zarządzanie obrazami (migawki niezbędne do uruchamiania kontenerów) oraz kontenerami. Pozwala on również na zarządzanie wolumenami czy siecią dla kontenerów.

Jedną z najważniejszych zalet konteneryzacji (czyli również Dockera) jest dynamiczny dostęp do zasobów komputera. Każdy kontener wykorzystuje w danym momencie tyle zasobów, ile potrzebuje. Nawet jeżeli ustawimy większy limit, to różnica nie jest blokowana i może zostać wykorzystana przez inne kontenery. Dodatkowo każdy kontener jest izolowany, zatem nie ma problemu np. z wykorzystywaniem tych samych portów (każdy kontener automatycznie otrzyma swój własny adres IP). W przypadku maszyn wirtualnych bylibyśmy zmuszeni do utworzenia nowej maszyny, przydzielenia nowego adresu IP i zainstalowaniu naszej aplikacji. Docker może również pracować w maszynie wirtualnej.

Do minusów konteneryzacji możemy na pewno zaliczyć wsparcie głównie jedynie dla systemu operacyjnych z rodziny Linuxa. Większość obrazów bazuje właśnie na jądrze (ang. kernel) tego systemu. Chociaż wsparcie dla Windows jest coraz lepsze, więc może w niedalekiej przyszłości nie będzie już to problem. Drugi problemem jest bezpieczeństwo. Musimy pamiętać, że kontener działa bezpośrednio w systemie operacyjnym maszyny jako proces i jeżeli nie wprowadzimy odpowiednio zabezpieczenia (przykładowo: przydzielenia użytkownika do kontenera i nadanie mu odpowiednich uprawnień) to intruz może uzyskać dostęp do naszego komputera poprzez kontener.

Graphical user interface, text, application, chat or text messageDescription automatically generated

 

Co zatem wybrać?

 

Wirtualizacja oraz konteneryzacja posiadają swoje wady i zalety, ale na pewno nie możemy postawić znaku „=” pomiędzy nimi. Jak w większości przypadków w środowisko IT – wybór jest uzależniony od potrzeb projektu i czasami od indywidualnych preferencji użytkownika. Nic nie stoi również na przeszkodzie, aby wykorzystać obydwa rozwiązania w swoich projektach. Dlatego warto poznać możliwości oraz w praktyce obydwa podejścia.