Jak zacząć pracę z Dockerem?

Poznaj Dockera i jego kontenery. Naucz się je uruchamiać, zatrzymywać, usuwać oraz wyświetlać ich listę. Tutaj dowiesz się także skąd brać obrazy dockerowe

Jak zacząć pracę z Dockerem?

Kilka słów o Dockerze

Docker to otwarta platforma, która pozwala rozwijać, dostarczać i uruchamiać aplikacje niezależnie od infrastruktury. Co to w praktyce oznacza? Aplikacje dostarczane przy pomocy Dockera można uruchomić niezależnie od tego czy np. pracujesz na Ubuntu, CentOS czy Debianie (są to różne dystrybucje Linuxa). Nie ma to wpływu na działanie aplikacji. Wystarczy, że na danym systemie operacyjnym zainstalujesz Dockera i już jesteś gotowy do uruchamiania dockerowych aplikacji. Darmową Wirtualną Maszynę wraz ze skonfigurowanym Dockerem możesz pobrać tutaj.

Metodologie Dockera dotyczące dostarczania, testowania i szybkiego deployowania (wdrażania) kodu pozwalają drastycznie zredukować czas pomiędzy tworzeniem aplikacji a uruchomieniem jej na produkcji, czyli w realnym środowisku.

Logiem Dockera jest wieloryb transportujący kontenery. Otwarta społeczność Dockera wybrała dla niego imię w ankiecie: Moby Dock. Jest to nawiązanie do Moby Dicka, czyli wieloryba z powieści Hermana Melville'a.

Moby Dock: logo Dockera

Prawdziwą maskotką Dockera nie jest tak naprawdę wieloryb. Jest nią żółw o imieniu Gordon, który posiada nawet swój własny profil na Twitterze! Spędza w biurze Dockera w San Francisco kilka dni w tygodniu. Na początku tworzenia Dockera Gordon był tak mały, że gdy położyło się go obok laptopa, wyglądało to jakby na nim pracował. Obecnie jest tak duży, że potrzeba dwojga ludzi, by można było go przenieść.

Listopad 2014. Żółw o imieniu Gordon: prawdziwa maskotka Dockera

Kontenery

Moby Dock nie bez powodu transportuje kontenery! Docker daje możliwość pakowania i uruchamiania aplikacji w izolowanym środowisku, którym jest dockerowy kontener (ang. Docker Container). Dzięki izolacji możesz uruchamiać wiele kontenerów równocześnie na danym hoście. Hostem w tym przypadku jest system operacyjny, na którym zainstalowany jest Docker.

Kontenery są lekkie, ponieważ nie są obciążone dodatkowym Hipernadzorcą (ang. Hypervisor), czyli narzędziem zarządzającym procesami wirtualizacji. Kontenery działają bezpośrednio na jądrze maszyny hosta. Oznacza to, że możesz uruchomić ich więcej na danym komputerze niż gdybyś próbował osiągnąć to samo przy pomocy wirtualnych maszyn. Możesz nawet uruchamiać kontenery Dockera wewnątrz wirtualnej maszyny i zademonstruje Ci to już za chwilę 🙃

Docker Hub i Obrazy

Docker Hub to repozytorium obrazów dockerowych (ang. Docker Image). Jest to strona, na której można wyszukiwać różne aplikacje, które zostały już skonteneryzowane. Oznacza to, że są one gotowe do uruchomienia w kontenerze. Na Docker Hub większość z nich posiada gotowe instrukcje jak je uruchomić.

Strona Docker Hub, gdzie możesz wyszukiwać obrazy skonteneryzowanych aplikacji

Jeżeli programowanie obiektowe nie jest Ci obce to wiesz już czym są klasy i czym są obiekty. Obraz dokerowy można porównać do klasy: jest to taki szablon, z którego coś tworzymy. Kontener z kolei można porównać do obiektu: obiekt jest uruchomioną instancją klasy, zaś kontener jest uruchomioną instancją obrazu.

By używać Dockera nie musisz znać żadnego języka programowania. W związku z tym jeżeli nie wiesz czym jest programowanie obiektowe, to wyobraź sobie że na kartce tworzysz projekt domu. Taki projekt to twój obraz. Teraz wyobraź sobie, że budujesz na podstawie tego projektu dom. Właśnie ten dom to twój kontener, który został stworzony na podstawie Twojego projektu (obrazu). Można by powiedzieć, że zbudowany dom jest instancją projektu tak jak kontener jest instancją obrazu.

