Na Władcach Sieci rozpoczynamy cykl artykułów poświęconych kontenerom, a zwłaszcza Dockerowi. W niniejszym artykule spróbuję przybliżyć nieco podstawy Dockera, jak się nim posługiwać, jakie są podstawowe komendy oraz omówię zagadnienia dotyczące pracy z kontenerami.

Czym jest Docker i o co w nim chodzi?

Dockera przedstawiono światu w 2013 roku podczas kilkuminutowej konferencji. W ciągu tych kilku lat Docker przeszedł sporo zmian, usprawnień oraz zyskał wiele przydatnych funkcji. Nie da się ukryć, że tempo rozwoju technologii kontenerowej i Dockera galopuje z roku na rok zdobywając coraz większą popularność. Docker to nic innego jak swego rodzaju rozdzielenie, czy separacja aplikacji, od środowiska serwerowego poprzez zamknięcie w osobnych kontenerach. Nie wymagają one aż tak dużego zapotrzebowania na zasoby jak na przykład tradycyjna wirtualizacja KVM, za pomocą której uruchamiamy osobne wirtualne serwery. W tradycyjnej wirtualizacji uruchamiamy wiele systemów na innym systemie (hoście) rezerwując zasoby. W konteneryzacji jest nieco inaczej. Jest to tak zwana parawirtualizacja, która nie jest całkowicie odizolowana od głównego systemu, ponieważ wykorzystuje jego jądro i zasoby.

Dzięki architekturze kontenerowej możemy uruchomić o wiele więcej różnych aplikacji zamkniętych w kontenerach, niż gdybyśmy mieli uruchomić je jako wirtualne instancje serwerów (np. VPS). To co ma plusy, ma też minusy, albowiem nie da się całkowicie wyizolować kontenerów Dockera od głównego systemu. Sam kontener nie jest systemem operacyjnym, a posiada tylko niektóre jego komponenty, wymagane do działania innych aplikacji, bibliotek.

Wyjście Dockera na świat niezwykle ułatwiło proces tworzenia oprogramowania. Każdy programista może na swoim lokalnym komputerze w kilka chwil uruchomić środowisko programistyczne i potrzebne biblioteki, co pozwala pracować nad częścią projektu. Pakując to wszystko do kontenera łatwo go przenieść na inne środowisko z Dockerem i uruchomić niemal jako gotowiec. Docker ułatwia także zarządzania aktualizacjami, wdrożenia i zachowanie jednolitego środowiska dla wszystkich programistów.

Docker posiada dwie wersje: Community Edition i Enterprise Edition. Różnią się one kilkoma szczegółami, ale co do zasady główne funkcjonalności występują w obu wersjach i działają dokładnie w taki sam sposób. Przyjęło się, że środowiska developerskie, testowe powinny pracować w wersji CE, a produkcyjne w wersji EE. Dlaczego? Otóż wersja EE ma dodatkowe wsparcie “jednego dnia”, ma możliwość skanowania obrazów pod kątem podatności, ma także certyfikowane rejestry i kilka dodatkowych funkcjonalności. Jeżeli wasz system jest krytyczny lub powinien zawsze być dostępny (HA) to wersja powinna być zastosowana Enterprise, jednak w przeciwieństwie do większości tego typu projektów z rodziny open source, Docker nie ograniczył podstawowych i bazowych funkcjonalności po wypuszczeniu wersji Enterprise i rozwija obie wersje jednocześnie.

Podstawowe pojęcia i polecenia

W tym artykule poruszamy podstawowe wykorzystanie Dockera w środowisku. Poniżej omówię kilka najbardziej podstawowych i przydatnych poleceń w codziennej pracy.

Wyszukiwanie obrazów

Jedną z największych dziś zalet Docker jest niewątpliwie ilość oraz mnogość obrazów jakie są dostępne i gotowe do użycia. Szukasz gotowego środowiska ze stackiem LAMP? LEMP? Szukasz wydajnego load balansera? A może bazy danych? Wszystko to znajdziesz gotowe na Docker hubie, czyli w miejscu gdzie umieszczane są oficjalne i nieoficjalne obrazy ekosystemów gotowych do użycia. Dla przykładu weźmy pierwszy z brzegu obraz z językiem PHP.

Docker pozwala na wyszukiwanie obrazów na dwa sposoby:

a) wyszukiwanie przez docker hub w wersji przeglądarkowej

b) wyszukiwanie przez konsolowe polecenie search

root@hosterion:~# docker search php | head -n10

W wersji przeglądarkowej oficjalne obrazy oznaczane są dodatkowym polem oznaczonym jako “OFFICIAL IMAGE”, natomiast konsolowe mają dopisek przy zwróconych wynikach.

Warto korzystać z oficjalnych obrazów. Na pewno są one poprawne, sprawdzone pod kątem bezpieczeństwa i nie zawierają w sobie złośliwego kodu. Dodatkowo są sygnowane znaną marką i z pewnością są bezpieczne. Z tych nieoficjalnych nie zalecałbym korzystać na środowiskach jakkolwiek udostępnionych na świat lub zawierających dane.

Kiedy już znaleźliśmy i wybraliśmy swój obraz, konieczne będzie jego pobranie i uruchomienie.

Pobieranie obrazów

Do pobierania służy polecenie “pull”.

docker pull php

Po pobraniu obraz jest zapisany na naszym komputerze/serwerze i jest gotowy do uruchomienia.

Uruchomienie kontenera z obrazem

