­Docker – jak do tego podejść?

Łatwo jest znaleźć w internecie informacje na temat Dockera. Można się dowiedzieć, jak działa, w jaki sposób uruchomić pierwszą aplikację, że jest trochę jak muzeum, bo ma obrazy, że jest wspaniały, ma aurę lekkiej tajemniczości i że różni się od maszyn wirtualnych.

Jednak większość z tych informacji, nawet jeśli jest naprawdę rzetelna, może wydawać się dość skomplikowana. Jednocześnie większość materiałów poprzestaje na czystej teorii bądź na praktyce, w której właściwie nie mamy specjalnego punktu wyjścia. Słowem: łap instrukcje i idź zrób. Bez wytłumaczenia, co właściwie się dzieje.

Jeszcze słowem wstępu: nie opisuję konteneryzacji jako całości zagadnienia. Skupię się na Dockerze, choć inne rozwiązania są stosunkowo podobne do siebie. Pominę także temat orkiestracji kontenerów.

Daj przepisać, ale tak, żeby facetka się nie zorientowała

Teoria

Jak wspomniałem w innym wpisie, konteneryzacja różni się nieco od wirtualizacji. Różnica może wydawać się dość kosmetyczna, ostatecznie i tak uruchamiamy jakąś aplikację, a czy pomiędzy siedzi system operacyjny czy też nie – who cares?

No mnie cares. I Ciebie chyba też, skoro to czytasz.

Aby w jakikolwiek sposób rozmawiać o kontenerach, warto zobaczyć, jak właściwie wygląda wirtualizacja. Co powoduje, że rozwiązania takie jak Docker na dobre zadomowiły się w wielu centrach danych?

Przeanalizuj schemat powyżej. Na razie różnice pomiędzy hypervisorami typu I i II są pomijalne i zamykają się w punkcie 2 schematu dotyczącego wirtualizacji. Ot, w jednym przypadku będzie siedziało Ubuntu a w innym Vmware ESXi. Nie jest to do końca prawidłowe stwierdzenie, ale daleko idące uproszczenie.

Jeśli już to zauważyłeś i pomyślałeś jak cebulak, brawo. Warstwy takie jak: system operacyjny (rozumiany jako całość, z kernelem włącznie) jakieś biblioteki i takie tam powtarzają się. Jeśli nie czujesz jeszcze cebuli, to pomyśl, że w zależności od tego, ile uruchomisz wirtualek, tyle razy ładujesz w swoje zasoby sprzętowe całe systemy operacyjne, czyli często to samo, co już masz. Trochę śmierdzi to marnowaniem zasobów, nie?

Oczywiście, jeśli mieszasz różne systemy operacyjne, to nie masz wyjścia, wirtualka i heja. Ale siedząc na Linuksie, po cholerę odpalać po raz kolejny coś, co już pracuje i robi to całkiem dobrze?

Nie wiem jak Ty, ale ja wolałbym ten RAM przepierdolić na więcej kart w przeglądarce.

Teraz przypatrz się dokładnie schematowi powyżej: ktoś się nie bał i… a nie, czekaj. Po prostu nie zabrał

Nie trzeba dokładać do pieca, aby kaloryfer mocniej grzał, czasami wystarczy nie zastawiać grzejnika kanapą. Delikatna analogia do pewnych programów socjalnych jest przypadkowa i niezamierzona.

Taki kontener ma w pompie, na jakiej dystrybucji (i trochę systemie) siedzi. Tak długo, jak pod Dockerem jest jakiś Linux, tak długo nie interesuje go to, ma swoje biblioteki, ma swoje aplikacje, ma swoje zabawki i ma swoje kredki. Przekłada się to na pewną zaletę: raz dobrze utworzony obraz aplikacji będzie działać tak samo dobrze na innych maszynach.

Albo tak samo źle. Jednak przekłada się to na dość powtarzalną diagnostykę, gdzie można skupić się na diagnozowaniu aplikacji jako takiej, zamiast na diagnozowaniu całego środowiska.

Przenośność jest znacznie większa, niż maszyn wirtualnych, do tego przez fakt olewania takich plebejskich tematów, jak jądro systemu czy sterowniki powoduje dość sporą oszczędność pamięci. I to zarówno RAM, jak i tej na dysku.

Podpierając się powyższymi schematami można dojść do wniosku, że powtarzające się elementy zostały po prostu wykorzystane ponownie przez inny twór.