ZAPAMIĘTAJ!
Nie można uruchamiać losowo wybranych kontenerów! Hakerzy mogą umieszczać na swoich obrazach narzędzia do kopania kryptowaluty. Uruchamiaj tylko oficjalne obrazy lub takie, którym ufasz (znasz osobę/firmę je dostarczające).

Jak odróżnić obraz oficjalny od nieoficjalnego? Obrazy oficjalne na Docker Hub posiadają oznaczenie Official Image lub Verified Publisher.
Przykład oficjalnego obrazu popularnej bazy danych MySQL z oznaczeniem Official Image
Przykład nieoficjalnego obrazu popularnej bazy danych MySQL: brak oznaczenia Official Image

Wyświetlanie listy kontenerów

Listę kontenerów możemy wyświetlić komendą docker container ls:

Opis komendy docker container ls służącej do wyświetlania listy kontenerów. Część komendy w [nawiasach kwadratowych] jest opcjonalna

Samo docker container ls wyświetla listę tylko uruchomionych kontenerów. Te, które zakończyły swoje zadanie nie zostaną wyświetlone. Natomiast docker container ls -a wyświetli wszystkie kontenery. Gdybyśmy teraz spróbowali wyświetlić listę kontenerów, byłaby ona pusta. Jeszcze nie uruchomiliśmy żadnego kontenera.

Wyświetlenie listy wszystkich kontenerów: obecnie jest pusta

Uruchamianie kontenerów

Kontenery możemy uruchamiać komendą docker container run:

Opis komendy docker container run służącej do uruchamiania kontenerów

W takim razie przejdźmy do praktyki. Spróbujmy uruchomić następującą komendę uruchamiającą kontener z obrazu nginx (popularnego serwera WWW oraz serwera proxy):

docker container run nginx
Uruchomienie kontenera nginx

Komunikat Unable to find image 'nginx:latest' locally mówi nam, że obraz nie został znaleziony lokalnie na naszej Wirtualnej Maszynie w związku z tym rozpoczyna się pobieranie tego obrazu z Docker Hub. Zauważ, że pobrana wersja jest oznaczona jako latest. Jeżeli nie zdefiniujemy wersji (tagu) do pobrania, Docker automatycznie będzie pobierał najnowszą dostępną wersję, czyli właśnie tą oznaczoną tagiem latest. Dobrą praktyką jest wskazywanie dokładnej wersji obrazu. Dzięki temu unikniemy sytuacji, w której wersja obrazu zostanie zaktualizowana bez naszej wiedzy. Może się zdarzyć, że po aktualizacji coś przestanie działać lub zacznie działać inaczej.

Komunikaty zaczynające się od /docker-entrypoint.sh i następne to logi kontenera. Logi te to tak naprawdę logi nginx przekierowane do standardowego strumienia wyjścia STDOUT (ang. Standard Output) i standardowego strumienia błędów STDERR (ang. Standard Error). Logi zawierają wiadomości dotyczące działania aplikacji (kierowane do STDOUT) oraz wiadomości dotyczące błędów w niej występujących (kierowane do STDERR).

Kolejną rzeczą, na którą trzeba zwrócić uwagę jest fakt, że komenda nie kończy się. Czemu tak się dzieje? Jest to spowodowane brakiem flagi --detach lub -d w skróconej wersji. Flaga ta sprawia, że kontener uruchamia się w tle, dzięki czemu możemy wpisywać kolejne komendy w terminalu.

Kliknijmy więc CTRL + C by zakończyć działanie komendy i tym samym zakończyć także pracę kontenera. Po wyświetleniu listy wszystkich kontenerów zobaczymy kontener o nazwie charming_nightingale w statusie Exited. Jednak moment! Nie nadaliśmy nazwy naszemu kontenerowi, więc jak to się stało, że jednak tę nazwę posiada? Jeżeli nie nadamy nazwy naszemu kontenerowi przy pomocy flagi --name, Docker sam wygeneruje losową nazwę używając do tego przymiotnika, znaku podkreślenia oraz nazwiska jednego ze znanych hakerów lub naukowców. Lista uruchomionych kontenerów jest pusta, ponieważ obecnie takich nie mamy.

Wyświetlenie listy wszystkich kontenerów (na liście obecny jest 1 zatrzymany kontener) oraz listy uruchomionych kontenerów (pusta)

Wykorzystajmy w takim razie wiedzę, którą przed chwilą zdobyliśmy i odpalmy polecenie:

