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

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.

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ść.

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ć.

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.
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.


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

docker container ls
służącej do wyświetlania listy kontenerów. Część komendy w [nawiasach kwadratowych] jest opcjonalnaSamo 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.

Uruchamianie kontenerów
Kontenery możemy uruchamiać komendą docker container run
:

docker container run
służącej do uruchamiania kontenerówW 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

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.

Wykorzystajmy w takim razie wiedzę, którą przed chwilą zdobyliśmy i odpalmy polecenie:
docker container run --name ngx -d nginx:1.19.1

ngx
w tle z obrazu o nazwie nginx
w wersji 1.19.1Widzimy, ż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.

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.

--publish
dla komendy docker container run
służącej do publikowania portu konteneraWe 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.

nginx
uruchomionego na kontenerze
Zatrzymywanie i usuwanie kontenerów
Kontenery możemy zatrzymać komendą docker container stop
:

docker container stop
służącej do zatrzymywania kontenerówZatrzymane kontenery można potem usunąć komendą docker container rm
:

docker container rm
służącej do usuwania kontenerówWarto pamiętać o tym, że usuwać można tylko zatrzymane wcześniej kontenery. Jeżeli spróbujemy usunąć uruchomiony kontener, otrzymamy komunikat błędu.
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 🙂