Jemioła? Też jest pewnego rodzaju kontener. Spójrz: drzewo siorbie wodę i składniki mineralne (kernel i obsługa sprzętu) a roślinka pasożytująca na nim zajmuje się rośnięciem i rozmnażaniem (biblioteki i, ehkem, aplikacja). Jemioła to kontener. Czego nie rozumiesz?

Warto wytłumaczyć jeszcze jedną kwestię. Jak pewnie zdążyłeś się zorientować, Docker posiada swoje instalatory dla różnych systemów operacyjnych, nie tylko Linux, a wspomniałem powyżej, że to idea konteneryzacji odbywa się w ramach jednej rodziny systemów operacyjnych. Twórcy wybrnęli z tego w inny sposób, bo instalując Dockera w takim, proszę ja ciebie szwagier, Windowsie, tworzona jest pod spodem maszyna wirtualna z Linuksem. Jest ona dla użytkownika całkowicie transparentna. Jednak żaden masochista nie odpala Dockera pod Windowsem w ramach produkcji. W ramach labowania spoko, ale jak chcesz na tym coś robić na stałe, zainstaluj sobie na przykład Debiana czy inną Fedorę.

Taki kontener w dużej mierze zachowuje się jak oddzielny komputer, może mieć swoje katalogi (współdzielone także, a to super ułatwienie!), swoją powłokę (bash!), przechowuje swoje logi jak każdy inny Linux (/var/log często przeglądanym jest) jednocześnie mając swoje charakterystyczne ułatwienia (dedykowane narzędzia do przeglądania logów, mechanizmy podpinania się do powłoki kontenera, humanitarne kopiowanie plików i takie tam).

Praktyka

Podpierając się poprzednim wpisem, możesz wykorzystać maszynę z Debianem. Po prostu w razie potrzeby przekierujesz sobie dodatkowe porty związane z uruchamianą aplikacją.

Możesz także wykorzystać Dockera pod Windowsem, MacOS czy czymkolwiek innym. Czasami różnice będą dotyczyły sposobu uruchamiania pewnych rzeczy, ale składowe są te same. Opierać się będę na Debianie.

Ja posłużę się jakąś podręczną wirtualką z Debianem.

Instalacja Dockera

Instalacja składa się z kilku kroków:

  1. Dodanie kluczy, certów i innego tałtajstwa dla repozytorium ze świeżutką wersją Dockera (Debian i domyślnie świeże wersje pakietów, he he he).
  2. Dodanie repozytorium z Dockerem
  3. Instalacja Dockera wraz z Docker Compose i resztą przydatnej świty
  4. Dodanie użytkownika do grupy docker

Całość opiera się na dwóch źródłach. Pierwszym jest oficjalna instrukcja, drugim skrypt, który udostępniam w całości w swoim publicznym repozytorium Git Hub, przygotowany w ramach ułatwiania sobie życia.

Oczywiście, znajdzie się ktoś, kto zrobi to lepiej i w to nie wątpię. Ba, zawsze ten następny robi lepiej niż poprzedni.

Nic nie stoi też na przeszkodzie, aby skrypt w radosny sposób uruchomić bez czytania całej instrukcji. Wybór pozostawiam we własnym zakresie, do niczego nie zmuszam, ale jeśli chcesz uniknąć problemów z transferem w torrentach to jest to jedyny słuszny sposób na uniknięcie takich problemów.

Jest jeszcze jedna różnica pomiędzy skryptem a instrukcją. W skrypcie wyciszałem większość outputów użytych programów, stąd w instrukcji nie znajdziesz apt -qq a w skrypcie i owszem. Zależało mi na czytelności.

1. Klucze i inne certyfikaty

Prześledźmy zatem poniższe kroki. Zaloguj się jako root. Najpierw musimy dokonać drobnej aktualizacji listy pakietów dostępnych w repo:

apt-get update

następnie instalacja ca-certificates i curl (curl to potężne narzędzie, poznasz je później!):

apt-get install ca-certificates curl

a potem tworzenie dodatkowych katalogów, nadanie im uprawnień i dodanie certyfikatów (nuda, ale potrzebne, aby zachować trochę porządku w systemie):

install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc

chmod a+r /etc/apt/keyrings/docker.asc

Rozumiesz teraz, dlaczego to sobie oskryptowałem? 🙂

2. Dodanie repozytorium

Musimy skądś pobrać świeżutkiego Dockera, nie? Zatem dodajmy źródło, z którego można to pobrać. W świecie Linuksa nazywa się to repozytorium i pewnie spotkałeś z takim czymś wcześniej. Wszak czym innym są sklepy z aplikacjami pokroju AppStore, Google Play czy też Microsoft Store?