docker container run --name ngx -d nginx:1.19.1
Uruchomienie kontenera o nazwie ngx w tle z obrazu o nazwie nginx w wersji 1.19.1

Widzimy, że kolejny obraz został dodany do naszego lokalnego repozytorium obrazów, tym razem z tagiem 1.19.1. Komenda się zakończyła a kontener działa w tle. Po wyświetleniu listy wszystkich kontenerów zobaczymy dodatkowo nasz kontener z nazwą ngx. Podobnie po wyświetleniu listy uruchomionych kontenerów.

Wyświetlenie listy wszystkich kontenerów (na liście obecne są 2 kontenery, jeden uruchomiony, drugi zatrzymany) oraz listy uruchomionych kontenerów (jeden widoczny)

Jednak otwierając w przeglądarce na Wirtualce adres http://localhost otrzymamy komunikat Nie udało się nazwiązać połączenia. Nie wyświetla się ekran powitalny nginx. Przyczyna jest prosta, nie opublikowaliśmy portu kontenera dla hosta, czyli naszej Wirtualki. Kontener działa w izolacji od hosta dlatego domyślnie nie mamy do niego dostępu. Zrobić to możemy przy pomocy flagi --publish lub -p w skróconej wersji podczas uruchamiania kontenera.

Opis flagi --publish dla komendy docker container run służącej do publikowania portu kontenera

We fladze --publish musimy wskazać port hosta oraz port kontenera. Port hosta wybieramy sami z przedziału 1-65535 (nie może być wcześniej zajęty), natomiast port kontenera jest zdefiniowany domyślnie. Port kontenera to tak naprawdę domyślny port nginx, na którym jest uruchomiony.

docker container run --name ngx2 -d -p 80:80 nginx:1.19.1

Możemy zatem uruchomić powyższą komendę i przejść w Wirtualce jeszcze raz pod adres http://localhost, gdzie zobaczymy ekran powitalny nginx. Port 80 to domyślny port protokołu HTTP. W związku z tym nie trzeba go podawać jawnie w adresie internetowym.

Ekran powitalny wyświetlony z nginx uruchomionego na kontenerze
Mapowanie portu hosta na port kontenera można również zobaczyć po wyświetleniu listy wszystkich kontenerów

Zatrzymywanie i usuwanie kontenerów

Kontenery możemy zatrzymać komendą docker container stop:

Opis komendy docker container stop służącej do zatrzymywania kontenerów

Zatrzymane kontenery można potem usunąć komendą docker container rm:

Opis komendy docker container rm służącej do usuwania kontenerów

Warto pamiętać o tym, że usuwać można tylko zatrzymane wcześniej kontenery. Jeżeli spróbujemy usunąć uruchomiony kontener, otrzymamy komunikat błędu.

ZAPAMIĘTAJ!
Usuwać można tylko zatrzymane wcześniej kontenery. Jeżeli spróbujemy usunąć uruchomiony kontener, otrzymamy komunikat błędu.

Podsumowanie

Post jest krótkim wstępem do technologii Dockera. Skupiłem się w nim głównie na stronie praktycznej. Dzięki temu zobaczyłeś jak wykorzystywać podstawowe funkcjonalności Dockera: uruchamianie, zatrzymywanie, usuwanie i wyświetlanie listy kontenerów.

Jest to znacznie szybsze i wygodniejsze niż instalowanie aplikacji bezpośrednio na Wirtualnej Maszynie. Odpalając jedną komendę jesteśmy w stanie uruchomić aplikację od razu, bez przechodzenia przez proces instalacji. Co więcej, nie musimy instalować żadnych zależności, które są wymagane do działania aplikacji. Przykładowo Apache Tomcat, czyli serwer aplikacji internetowych wymaga instalacji Javy do działania. Zależności danej aplikacji są już obecne w kontenerze, czyli wymagana Java będzie już zainstalowana na kontenerze z Tomcatem. Usunięcie aplikacji dokerowej jest równie proste co uruchomienie.

Wiedza, którą tu przekazałem pozwoli Ci zacząć pracę z Dockerem. Funkcjonalności Dockera jest oczywiście o wiele więcej i o każdej z nich można napisać wiele. W związku z tym kolejnych informacji możesz spodziewać się w następnych postach.

Liczba komentarzy:

Zaloguj się lub dołącz do społeczności Javowców, aby móc uczestniczyć w dyskusji 🙂