docker - jak działa

docker - jak działa - Galeria 3

  

Czym dokładnie jest Docker?

Najprościej mówiąc, Docker to platforma do konteneryzacji. Co to znaczy? Wyobraź sobie, że masz problem z pakowaniem i wysyłką aplikacji. Tradycyjnie, gdy tworzysz aplikację, musisz martwić się o to, na jakim systemie operacyjnym będzie działać serwer, jakie biblioteki i wersje oprogramowania są potrzebne, i czy wszystko będzie działać tak samo na komputerze programisty, serwerze testowym, i w końcu na serwerze produkcyjnym. To może być koszmar konfiguracji i problemów!

Docker rozwiązuje ten problem, pozwalając Ci "spakować" aplikację i wszystkie jej zależności w coś, co nazywamy "kontenerem". Kontener jest jak lekki, przenośny "pudełko", które zawiera wszystko, czego aplikacja potrzebuje do działania:

  • Kod aplikacji: Twój program, skrypty.

  • Biblioteki systemowe: Wszystkie potrzebne pliki i programy systemowe (np. dynamiczne biblioteki, narzędzia).

  • Runtime: Środowisko uruchomieniowe (np. Node.js, Java, Python).

  • Konfiguracja: Ustawienia aplikacji i środowiska.

    Obraz: Docker Container Analogy  a shipping container being loaded onto a truck/server

    Docker Container Analogy a shipping container being loaded onto a truck/server

Kontener jest IZOLOWANY. To znaczy, że działa w swoim własnym, zamkniętym środowisku. Nie wchodzi w konflikt z innymi aplikacjami czy systemem operacyjnym hosta. Możesz mieć wiele kontenerów uruchomionych na jednym komputerze, i każdy z nich będzie działał niezależnie, jakby miał swój własny, mały system operacyjny.

Dlaczego Docker jest taki popularny i przydatny? Korzyści z Dockera:

  1. Konsystencja środowiska: "Działa u mnie!" - to częsty problem w programowaniu. Docker eliminuje ten problem. Kontener działa ZAWSZE TAK SAMO, niezależnie od tego, gdzie go uruchomisz: na komputerze deweloperskim, na serwerze testowym, na serwerze produkcyjnym, w chmurze. Dzięki temu aplikacja staje się przenośna i przewidywalna.

  2. Izolacja: Kontenery są izolowane od siebie i od systemu hosta. Problemy w jednym kontenerze nie wpływają na inne. Możesz bezpiecznie eksperymentować i testować, bez ryzyka "popsucia" systemu.

  3. Łatwość konfiguracji i powtarzalność: Konfigurację kontenera definiujesz raz w pliku tekstowym (Dockerfile, o którym za chwilę). Potem możesz odtworzyć to samo środowisko wielokrotnie, w prosty i powtarzalny sposób. To bardzo ułatwia zarządzanie konfiguracją i deployment.

  4. Szybkość i lekkość: Kontenery są lekkie i szybkie w uruchamianiu. Są o wiele szybsze i mniej zasobożerne niż tradycyjne maszyny wirtualne. Możesz uruchamiać kontenery w sekundach.

  5. Skalowalność: Docker ułatwia skalowanie aplikacji. Możesz łatwo uruchamiać wiele kopii kontenera, żeby obsłużyć większy ruch lub obciążenie.

  6. Efektywne wykorzystanie zasobów: Dzięki izolacji i lekkości kontenerów, możesz efektywniej wykorzystać zasoby sprzętowe. Na jednym serwerze możesz uruchomić więcej aplikacji w kontenerach niż w tradycyjnych maszynach wirtualnych.

  7. Uproszczony deployment i CI/CD (Continuous Integration/Continuous Delivery): Docker bardzo ułatwia proces wdrażania aplikacji (deployment). Kontenery idealnie pasują do automatyzacji procesów CI/CD. Możesz zautomatyzować budowanie kontenerów, testowanie, i wdrażanie na serwery.

Kluczowe pojęcia w Dockerze:

  • Obraz Dockera (Docker Image): To jest szablon, przepis na kontener. Obraz zawiera kod aplikacji, biblioteki, runtime, konfigurację – wszystko, co potrzebne do uruchomienia kontenera. Możesz sobie wyobrazić obraz jako "plik instalacyjny" dla kontenera. Obrazy są niemutowalne (niezmienne). Obrazy buduje się na podstawie Dockerfile.

  • Kontener Dockera (Docker Container): To jest uruchomiona instancja obrazu. Kontener to tak jakby "proces" uruchomiony z obrazu. Możesz mieć wiele kontenerów uruchomionych z tego samego obrazu. Kontenery są uruchamiane, zatrzymywane, restartowane. Kontener ma swój własny system plików, sieć, procesy, ale dzieli jądro systemu operacyjnego z hostem.

  • Dockerfile: To jest plik tekstowy, który zawiera instrukcje budowania obrazu Dockera. Definiujesz w nim, jaki system operacyjny bazowy ma być użyty, jakie pakiety zainstalować, jaki kod aplikacji skopiować do obrazu, jakie porty otworzyć, i jakie polecenie uruchomić, gdy kontener wystartuje. Dockerfile jest podstawą do powtarzalnego tworzenia obrazów Dockera.

    Obraz: simple Dockerfile example

    simple Dockerfile example

  • Docker Hub: To jest publiczny rejestr obrazów Dockera. Możesz go traktować jako "sklep" z gotowymi obrazami. Na Docker Hubie znajdziesz ogromną kolekcję oficjalnych obrazów z systemami operacyjnymi (np. Ubuntu, Debian, Alpine), bazami danych (np. PostgreSQL, MySQL, MongoDB), językami programowania (np. Node.js, Python, Java), i popularnymi aplikacjami (np. Nginx, Redis). Możesz pobierać (pull) gotowe obrazy z Docker Huba i używać ich jako bazy do swoich kontenerów, lub jako podstawę do budowania własnych obrazów. Oprócz Docker Hub, istnieją też prywatne rejestry Dockera dla firm.

  • Docker Compose: To narzędzie do definiowania i uruchamiania aplikacji składających się z wielu kontenerów. Czasem aplikacja składa się z wielu współpracujących ze sobą serwisów (np. aplikacja webowa, baza danych, kolejka zadań). Docker Compose pozwala zdefiniować całą taką aplikację w jednym pliku docker-compose.yml i uruchomić ją jednym poleceniem. Dla bardziej zaawansowanych aplikacji, Docker Compose bardzo ułatwia zarządzanie i orkiestrację kontenerów.

Architektura Dockera:

Docker ma architekturę klient-serwer:

  • Docker Client: To jest interfejs linii poleceń (CLI) docker, którego Ty używasz w terminalu. Klient wysyła polecenia do Docker Demona.

  • Docker Daemon (dockerd): To jest serwer Dockera, działający w tle na Twoim systemie. Demon zarządza obrazami, kontenerami, sieciami, wolumenami. Demon odbiera polecenia od klienta, wykonuje je, i zwraca wyniki.

  • Docker Registry: (np. Docker Hub) To jest rejestr obrazów, z którego demon może pobierać obrazy.

    Obraz: Docker Architecture Diagram  showing Docker Client, Docker Daemon, and Docker Registry interacting

    Docker Architecture Diagram showing Docker Client, Docker Daemon, and Docker Registry interacting

Podstawowe komendy Dockera (używane w terminalu Linux):

  • docker pull : Pobiera obraz Dockera z rejestru (np. Docker Hub). Np. docker pull ubuntu:latest pobierze najnowszą wersję obrazu Ubuntu.

  • docker run : Uruchamia nowy kontener z danego obrazu. Np. docker run ubuntu:latest bash uruchomi kontener Ubuntu i otworzy w nim shell Bash. Możesz dodać wiele opcji do docker run, np. mapowanie portów (-p), montowanie wolumenów (-v), zmienne środowiskowe (-e).

  • docker ps: Wyświetla listę uruchomionych kontenerów. Domyślnie pokazuje tylko uruchomione kontenery. docker ps -a pokaże wszystkie kontenery (uruchomione i zatrzymane).

  • docker stop lub : Zatrzymuje uruchomiony kontener. Możesz użyć nazwy kontenera (jeśli ją nadałeś przy uruchamianiu) lub unikalnego ID kontenera (widocznego w docker ps).

  • docker images: Wyświetla listę obrazów Dockera, które są dostępne lokalnie na Twoim komputerze.

  • docker build -t .: Buduje obraz Dockera na podstawie Dockerfile znajdującego się w bieżącym folderze (.). -t nadaje nazwę Twojemu obrazowi.

  • docker-compose up -d: Uruchamia aplikację zdefiniowaną w docker-compose.yml w trybie "detached" (w tle). (Wymaga zainstalowanego Docker Compose).

