Ahoj Kapitanie, czyli o wirtualizacji i konteneryzacji

Wirtualizacja i konteneryzacja to procesy, które mają za zadanie usprawnić proces wytwarzania oprogramowania, pomóc w płynnym dostarczaniu rozwiązań na produkcję, a co za tym idzie wprowadzić olbrzymie oszczędności czasu.

Whale PAGES.POST.COVER_THUMBNAIL.BY_WHOM undefined

Z tego artykułu dowiesz się:

  • Co to znaczy, że oprogramowanie jest open source?

  • Na czym polega wirtualizacja?

  • Co to jest konteneryzacja?

  • Kto to jest Docker Captain?

Gdy w listopadzie 2014 roku dołączyłem do niewielkiej firmy, znajdującej się na terenie Parku Naukowo Technologicznego UAM w Poznaniu, nie spodziewałem się, że programowanie to nie tylko rozwiązywanie problemów wynikających z kodu. Pomimo, że już od kilku lat zajmowałem się budowaniem stron internetowych i umieszczaniem ich na serwerach to moja wiedza była raczej niewielka. Na tyle mała, że lista skomplikowanych zależności, które są potrzebne do przygotowania środowiska pod uruchomienie jakiejkolwiek aplikacji nie miała dla mnie większego znaczenia.

Szansa, którą dostałem od Krzysztofa i Szymona z Light4website, była dla mnie wielkim początkiem. Tylko, że już pierwszego dnia na horyzoncie pojawiły się schody - Ubuntu.

O co chodzi z tym Ubuntu?

Ubuntu to jedna z najpopularniejszych dystrybucji systemu operacyjnego Linux. Linux natomiast to system operacyjny, który przypomina swoją budową system operacyjny Unix, rozwijany już od 1969 roku. Mianem Linux określa się też rodzinę systemów operacyjnych, wykorzystujących Linux kernel (jądro linuxa) - wolne oprogramowanie stworzone przez Linusa Torvaldsa. Jest to istotne w kontekście dzisiejszego artykułu, ponieważ to jądro Linux odpowiada między innymi za komunikację systemu ze sterownikami oraz programami, a także ich uruchamianie czy też obsługę systemu plików. Innymi słowy jest to dość ważna część systemu operacyjnego Linux.

Idea wolnego oprogramowania opiera się na poszanowaniu prawa użytkowników do wolności w zakresie wykorzystywanego programu, co właściwie sprowadza się do tego, że społeczność może badać, rozwijać, powielać, uruchamiać i modyfikować oprogramowanie, które wykorzystuje. Łącząc oba powyższe aspekty powstaje nam system operacyjny, który daje swoim użytkownikom sporo wolności, licząc tym samym na ich odpowiedzialność i zrozumienie, z czego i w jakim celu korzystają. Takie też jest Ubuntu.

Możesz wszystko, włącznie z zepsuciem wszystkiego.

Pierwszy kontakt

Projekty, nad którymi pracowałem w Light4website były budowane na Magento lub Wordpress, co oznacza, że do uruchomienia potrzebowały przynajmniej interpretera PHP. Samo zainstalowanie interpretera PHP pozwoli naszemu komputerowi zrozumieć i wykonać kod, który napiszemy, ale nadal nie pozwoli nam wyświetlić całości strony www na naszym urządzeniu. Do tego potrzebujemy kolejnych narzędzi, np. Apache (popularny serwer HTTP), bazę danych MySQL… Nie wspomnę już o konfiguracji lokalnej domeny, ustawieniu katalogów, dostępu do nich i uprawnień. A jeśli dołożymy do tego fakt, że każdy projekt może wymagać różnych wersji powyżej wymienionych - powstaje nam olbrzymia ilość możliwych konfiguracji oprogramowania w ramach jednej maszyny. Łatwo nie jest.

Oczywiście ten sam problem napotkamy na systemach operacyjnych z rodziny Windows czy MacOS.

Wirtualizacja

Wyobraź sobie sytuację, w której tworzona aplikacja wykorzystuje kilka różnych języków programowania. Albo jeszcze lepiej - aplikacja rozbita jest na mniejsze serwisy, a każdy z nich wykorzystuje inną wersję danego języka i ma zupełnie inne wymagania, jeśli chodzi o wersje oprogramowania. Powyższe przykłady rodzą wiele problemów i to nie tylko w trakcie tworzenia oprogramowania, ale również jego utrzymywania i publikacji na serwerach. Ustawienie tego raz może zająć bardzo dużo czasu. Przeniesienie wszystkiego w nowe miejsce bezbłędnie byłoby bardzo trudne i wymagałoby wiele uwagi, co i tak nie gwarantuje, że zrobimy to idealnie. A aktualizacje? Eh…