Procedura zamyka się w dwóch krokach: dodaj repo i zaktualizuj system.

Dodajemy repo:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

i aktualizujemy się, niech zaciągnie listy z nowymi pakietami:

apt-get update

3. Instalacja Dockera wraz z przydasiami

Spójrz na poniższe polecenie:

apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Tak naprawdę oprócz samego Dockera zmuszam Cię do instalacji także Docker Compose. Wyjaśnię Ci co mną kieruje.

Wyobraź sobie, że pewnego czerwcowego poranka wpadasz na pomysł ale bym sobie uruchomił stronkę jakąś fajną taką. Więc szukając rozwiązania, znajdujesz bloga takiego jak ten, robisz sobie dockerka i kopiujesz jakieś rozwiązanie jak idiota z internetu, co wygląda tak:

docker run --name mysql-db -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpressuser -e MYSQL_PASSWORD=wordpresspassword -d mysql:latest

docker run --name redis-cache -d redis:latest

docker run --name wordpress-app --link mysql-db:mysql --link redis-cache:redis -p 8080:80 -e WORDPRESS_DB_HOST=mysql-db -e WORDPRESS_DB_USER=wordpressuser -e WORDPRESS_DB_PASSWORD=wordpresspassword -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_REDIS_HOST=redis -d wordpress:latest

No sam przyznasz, że to czytelne w prącie i w dostosowywaniu wygodne jak pisanie tekstu w wordzie w rękawicach bokserskich. Na statku. W sztormie. Bez ekranu i jednej ręki. Po ciemku i tyłem do klawiszy. Do tego po niemiecku cyrylicą.

Ludzkość, z racji tendencji do bycia leniwymi parówami, wymyśliła eleganckie rozwiązanie, które jest czytelne, łatwe do kopiowania, łatwe do personalizacji, łatwe w podpierdalaniu koledze i generalnie pomagające uniknąć pomyłek (no znajdź tam sobie literówkę, czas start. A zrobisz, oj zrobisz…). Ej ziomki, mamy taki format plików jak YAML, ładny taki, czytelny mocno. No i pierwszego dnia zrobili, a z wtorku na niedzielę pili piwo i się śmiali z niekorzystających. Spójrz na poniższy docker-compose.yml, który uruchamia dokładnie do samo tylko czytelniej:

version: '3.9'

services:
  mysql:
    image: mysql:latest
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpressuser
      MYSQL_PASSWORD: wordpresspassword
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - wordpress-network

  redis:
    image: redis:latest
    container_name: redis-cache
    networks:
      - wordpress-network

  wordpress:
    image: wordpress:latest
    container_name: wordpress-app
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: mysql-db
      WORDPRESS_DB_USER: wordpressuser
      WORDPRESS_DB_PASSWORD: wordpresspassword
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_REDIS_HOST: redis
    networks:
      - wordpress-network

networks:
  wordpress-network:

volumes:
  mysql-data:

Widzisz? Nie, że trochę prościej i ładniej? Wracamy do instalacji Dockera. Choć w sumie jest już zainstalowany.

4. Dodanie użytkownika do grupy docker

Nie jest to niezbędny punkt programu, jeśli go pominiesz, to zwyczajnie cała konteneryzacja będzie możliwa z konta root. Ale wspominałem coś o tendencji do bycia leniwymi parówami. Poza tym ciągłe przesiadywanie na takim koncie nie jest dobrym pomysłem.

Pamiętasz, gdy instalowałeś system operacyjny na wirtualce? Przypomnij sobie, jaką nazwę użytkownika tam stworzyłeś. Podpowiem, możesz to sprawdzić poleceniem:

ls /home/

i nazwy katalogów domowych użytkowników powinny coś Ci wskazać.

Powinny, nie znaczy, że pomoże

Zatem:

usermod -aG docker nazwauzytkownika

I możemy działać.

Co zatem mamy?

Mamy skonfigurowane środowisko, które spokojnie może służyć do uruchamiania aplikacji. Nie jest już wymagany root aby uruchomić kontener i będziesz mógł używać aktualnych wersji Dockera nawet w Debianie, który ma tendencję do używania paczek datowanych gdzieś na okolice roku 1410.

Tak z pewnością wygląda wprowadzanie nowych pakietów do Debiana. Złośliwość niezamierzona.

W następnych wpisach pokażę Ci, jak wykorzystać te narzędzia, aby uruchomić pierwszą serio działającą aplikację, jak to diagnozować i w jaki sposób rozwiązywać problemy, na które możesz się natknąć.


0 komentarzy

Dodaj komentarz

Symbol zastępczy awatara

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *