Docker to obecnie niezbędne narzędzie dla większości programistów. Według badań Stack Overflow, Docker jest technologią, której znajomość jest najbardziej pożądana przez developerów.
Znajomość Dockera przydaje się w wielu rozwiązaniach chmurowych m.in.:
- Kubernetes,
- Azure App Services,
- Amazon Elastic Container Service.
I właśnie z tego powodu w serii artykułów przybliżę Wam to narzędzie.
Docker – czym jest i w jaki sposób mogą go wykorzystać programiści?
Aby móc wykorzystać potencjał narzędzia, warto je dobrze poznać. Odpowiedzmy sobie najpierw na pytanie, czym właściwie jest Docker, kontener i obrazy, używane przez kontenery.
Docker jest obecnie jednym z kilku narzędzi, które uruchamiają kontenery. Inne narzędzia o tej samej funkcji to np.: Containerd lub CRI-O. Dzięki kontenerom możemy aktywować dodatkowy, odizolowany system operacyjny z gotową do działania aplikacją. Kontener nie emuluje całej warstwy sprzętowej – dzięki niemu otrzymujemy pełnoprawny system operacyjny wraz ze zdefiniowanym procesem aplikacji. Nie zużywa też takiej ilości zasobów, co wirtualizacja.
Kontenery Dockera działają niezależnie od siebie i do chwili, w której świadomie wskażemy zależność pomiędzy nimi, nic o sobie nie wiedzą. Jeśli, przykładowo, chcemy uruchomić bazę danych dla naszej aplikacji, to istnieje taka możliwość. Polega ona na uruchomieniu kolejnego kontenera z bazą i stworzeniu połączenia sieciowego pomiędzy kontenerami.
W dokumentacji Dockera często wymieniane jest określenie „container image”. Podkreśla ono zależność – kontener powstaje na podstawie obrazu.
Obraz kontenera to lekki, samodzielny, wykonywalny pakiet oprogramowania, który zawiera wszystko, co jest potrzebne do uruchomienia aplikacji:
- kod,
- środowisko wykonawcze,
- narzędzia systemowe,
- biblioteki systemowe,
- ustawienia.
Uruchamianie i budowanie kontenerów
Poniżej przedstawię kilka przykładowych poleceń, które uruchamiają i budują kontenery. W kolejnych artykułach je rozwinę.
Uruchamianie kontenera:
- Uruchomienie ubuntu z powłoką bash
docker run -it ubuntu:22.04 bash
- Uruchomienie centos z powłoką bash
docker run -it centos:centos8.4.2105 bash
Uruchomienie kontenera polega na wskazaniu obrazu, na podstawie którego ma działać, i podaniu opcjonalnej konfiguracji. Powyższe polecenia uruchamiają systemy operacyjne w wybranej wersji. Wywołanie powłoki bash uruchamia proces o tej nazwie w kontenerze i umożliwia wykonywanie w nim poleceń.
Budowanie obrazu kontenera
- Zawartość pliku Dockerfile
FROM tomcat:8.0
ADD https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war /usr/local/tomcat/webapps/
- Budowanie obrazu
docker build -t sample-app-tomcat-1.0.0 .
- Uruchomienie lokalnego obrazu z udostępnieniem portu 8080
docker run -p 8080:8080 sample-app-tomcat-1.0.0:latest
Budowanie obrazu to zapisanie stanu kontenera w formie pliku. W podanym przykładzie, na podstawie bazowego obrazu Tomcat, powstaje obraz z przykładową aplikacją sample.war. W ten sposób otrzymujemy obraz gotowy do uruchomienia z powtarzalną konfiguracją, wskazanymi wersjami oprogramowania – gotowy do działania.
Współdzielenie obrazu kontenera
Aby współdzielić obraz i móc uruchomić go na kolejnych środowiskach, mamy dwie możliwości:
- zapisanie obrazu w postaci pliku tarball,
- zapisanie obrazu w publicznym lub prywatnym rejestrze obrazów.
Pierwszy sposób wykorzystuje się, kiedy docelowe środowiska nie mają dostępu do Internetu. Natomiast najpowszechniejszym sposobem jest wykorzystanie rejestru.
Do publicznego rejestru każdy może dodawać obrazy – co jest jednocześnie jego zaletą i wadą. Dostępne, oficjalne obrazy budowane przez opiekunów oraz twórców konkretnych rozwiązań, są bezpieczniejsze od obrazów utworzonych przez prywatne osoby.
Jakie są korzyści wykorzystania Dockera dla programistów?
Konteneryzacja dla programisty oznacza sposób, w jaki może dostarczyć aplikację ze wszystkimi potrzebnymi zależnościami i wybranym systemem operacyjnym. Co ważne, może zrobić to w określonych przez niego wersjach, dzięki czemu uruchomienie aplikacji na kolejnych środowiskach (włączając produkcyjne) jest bardziej przewidywalne.
Przykładowo: jeśli uruchamiamy aplikację Java na Apache Tomcat, to obraz kontenera zawiera zainstalowany system operacyjny (np. Ubuntu lub CentOS), zainstalowaną maszynę Java oraz Apache Tomcat i paczkę WAR z aplikacją. Jedynym uruchomionym procesem staje się wówczas wirtualna maszyna Javy z Tomcatem i naszą aplikacją.
Docker pozwala wykorzystywać gotowe obrazy zainstalowanych systemów, aplikacji i baz danych, które zostały wcześniej przygotowane i umieszczone w publicznym rejestrze. Dzięki temu, jeśli chcemy używać PostgreSQL, Redis, RubyOnRails albo Wildfly, jest duża szansa na to, że gotowy obraz będziemy mogli pobrać z repozytorium i nie stracimy czasu na jego przygotowanie.
Jeśli jednak nie znajdziemy tego, czego szukamy, to zawsze możemy zbudować własny obraz, bazując na jednym z bardziej generycznych, zawierających tylko zainstalowany system operacyjny (Ubuntu, Fedora, Alpine itp…) lub zainstalowane środowisko uruchomieniowe (Java, Python czy ASP.NET).
Wykorzystując kontenery zyskujemy:
- Łatwość tworzenia oraz powtarzalność środowisk deweloperskich.
- Uproszczenie procesów dostarczania gotowych aplikacji na docelowe środowiska w szczególności rozproszone.
- Uruchamianie na Windows, Linux, macOS, Kubernetes.
- Możliwość eksperymentowania z różnymi wersjami oprogramowania.
Kilka słów podsumowania
Widać wyraźnie, że środowisko deweloperskie można zbudować z gotowych obrazów zawierających zainstalowane kontenery i usługi. Mechanizm budowania obrazów kontenerów możemy wykorzystać także w drugą stronę i dostarczać nasze konkretne aplikacje w postaci obrazów. Bez względu na technologię wykorzystaną w aplikacji, obraz kontenera będzie dostarczany w identyczny sposób, co upraszcza procedury instalacyjne.
Proces dostarczania aplikacji może zostać zautomatyzowany przez odpowiednie narzędzia.
Kontenery były od samego początku wspierane przez systemy Linux, jednak obecnie są dostępne również na Windows.
Windows Subsystem dla Linux (WSL 2) wprowadził istotną zmianę – pozwala uruchamiać kontenery Linuxa natywnie, bez wirtualizacji.
W przypadku macOS niestety potrzebna jest dodatkowa wirtualizacja.
W następnych wpisach postaram się opisać tworzenie obrazów Dockera oraz budowanie środowiska deweloperskiego.
***
Świetny artykuł. Gratuluję.
Po zamknięciu kontenera zniknęła mi zawartość bazy mysql. Czy to normalne zachowanie?
Jeśli katalog z danymi mysql nie był zamontowany w zewnętrznym kontenerze lub katalogu, to jest to normalne zachowanie. https://docs.docker.com/engine/userguide/containers/dockervolumes/
Przystępny i sporo wyjaśniający artykuł dla mnie, jako osoby rozpoczynającej zgłębianie zagadnień wirtualizacji i konteneryzacji.
Szkoda tylko, że na Windowsie proces konteneryzacji jest utrudniony przez VirtualBoxa i wszystko i tak jest emulowane. Czekam na Dockera pod Windowsem a tymczasem na Dockerze Toolbox pracuję nad pracą inżynierską z zakresu sieci neuronowych i technologii TensorFlow, polecam narzędzie i pozdrawiam użytkowników .
Mam nadzieję, że pomogłem:
https://ubuntu.com/tutorials/install-ubuntu-on-wsl2-on-windows-10#1-overview
Pieknie, czysto i przejrzyste powiedzane jest czym jest docker. tego szukalem bo wlasnie nie wiedzialem. Dzieki 😉
Bardzo ładnie i przyjemnie wytłumaczone, że wiadomo, o co chodzi.
Fajny artykuł, merytoryczny a przy tym lekko się czyta ! dobra robota!
Nie bardzo rozumiem:
Przykładowo: jeśli uruchamiamy aplikację Java na Apache Tomcat, to obraz kontenera zawiera zainstalowany system operacyjny (np. Ubuntu lub CentOS), zainstalowaną maszynę Java oraz Apache Tomcat i paczkę WAR z aplikacją. Jedynym uruchomionym procesem staje się wówczas wirtualna maszyna Javy z Tomcatem i naszą aplikacją.
Zatem co z systemem operacyjnym ? Dostarcza on jedynie potrzebne biblioteki ?
Dzięki.