A gdyby tak wydzielić fragment dostępnych zasobów w naszym komputerze (ewentualnie serwerze) i odizolować tę warstwę, tak aby przechowywała tylko jedną możliwą konfigurację. Przeniesienie całości lub aktualizacja oprogramowania na tej warstwie nie powinna mieć wówczas wpływu na inne elementy systemu.

Wady i zalety wirtualizacji

Proces, o którym wspomniałem nazywa się wirtualizacją. Dzięki niemu takie zasoby jak procesor, pamięć operacyjna, dysk mogą zostać podzielone na wiele urządzeń wirtualnych. Taka symulacja potrzebuje przygotowania całego środowiska, czasami włącznie z systemem operacyjnym, od początku w ramach wydzielonych zasobów. Pomaga przez to zwiększyć skalowalność tworzonych rozwiązań, zminimalizować ilość potrzebnych serwerów, ograniczyć koszty infrastruktury, a poprzez izolację zwiększa bezpieczeństwo, tym samym tworząc kompletne, bezpieczne i niezależne środowisko.

Wydaje się zatem, że wirtualizacja rozwiązuje wszystkie problemy, które omówiliśmy we wstępie. Niestety ma ona również swoje wady. Aplikacje uruchomione w ramach wirtualnej maszyny (ang. VM, Virtual Machine) są mniej wydajne niż te uruchomione na fizycznym sprzęcie. Wynika to przede wszystkim z tego, że pomiędzy aplikacją a serwerem znajduje się dodatkowa warstwa abstrakcji w postaci systemu operacyjnego samej maszyny wirtualnej. Ponadto pomiędzy bazowym systemem operacyjnym a środowiskiem wirtualnym znajduje się program, który jest odpowiedzialny za nadzorowanie i kontrolowanie pracy VM, tzw. hipervisor. Jego praca również powoduje opóźnienia.

Konteneryzacja

A gdyby tak zachować zalety wirtualizacji, przy jednoczesnym zmniejszeniu ilości abstrakcji? Konteneryzacja zakłada, że nie ma potrzeby wydzielania zasobów tylko na potrzeby tworzonych kontenerów. Kontenery funkcjonują w ramach jednego jądra tego samego systemu operacyjnego. Każdy kontener nadal posiada własny system plików, co daje mu wymaganą niezależność. Fakt, że kontenery są odizolowane od systemu operacyjnego i od siebie nawzajem, powoduje, że zachowują zalety maszyn wirtualnych a przy okazji są wyjątkowo lekkie, ponieważ wykorzystują tylko tyle zasobów, ile rzeczywiście potrzebują. Ponadto kontenery mogą wymieniać się informacjami za pomocą precyzyjnie określonych kanałów komunikacji, co nie jest możliwe pomiędzy różnymi maszynami wirtualnymi.

Wadą konteneryzacji jest natomiast to, że uzależnia nasze kontenery od systemu operacyjnego, na którym zostały uruchomione. Rozwiązuje się to często przez zastosowanie podejścia hybrydowego - VM z potrzebnym systemem operacyjnym a w nim kontenery. Kolejną istotną wadą jest fakt, że konteneryzacja nie oferuje pełnej izolacji kontenera, takiej jaką możemy osiągnąć za pomocą maszyny wirtualnej.

Docker

Najczęściej stosowanym narzędziem do konteneryzacji jest Docker (chociaż nie jedynym). Docker jest wolnym oprogramowaniem, co daje szerokie możliwości jego użytkownikom do jego modyfikacji pod swoje potrzeby, a także uczestniczenia w jego rozwoju. Jako platforma daje nam możliwość tworzenia spójnej konfiguracji środowiska uruchomieniowego naszych kontenerów, a to z kolei powoduje, że niezależnie od miejsca ich uruchomienia, mamy gwarancję, że zadziałają wszędzie tak samo. Innymi słowy - dzięki Dockerowi możemy zapomnieć o umieszczaniu na serwerze specyficznych konfiguracji, ponieważ uruchamiane kontenery same wiedzą najlepiej, czego potrzebują i w jaki sposób ma być to ustawione.

