Software Development

Docker dla programistów, co to jest?

9 grudnia, 2021 8
Podziel się:

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 programistów.

Znajomość Dockera przydaje się w wielu rozwiązaniach chmurowych m.in.

  • Kubernetes,
  • Azure App Services,
  • Amazon Elastic Container Service.

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.

Dawid Szulist
Autor: Dawid Szulist
Obecnie pracuje na stanowisku DevOps Engineer. Ma doświadczenie jako programista, administrator i lider. Odpowiada za tworzenie nowej infrastruktury opartej o RedHat OpenShift i Azure. Fan wszechobecnej automatyzacji, rozwiązań GitOps i Get Thing Done. Motywuje go dzielenie się wiedzą z innymi. Cechuje go spokój, szczególnie w trakcie sytuacji kryzysowych :) Prywatnie mąż, ojciec dwójki dzieci. Interesuje się kalisteniką i jest początkującym biegaczem :)

    Imię i nazwisko (wymagane)

    Adres email (wymagane)

    Temat

    Treść wiadomości

    komentarze(8)

    avatar
    Robert
    8 kwietnia 2016 Odpowiedz

    Świetny artykuł. Gratuluję.

    avatar
    Marcif
    14 kwietnia 2016 Odpowiedz

    Po zamknięciu kontenera zniknęła mi zawartość bazy mysql. Czy to normalne zachowanie?

      avatar
      Wojtek
      19 kwietnia 2016 Odpowiedz

      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/

    avatar
    Tomasz
    29 marca 2019 Odpowiedz

    Przystępny i sporo wyjaśniający artykuł dla mnie, jako osoby rozpoczynającej zgłębianie zagadnień wirtualizacji i konteneryzacji.

    avatar
    Dawid
    31 maja 2019 Odpowiedz

    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 .

    avatar
    Krystian Broniszewski
    5 lipca 2020 Odpowiedz

    Pieknie, czysto i przejrzyste powiedzane jest czym jest docker. tego szukalem bo wlasnie nie wiedzialem. Dzieki ;)

    avatar
    Patrycja
    29 września 2020 Odpowiedz

    Bardzo ładnie i przyjemnie wytłumaczone, że wiadomo, o co chodzi.

    avatar
    Pero
    15 czerwca 2021 Odpowiedz

    Fajny artykuł, merytoryczny a przy tym lekko się czyta ! dobra robota!

    Zostaw komentarz