Docker to narzędzie open source stworzone, aby ułatwić rozwój, wdrażanie i uruchamianie programów.
Odbywa się to poprzez stworzenie kontenera reprezentującego nasz program. Proces ten nazywa się konteneryzacją. Docker swoją niesamowitą popularność zawdzięcza obecnemu trendowi wdrażania swoich rozwiązań w chmurze obliczeniowej. Konteneryzacja przyśpiesza i ułatwia ten proces, a lekkość kontenerów pozwala wydajnie korzystać z chmurowych usług.
Czym jest kontener w kontekście oprogramowania?
Kontener to pakiet składający się z aplikacji wraz ze wszystkimi zależnościami koniecznymi do jej uruchamiania: kod naszego programu, środowisko uruchomieniowe, biblioteki, które wykorzystujemy, lokalne bazy danych oraz pliki konfiguracyjne. Docker jest jednym z wielu narzędzi umożliwiających tworzenie kontenerów, natomiast to on zdobył największą popularność.
Kontenery powstałe za pomocą jednego narzędzia są ustandaryzowane, dzięki czemu łatwo można je uruchamiać w różnych środowiskach. Mogą to być zwykłe komputery bądź centra danych serwisów chmurowych takich jak Amazon Web Services, Google Cloud, Microsoft Azure czy Oracle Cloud.
Jaki to ma związek z kontenerowcami?
Nazwa została zaczerpnięta od kontenerów, zazwyczaj metalowych skrzyń o zunifikowanych wymiarach, służących do transportu. Idea przewożenia towarów w skrzyniach nie jest czymś specjalnie innowacyjnym, natomiast pochylmy się nad tym, co dało ustandaryzowanie ich rozmiarów. Jest to uznawane za jedno z najbardziej wpływowych osiągnieć XX wieku obok radia, samochodów oraz Internetu. Dzięki standardowym rozmiarom możliwe stało się stworzenie infrastruktury dopasowanej do kontenerów na całym świecie: kontenerowce, ciężarówki, pociągi oraz dźwigi kontenerowe. Efektywność takiego rozwiązania sprawiła, że cała nasza planeta stała się globalną gospodarką.
Co to ma wspólnego z oprogramowaniem? Prawdopodobnie, nawet jeśli nie zajmujesz się programowaniem, ale korzystasz z komputera, spotkałeś_aś się z sytuacją, gdy nie mogłeś_aś uruchomić lub zainstalować jakiegoś programu i usłyszałeś_aś od kogoś, komu się udało zdanie pod tytułem: „U mnie działa”. Komputer komputerowi nie równy i dwa różne środowiska mogą się różnić na setkach różnych płaszczyzn. Spójrzmy na same systemy operacyjne. Są trzy główne kategorie: Windows, Mac OS oraz Linux. W ramach każdej kategorii istnieją dziesiątki różnych systemów i każdy z nich może występować w różnej wersji. W tych wszystkich zależnościach bez wątpienia można się pogubić. Tak jak standardowy rozmiar kontenerów ułatwił przemieszczanie przedmiotów na naszej planecie, tak Docker i inne tego typu narzędzia ułatwiają przenoszenia naszych aplikacji.
Kontenery a maszyny wirtualne
Możliwe, że termin „maszyna wirtualna” nie jest Ci obcy. Jest to program, który emuluje działanie komputera. Dzięki temu, na przykład jesteśmy w stanie na komputerze z systemem operacyjnym Windows stworzyć maszynę wirtualną z innym systemem operacyjnym i korzystać z jego funkcjonalności. Maszyny wirtualne również wykorzystywano i dalej wykorzystuje się do zapewnienia przenośności oprogramowania. Definiując taką maszynę specjalnie dopasowaną do naszego programu mamy gwarancję, że wykorzystując ją uda się uruchomić naszą aplikacje. Posiadają one wiele cech wspólnych z kontenerami natomiast istnieją między nimi istotne różnice:
- rozmiar: w przypadku maszyn jest on liczony zazwyczaj w gigabajtach, natomiast w przypadku kontenerów zwykle mówimy o megabajtach;
- maszyna wirtualna emuluje cały komputer, czyli również hardware, natomiast kontenery emulują jedynie system operacyjny. Powoduje to, że kontenery są zazwyczaj szybsze jeśli chodzi o działanie oraz czas uruchomienia.
Docker Compose
Istotnym elementem Dockera jest Docker Compose, który umożliwia uruchomianie multi-kontenerowych aplikacji. Co to właściwie znaczy? Obecnie dominującym stylem tworzenia architektury aplikacji komputerowych jest tzw. architektura mikroserwisów. W ramach tego stylu nasza aplikacja jest zbiorem połączonych ze sobą niewielkich mikroserwisów, czyli komponentów naszej aplikacji, które dostarczają określoną funkcjonalność niezależnie od pozostałych komponentów. Takimi komponentami w przypadku aplikacji internetowej mogą być, na przykład:
- baza danych;
- serwer;
- aplikacja kliencka (interfejs aplikacji).
Na diagramie poniżej znajduję się przykład właśnie takiej architektury. Użytkownik aplikacji, skonstruowanej w ten sposób, będzie z niej korzystał za pomocą aplikacji klienckiej, która zapewni wygodny i przyjazny interfejs. Sama aplikacja kliencka komunikuje się z serwerem, a serwer, aby obsłużyć pewne zapytania komunikuje się z bazą danych.
Każdy taki mikroserwis możemy za pomocą Dockera spakować w kontener, natomiast samo to wiązałoby się z koniecznością uruchamiania każdego z kontenerów oddzielnie oraz niezależnego konfigurowania na jakich kanałach nasz mikroserwis będzie się komunikował z innymi. Właśnie te problemy adresuje Docker Compose. Pozwala nam skonfigurować w jednym miejscu wszystkie kontenery, które składają się na naszą aplikację. Dodatkowo możemy je wszystkie na raz uruchomić za pomocą jednej komendy.
Docker a MLOPS
Integracja Dockera z praktykami MLOps otwiera nowe możliwości dla zarządzania cyklem życia modeli uczenia maszynowego. Używając konteneryzacji, zespoły mogą standaryzować środowiska dla modeli ML, co usprawnia ich rozwój, wdrażanie i skalowanie. Docker, dzięki swojej elastyczności i wsparciu dla architektury mikroserwisów, staje się kluczowym elementem w budowaniu efektywnych procesów MLOps, umożliwiając szybką iterację i ciągłą integrację/dostawę modeli ML. Ten sposób wykorzystania kontenerów zwiększa spójność między środowiskami deweloperskimi i produkcyjnymi, co jest fundamentem skutecznego wdrażania praktyk MLOps.
Jeżeli jesteś zainteresowany_a pracą z najpopularniejszym narzędziem do konteneryzacji, zapoznaj się z naszym szkoleniem Docker dla początkujących!