Docker może zostać uruchomiony tylko na jądrze Linuxa, w związku z czym użycie Dockera w ramach innych systemów operacyjnych wiąże się z wykorzystaniem podejścia hybrydowego. Możemy to zrobić za pomocą aplikacji Docker Desktop, która tworzy maszynę wirtualną w ramach której uruchamiane są kontenery.

Warto przeczytać w tym temacie

naudoc

Elton Stoneman

Nauka Dockera w miesiąc

Kup

poprzez

Helion.pl

Dojrzałe rozwiązanie

Warto wspomnieć o tym, że narzędzia oferowane w ramach Docker’a są narzędziami bardzo dojrzałymi. Pierwsza wersja została wydana w 2013 roku jako open source pod nazwą Docker Engine. Organizacja odpowiedzialna za jego rozwój dba o to, abyśmy mieli spory wybór narzędzi pomocniczych. W ramach swojej aktywności przygotowali również repozytorium obrazów dockerowych (Docker Hub), które możemy pobierać i wykorzystywać na swoje potrzeby, jeśli nie chcemy bawić się samodzielnie w konfigurację.

Ponadto ze zgromadzonej wokół projektu społeczności wybierani są najlepsi jej członkowie, wyróżniający się wiedzą i swoją aktywnością wokół samego projektu, którzy otrzymują tytuł Docker Captain. Jest to spore wyróżnienie. Na dzień dzisiejszy w Polsce mamy tylko dwie osoby, które noszą ten tytuł. Pierwszym został Łukasz Lach, a od całkiem niedawna może się nim pochwalić również Damian Naprawa.

Podsumowanie

Należy pamiętać, że konteneryzacja nie jest rozwinięciem wirtualizacji. Są to różne podejścia, które mają swoje wady i zalety, a co za tym idzie należy je stosować, biorąc pod uwagę wymagania projektu. Warto wspomnieć o tym, że nawet najlepsza koncepcja może być wykorzystana w kiepski sposób.

Kiedy dołączałem do Light4website o Dockerze zaczynało się robić głośno. My pracowaliśmy wówczas na maszynach wirtualnych, ale czy to oznacza, że było to złe podejście? Zdecydowanie nie - było po prostu wystarczające na nasze potrzeby w tamtym momencie. Zawsze warto zachować zdrowy rozsądek.

Udostępnij ten artykuł:

Komentarze (0)

    Jeszcze nikt nic nie napisał, ale to znaczy że... możesz być pierwszy/pierwsza.

Powiązane treści

Jeżeli ten artykuł Cię zainteresował sprawdź inne materiały powiązane z nim tematycznie. Poniżej znajdziesz artykuły i odcinki podcastów mojego autorstwa oraz polecane przeze mnie książki, które rozszerzają ten temat.

High Rise Sky Scrapers⁠ by Pexels
Artykuł
13 czerwca 2024

Sekrety architektury MVC

MVC to jedna z najstarszych i najpopularniejszych architektur w środowisku web-developmentu. Od wielu lat ceniona jest za prostotę i funkcjonalność. Jednak pomimo to nie sprawdziła się w większości aplikacji frontendowych. Dlaczego? Dziś opowiem szerzej o MVC.

Czytaj więcej
Monorepo vs Polirepo by Mateusz Jabłoński
Podcast
01 marca 2023

Monorepo vs Polirepo

Programowanie to nie tylko podejmowanie decyzji, kiedy jaką funkcję napisać czy jak nazwać zmienną. Programowanie to proces, który trzeba zainicjować podejmując różne decyzje, które będą na niego rzutowały w następnych etapach. Jedna z nich to odpowiedź na pytanie: Monorepo czy Polirepo?

Posłuchaj
Delivery by cybrain
Artykuł
05 września 2019

CI oraz CD w procesie deweloperskim

Automatyzacja procesów jest jednym z najistotniejszych elementów w procesie deweloperskim. Szczególny wpływ automatyzacji możemy zobaczyć, gdy rozmawiamy o jakości.

Czytaj więcej

Zapisz się do newslettera

Bądź na bieżąco z nowymi materiałami, ćwiczeniami i ciekawostkami ze świata IT. Dołącz do mnie.