Docker na Linuxie - instalacja i używanie:

Tak, Docker jest natywnie przeznaczony dla Linuxa i działa na nim najlepiej. Proces instalacji Dockera na Linuxie zależy od dystrybucji, której używasz (Ubuntu, Debian, Fedora, CentOS, etc.). Oficjalna dokumentacja Dockera zawiera szczegółowe instrukcje instalacji dla różnych dystrybucji Linuxa: https://docs.docker.com/engine/install/

Ogólnie kroki instalacji na Linuxie (np. Ubuntu/Debian):

  1. Aktualizacja pakietów systemu: sudo apt-get update

  2. Instalacja zależności Dockera: sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

  3. Dodanie klucza GPG Dockera: (zależnie od dystrybucji)

  4. Dodanie repozytorium Dockera do systemu: (zależnie od dystrybucji)

  5. Instalacja Dockera Engine: sudo apt-get install docker-ce docker-ce-cli containerd.io

  6. Uruchomienie i włączenie Dockera na starcie systemu: sudo systemctl start docker, sudo systemctl enable docker

  7. Sprawdzenie instalacji: docker run hello-world - powinno pobrać i uruchomić prosty kontener testowy "hello-world".

Po instalacji Dockera, możesz używać komend docker w terminalu Linuxa, tak jak opisałem wcześniej.

Przykłady zastosowania Dockera dla web developerów (w tym SvelteKit):

  • Uruchamianie baz danych w kontenerach: Zamiast instalować bazę danych lokalnie na komputerze, możesz uruchomić ją w kontenerze Dockera (np. docker run -d -p 5432:5432 postgres:latest). To jest szybkie, izolowane, i łatwe do powtórzenia.

  • Tworzenie środowisk deweloperskich w kontenerach: Możesz zdefiniować Dockerfile, które skonfiguruje dokładne środowisko deweloperskie dla Twojego projektu (np. konkretna wersja Node.js, pakiety systemowe, narzędzia). Dzięki temu każdy deweloper w zespole ma identyczne środowisko pracy, eliminując problemy "działa u mnie".

  • Deployment aplikacji SvelteKit w kontenerach: Możesz zbudować obraz Dockera zawierający Twoją aplikację SvelteKit (np. po npm run build). Potem możesz łatwo wdrożyć ten kontener na serwer produkcyjny (np. serwer VPS, platformy chmurowe jak AWS, Google Cloud, Azure, Heroku). Docker ułatwia skalowanie i zarządzanie aplikacjami w chmurze.

  • Testowanie aplikacji w izolowanym środowisku: Możesz uruchomić testy automatyczne w kontenerze Dockera, żeby mieć pewność, że testy działają w kontrolowanym i powtarzalnym środowisku.

Podsumowanie:

Docker to niezwykle przydatne narzędzie dla każdego programisty, a szczególnie dla web developerów. Ułatwia tworzenie przenośnych, izolowanych i skalowalnych aplikacji. Na początku może wydawać się trochę skomplikowany, ale warto zainwestować czas w naukę Dockera. Zacznij od instalacji na swoim Linuxie, spróbuj pobrać i uruchomić kilka gotowych obrazów z Docker Huba, a potem spróbuj zbudować swój pierwszy własny obraz na podstawie Dockerfile. Z czasem zobaczysz, jak bardzo Docker może ułatwić Twoją pracę i przyspieszyć proces developmentu i deploymentu.