W niniejszym artykule postaramy się Wam przybliżyć tematykę wirtualizacji, konteneryzacji oraz Docker’a. Czym właściwie jest to oprogramowanie i po co go używamy? Jakie różnice są między maszynami wirtualnymi i Docker’em? Zachęcamy do lektury.

 

Podstawowe pojęcia

Aby zrozumieć, na czym polega wirtualizacja oraz jak działa oprogramowanie Docker, należy poznać podstawowe terminy:

  • Kontener - standaryzowana jednostka oprogramowania. Zawiera on paczkę kodu wraz z zależnościami wymaganymi do jego uruchomienia (np. JS Code + NodeJS interpreter).
  • Docker - narzędzie, które pozwala umieścić nasz program wraz z jego zależnościami (bibliotekami, plikami konfiguracyjnymi) w lekkim, przenośnym, wirtualnym kontenerze, który można w prosty sposób uruchomić na serwerze.

 

Dzięki kontenerom będziemy mogli uruchomić nasze oprogramowanie na dowolnym systemie na którym zainstalowano Dockera.

Po co?

Jeśli masz jakieś doświadczenie pracy jako programista w zespole, to z pewnością doświadczyłeś w swoim życiu problemów technicznych związanych z rozwijaniem oprogramowania. Docker nie pomoże nam z całym trudem kodowania, ale jest w stanie wyeliminować najbardziej frustrujące przeszkody jak np.:

  • różne środowiska produkcyjne i deweloperskie - jeśli lokalnie kodując aplikację używamy Pythona 3.9 i nowych właściwości tego języka, a na serwerze produkcyjnym mamy interpreter Python 3.3, to nasza aplikacja może nie działać, dopóki nie podniesiemy wersji interpretera na serwerze. Łatwiej dostarczyć serwerowi kontener, który posiada w sobie odpowiednią wersję, na której nasz program powinien być uruchamiany. Dobrą praktyką jest testowanie i build’owanie na tych samych wersjach w środowisku produkcyjnym, jak i deweloperskim.
  • różne środowiska pomiędzy pracownikami w zespole - różni członkowie mogą mieć różne wersje zależności np. różne wersje Pythona czy bibliotek. Można pomyśleć, że update wersji do odpowiedniej to nic takiego, ale:
    • brak pewnej standaryzacji sprawia, że nie ma gwarancji, że nasz kod za każdym razem będzie działał u kogoś innego
    • aktualizacja bywa skomplikowana przy dużych zależnościach

Zamknięcie kodu w kontenerze sprawia, że zapewniamy pewien standard oprogramowania w jakim uruchamiany jest kod i mamy pewność, że zawsze będzie on działał.

  • Różne wersje narzędzi/bibliotek pomiędzy projektami - każda pojedyncza osoba w drużynie może pracować nad wieloma projektami, z których każdy może wymagać narzędzi/bibliotek w innych wersjach. Zmiana wersji może wiązać się z przeinstalowaniem bibliotek/narzędzi, czego Docker pozwala uniknąć instalując zależności wewnątrz kontenera.

 

Najprościej mówiąc - Docker standaryzuje nam sposób uruchamiania aplikacji i sprawia, że mamy pewność, że jeśli aplikacja uruchamia się na jednym środowisku, to tak samo będzie na innym - oczywiście pod warunkiem, że jest tam zainstalowane oprogramowanie Docker.

 

Maszyny wirtualne kontra konteneryzacja

Wirtualizacja to symulacja poprzez oprogramowanie istnienia zasobów logicznych, które wykorzystują zasoby fizyczne. Wirtualne maszyny mogą uruchamiać system operacyjny wewnątrz innego systemu. System hostujący przydziela wtedy takiej maszynie wirtualnej określone zasoby.

 

Kluczowym wyróżnikiem pomiędzy kontenerami a maszynami wirtualnymi jest to, że te drugie wirtualizują całą maszynę włącznie z systemem operacyjnym, nazywanym czasami Guest OS. Kontenery wirtualizują tylko warstwy oprogramowania powyżej poziomu systemu operacyjnego i są często stosowane choćby w architekturze mikroserwisów.

Rysunek 1: Porównanie maszyn wirtualnych i kontenerów. Źródło: Atlassian.

 

Instalacja Docker’a

Instalacja oprogramowania jest zależna od systemu operacyjnego, dlatego zdecydowaliśmy się przedstawić jedną, najpopularniejszą opcję na system Windows. Należy:

Po zainstalowaniu powinniśmy być w stanie wykonać komendę “docker” w dowolnie wybranym terminalu (PowerShell, cmd).

Kontener kontra obraz

Początkujący w tematyce konteneryzacji często mylą na początku te dwa powyższe pojęcia, a ich zrozumienie jest kluczowe dla efektywnej pracy z Docker’em:

  • Image - plik służący do wykonywania kodu w kontenerze Docker’a.  Obrazy działają jak zestaw instrukcji do tworzenia kontenera, trochę jak templatka. Obraz jest porównywalny do migawki (snapshot) w technologiach maszyn wirtualnych.
  • Container - standaryzowana paczka oprogramowania, która pakuje kod i wszystkie jego zależności. Jest to lekki, samodzielny, wykonywalny pakiet oprogramowania, który zawiera wszystko, co jest potrzebne do uruchomienia aplikacji: kod, środowisko wykonawcze, narzędzia systemowe, biblioteki systemowe i ustawienia.

 

Obraz to więc plik, z którego produkujemy instancje naszych aplikacji. To trochę tak jak z klasą w programowaniu oraz obiektem, który jest instancją tej klasy. Jeśli nie jesteś programistą, możesz myśleć o obrazie jak o przepisie kuchennym, a o kontenerze jak o gotowym daniu (z jednego przepisu można zrobić wiele razy to samo danie).

 

Dockerfile

Dockerfile to plik zawierający konfigurację, z którego generujemy obraz, czyli inaczej mówiąc - definiujemy, z jakiego interpretera i bibliotek ma korzystać nasza uruchamiana aplikacja.

Rysunek 2: Przykład pliku Dockerfile do uruchomienia aplikacji napisanej w React.js.

 

Ze zdefiniowanego pliku Dockerfile można następnie wygenerować obraz, a z obrazu uruchomić kontener. Jeśli czujesz się zagubiony pod wpływem nowych pojęć, to możesz się wspomóc następującym obrazkiem ze strony medium.com.

Rysunek 3: Workflow, które towarzyszy powstawaniu kontenera. Źródło: medium.com.

 

Podsumowanie

Reasumując - mamy nadzieję, że udało nam się dzisiaj przedstawić powody, dla których warto poznać Dockera i jak może on pomóc w Waszej codziennej pracy. W następnym artykule postaramy się wgłębić w sposób działania tego oprogramowania oraz nauczymy Was jego podstawowej obsługi. 

 

Źródła:

https://pl.wikipedia.org/wiki/Wirtualizacja

https://www.atlassian.com/pl/microservices/cloud-computing/containers-vs-vms

https://www.ibm.com/cloud/blog/containers-vs-vms

https://medium.com/platformer-blog/practical-guide-on-writing-a-dockerfile-for-your-application-89376f88b3b5