
Docker to narzędzie open source stworzone aby ułatwić rozwój, wdrażanie i uruchamianie programów.
Odbywa się to poprzez stworzeniem kontenera reprezentującego nasz program – proces ten nazywa się konteneryzacją. Docker swoją niesamowitą popularność zawdzięcza obecnemu trendowi organizacji do przechodzenia na wdrażanie 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 uruchomiania: 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 zdobył on 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ś się z sytuacją gdy nie mogłeś uruchomić/zainstalować jakiegoś programu i usłyszałeś 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, natomiast 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. Zdecydowanie w tych wszystkich zależnościach można się pogubić i 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órym 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ą istotne między nimi różnice.
- Rozmiar: w przypadku maszyn jest on liczony zazwyczaj w gigabajtach, natomiast w przypadku kontenerów zwykle mówimy o megabajtach.
- Maszyna wirtualne 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ść w 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 korzystaj 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ą aplikacje. Dodatkowo możemy je wszystkie na raz uruchomić za pomocą jednej komendy.