Aby uruchomić najprościej kontener należy skorzystać z polecenia “run”. Każdy obraz pozwala na dodawanie zmiennych oraz wstępną konfigurację (na przykład ustawienie hasła przy obrazach z bazą danych). Aby zobaczyć jakie zmienne lub konfiguracje obsługuje dany obraz najlepiej przeczytać informacje na stronie repozytorium o danym obrazie.

Jako, że obraz z PHP wymaga do działania jakiejś aplikacji, pobieramy i uruchamiamy, dla potrzeb niniejszego artykułu, bazę danych, np. MySQL.

docker run –name baza_mysql -e MYSQL_ROOT_PASSWORD=TajneHaslo -d mysql

I tym samym kontener został uruchomiony.

Przegląd uruchomionych kontenerów

Aby sprawdzić jakie kontenery mamy aktualnie uruchomione korzystamy z polecenia “docker ps”.

docker ps

Przegląd logów kontenera

Uruchomione kontenery, zwłaszcza te pobierane jako gotowe obrazy z docker hub’a, przekierowują logi do “stdout”. Dzięki temu, jeśli pojawiają się błędy nie musimy oddzielnie chodzić po kontenerach uruchomionych w systemie tylko możemy użyć wygodnego polecenia “docker logs [kontener]” i sprawdzić logi.

docker logs front_nginx

Wszystkie logi są domyślnie składowane jako pliki w formacie json w katalogu na serwerze odpowiadającym kontenerowi.

Nie jest to najwygodniejszy sposób przeglądania logów, ale jest możliwy.

Stworzenie kontenera bez uruchamiania go

Możliwe jest stworzenie kontenera, ale bez uruchamiania go jako serwisu.

docker create

Dzięki temu mamy już gotowy obraz na serwerze, ale nie jest on jest uruchomiony.

Uruchamianie wcześniej stworzonego kontenera

Aby uruchomić już wcześniej stworzony kontener wykorzystujemy polecenie “start”. Co ciekawe, nie ma konieczności wpisywania całego długiego ID kontenera, wystarczy kilka znaków początkowych.

Kontener stworzony w poprzednim punkcie:

40155199a0177dde308c0bddcd5ade1c5a4e23a0c93497928e9a064937b0a9f9

root@hosterion:~# docker start 40155

Początkowe ID się zgadza.

Zatrzymywanie kontenera

Aby zatrzymać działający kontener wykorzystujemy odwrotność polecenia z poprzedniego punktu: “stop”

docker stop 40155199a017

Lista wszystkich obrazów

Aby wyświetlić listę wszystkich obrazów zapisanych na naszym serwerze lub komputerze używamy polecenia “images”.

docker images

Usuwanie kontenerów

Jeśli już nie wykorzystujemy jakiegoś kontenera, można go usunąć, aby zaoszczędzić nieco miejsca na dysku. Kontenery usuwamy za pomocą polecenia “rm”

docker rm 40155199a017

Co ważne, kontener musi być zatrzymany. Nie można usunąć działającego kontenera.

docker container stop 40155199a017

Dopiero teraz możemy usunąć niepotrzebny kontener.

docker rm 40155199a017

Zatrzymanie kontenera natychmiast

Czasami zachodzi potrzeba natychmiastowego zatrzymania kontenera.

docker kill 1dc2256bc41f

Kontener zostaje usunięty bez zbędnej zwłoki i bez wykonywania dodatkowych innych poleceń.

Wejście do kontenera

Uruchomiony kontener można modyfikować, można do niego wejść, trochę tak jakby się logowało do konsoli SSH i mniej więcej tak to wygląda. Logujemy się do terminala tego kontenera i możemy wykonywać polecenia jak dla systemu, na którym bazuje kontener.

Jeśli nasz kontener jest zbudowany na systemie debian to po wejściu do kontenera możemy dorzucić do niego pakiety poprzez zwykłe wykonywanie poleceń takich jak apt-get itd.

root@hosterion:~# docker exec -it front_nginx bash

 Usuwanie wszystkich obrazów / czyszczenie

Docker umożliwia także wyczyszczenie wszystkich nieużywanych obrazów, sieci, wolumenów. Wszystkie obrazy i dane zostaną usunięte.

docker system prune –all

Podsumowanie

Jak widać podstawy pracy z kontenerami nie są zbyt skomplikowane. To co pokazałem dzisiaj to oczywiście zupełne podstawy, ale warto je znać, gdyż ułatwiają na co dzień pracę z Dockerem. W codziennych zadaniach na pewno będziecie te polecenia wykorzystywać bez przerwy. Warto pamiętać o tym, że choć kontenery Dockera mogą przypominać oddzielne systemy operacyjne to takimi nie są i nie powinno się ich w ten sposób traktować.

Domyślnie uruchamiane kontenery współdzielą wszystkie zasoby hosta z innymi kontenerami oraz z hostem głównym, na którym są uruchamiane. Istnieją sposoby na ograniczanie zasobożerności kontenerów i warto z tych rzeczy korzystać, aby nie okazało się, że jeden uruchomiony kontener zajmie większość zasobów i pozostałe nie będą miały ich odpowiednio dużo, aby działać poprawnie.

Zachęcam do odwiedzania Władców Sieci i przeglądania kolejnych artykułów o Dockerze, w których na pewno będziemy poruszać wiele ciekawych zagadnień jak praca z obrazami czy kwestie dotyczące bezpieczeństwa. Warto na pewno poznawać tę technologię jeśli wcześniej nie mieliśmy okazji. Każdy administrator powinien znać przynajmniej podstawy tej technologii, ponieważ prędzej czy później pojawi się w firmie lub w przypadku poszukiwania lepszej pracy podstawowa wiedza na ten temat jest niemal obowiązkowa.