Co to jest Docker?

Kontener Docker to format pakowania, gromadzący całość kodu i zależności aplikacji w standardowym formacie, pozwalającym na szybkie i niezawodne działanie we wszystkich środowiskach obliczeniowych. Kontener Docker jest popularnym, lekkim, autonomicznym i wykonywalnym kontenerem, zawierającym wszystko, co jest potrzebne do uruchomienia aplikacji, w tym biblioteki, narzędzia systemowe, kod i środowisko uruchomieniowe. Docker jest także platformą programistyczną, umożliwiającą programistom szybkie tworzenie, testowanie i wdrażanie aplikacji kontenerowych.

Containers as a Service (CaaS) lub Container Services to zarządzane usługi chmurowe, zarządzające cyklem życia kontenerów. Usługi kontenerowe pomagają organizować (rozpoczynać, zatrzymywać i skalować) środowisko uruchomieniowe kontenerów. Korzystając z usług kontenerowych, można upraszczać, automatyzować i przyspieszać cykl tworzenia i wdrażania aplikacji.

Usługi Docker i Container Services odniosły ogromny sukces w ciągu ostatnich kilku lat. Z niemal nieznanej i dość złożonej technologii open source w 2013 roku, Docker przekształcił się w standaryzowane środowisko uruchomieniowe, oficjalnie obsługiwane dla wielu produktów biznesowych Oracle.

Terminologia Docker

Docker:

Programistyczna platforma kontenerowa, zaprojektowana z myślą o tworzeniu, dostarczaniu i uruchamianiu aplikacji z użyciem technologii kontenerowej. Docker jest dostępny w dwóch wersjach: biznesowej i społecznościowej

Kontener:

W przeciwieństwie do maszyny wirtualnej (VM), która zapewnia wirtualizację sprzętową, kontener zapewnia lekką wirtualizację na poziomie systemu operacyjnego poprzez abstrahowanie „przestrzeni użytkownika”. Kontenery dzielą jądro systemu hosta z innymi kontenerami. Kontener, który działa na systemie operacyjnym hosta, jest standardową jednostką programową, gromadzącą kod i wszystkie jego zależności, dzięki czemu aplikacje mogą działać szybko i niezawodnie pomiędzy różnymi środowiskami. Kontenery są nietrwałe i są uruchamiane za pomocą obrazów.

Silnik Docker:

Oprogramowanie open source hosta do tworzenia i uruchamiania kontenerów. Silniki Docker działają jako aplikacja klient-serwer, obsługująca kontenery na różnych serwerach Windows i systemach operacyjnych Linux, w tym Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE i Ubuntu.

Obrazy Docker:

Zbiór oprogramowania uruchamianego jako kontener, zawierający zbiór instrukcji tworzenia kontenera, który może działać na platformie Docker. Obrazy są niezmienne, a zmiany obrazu wymagają utworzenia nowego obrazu.

Rejestr Docker:

Miejsce przechowywania i pobierania obrazów. Rejestr jest bezstanową i skalowalną aplikacją po stronie serwera, składującą i dystrybuującą obrazy Docker.

Kto korzysta z Docker?

Docker to otwarte środowisko tworzenia aplikacji, stworzone z myślą o DevOps i programistach. Przy użyciu Docker programiści mogą z łatwością tworzyć, pakować, dostarczać i uruchamiać aplikacje jako lekkie, przenośne, samowystarczalne kontenery, które mogą działać praktycznie wszędzie. Kontenery umożliwiają programistom pakowanie aplikacji ze wszystkimi jej zależnościami i wdrażanie jej jako pojedynczej jednostki. Dostarczając gotowe i samodzielne kontenery aplikacji twórcy mogą skoncentrować się na kodzie i zastosowaniu aplikacji bez potrzeby martwienia się o używany system operacyjny lub system wdrażania.

Ponadto programiści mogą korzystać z tysięcy aplikacji kontenerowych typu open source, które są już zaprojektowane tak, aby działały w kontenerze Docker. Dla zespołów DevOps Docker zapewnia ciągłą integrację i rozwój oraz zmniejsza ograniczenia i złożoność architektury systemu związane z wdrożeniem aplikacji i zarządzaniem nimi. Dzięki wprowadzeniu chmurowych usług orkiestracji kontenerów każdy programista może tworzyć lokalnie aplikacje kontenerowe w swoim środowisku programistycznym, a następnie przenosić i uruchamiać te konteneryzowane aplikacje w produkcji dzięki usługom chmurowym, takim jak zarządzane usługi Kubernetes.

Docker i programiści

Kontenery mogą być pakowane przez dowolnego programistę. Osoby z branży oprogramowania często grupują progamistów według ich specjalizacji – frontend, backend lub dowolnej pośredniej kombinacji. Pomimo tego, że w większości przypadków pakowaniem kontenerów zajmują się programiści backendu, każda osoba zaznajomiona z podstawowymi pojęciami CaaS, może odnieść sukces w tym konkretnym obszarze cyklu rozwoju oprogramowania. Przed przystąpieniem do pakowania zależności aplikacji warto zapoznać się z developer.oracle.com i dowiedzieć się więcej o narzędziach, których można używać do tworzenia aplikacji lub programu.

Docker a Kubernetes

Kontenery Linux istnieją od 2008 roku, ale stały się popularniejsze dopiero po pojawieniu się kontenerów Docker w 2013 roku. Wraz z kontenerami Docker nastąpił gwałtowny wzrost zainteresowania tworzeniem i wdrażaniem aplikacji kontenerowych. Wraz ze wzrostem liczby aplikacji kontenerowych do obsługi setek kontenerów wdrożonych na wielu serwerach, używanie ich stawało się coraz bardziej złożone. Jak koordynować, skalować i planować setki kontenerów oraz zarządzać nimi? Może w tym pomóc Kubernetes. Kubernetes to system orkiestracji open source, umożliwiający uruchamianie kontenerów Docker i zadań przetwarzania. Pomaga zarządzać złożonymi operacjami podczas skalowania do wielu kontenerów wdrożonych na wielu serwerach. Silnik Kubernetes automatycznie zarządza cyklem życia kontenerów aplikacji, rozprowadzając je po infrastrukturze hostingowej. Kubernetes skaluje również zasoby w górę lub w dół, w zależności od zapotrzebowania. Nieustannie udostępnia on kontenery, tworzy ich harmonogramy, usuwa je oraz monitoruje ich stan.

Docker – podstawy

Najważniejsze pojęcia Docker to obrazy i kontenery. Obraz Docker zawiera wszystko, co jest potrzebne do uruchamienia oprogramowania: kod, środowisko uruchomieniowe (na przykład Java Virtual Machine (JVM), sterowniki, narzędzia, skrypty, biblioteki, wdrożenia i inne.

Kontener Docker jest działającą instancją obrazu Docker. W przeciwieństwie hdo tradycyjnej wirtualizacji z hipernadzorcą typu 1 lub 2, kontener Docker działa na jądrze hostującego systemu operacyjnego. W obrazie Docker nie ma osobnego systemu operacyjnego, jak przedstawiono to na ilustracji 1.

obraz podstaw docker
Rysunek 1

Izolacja a wirtualizacja

Każdy kontener Docker ma swój własny system plików, swój własny stos sieciowy (a przez to własny adres IP), swoją własną przestrzeń procesów i zdefiniowane ograniczenia zasobów dla procesora i pamięci. Ponieważ kontener Docker nie musi uruchamiać systemu operacyjnego, uruchamia się natychmiastowo. Docker polega na izolacji – oddzieleniu zasobów hosta systemu operacyjnego, w przeciwieństwie do wirtualizacji – udostępnienia gościnnego systemu operacyjnego w obrębie hostującego systemu operacyjnego.

Przyrostowy system plików

obraz przyrostowego systemu plików
Rysunek 2

System plików obrazu Docker składa się z warstw i korzysta z semantyki kopiowania przy zapisie (copy-on-write). Umożliwia to dziedziczenie i ponowne używanie, oszczędza zasoby na dysku oraz umożliwia pobieranie przyrostowych obrazów.

Jak przedstawiono na ilustracji 2, obraz Docker z wdrożeniem WebLogic może być oparty na obrazie z domeną Oracle WebLogic Server, który może być oparty na obrazie WebLogic, opartym na obrazie Java Development Kit (JDK), który z kolei jest oparty na podstawowym obrazie Oracle Linux.

Rejestr Docker

Chociaż obrazy Docker są łatwe w budowie i programiści uwielbiają ich prostotę oraz przenośność, szybko odkryto, że zarządzanie tysiącami obrazów Docker jest bardzo trudnym zadaniem. Rejestr Docker jest odpowiedzią na to wyzwanie. Rejestr Docker to standardowy sposób przechowywania i rozpowszechniania obrazów Docker. Rejestr jest repozytorium open source korzystającym z otwartej licencji Apache.

Rejestr Docker pomaga także usprawnić kontrolę dostępu oraz zwiększyć bezpieczeństwo obrazów Docker przechowywanych w repozytorium. Zarządza dystrybucją obrazów, a także może integrować się z procesami tworzenia aplikacji. Programiści mogą skonfigurować własny rejestr Docker lub skorzystać z hostowanych usług, takich jak Docker Hub, Oracle Container Registry, Azure Container Registry itp.

Docker Hub jest hostowanym rejestrem Docker zarządzanym przez Docker. Docker Hub zawiera ponad 100 000 obrazów kontenerów, pochodzących od dostawców oprogramowania, projektów open source i społeczności. Docker Hub zawiera oprogramowanie i aplikacje z oficjalnych repozytoriów, takich jak NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu i Oracle Linux.

Podczas uruchamiania kontenera, Docker domyślnie automatycznie ściągnie odpowiadający mu obraz z dostępnego publicznier repozytorium Docker Hub, jeśli nie jest on dostępny lokalnie. Ponadto można tworzyć własne obrazy i wysyłać je do Docker Hub do repozytorium publicznego lub prywatnego.

Rysunek 3: Zrzut ekranu rejestru Docker
Rysunek 3

Docker jako środowisko uruchomeniowe mikrousług

Koncept pocięcia monolitycznych aplikacji na mniejsze kawałki mikrousług spotyka się w dzisiejszych czasach z dużym zainteresowaniem wśród programistów.

Mikrousługi są wdrażane niezależnie jako procesy, używają lekkich protokołów do komunikowania się między sobą, a każda usługa posiada własne dane. Ponieważ mikrousługi stosują zdecentralizowane podejście do zarządzania, wymagają one raczej wysokiego stopnia automatyzacji infrastruktury, automatycznego testowania, w pełni zautomatyzowanych potoków CD oraz wykwalifikowanych, zwinnych zespołów DevOps.

Nadal trwa wiele dyskusji na temat tego stylu architektonicznego, ale założenie, że aplikacja rozłożona na mikrousługi może być po prostu obsługiwana jako zestaw procesów, byłoby naiwne. Zgodnie z przykładowymi wymaganiami, mikrousługa musi być niezależna od hostów i izolowana na poziomie systemu operacyjnego. Musi działać w granicach swoich zasobów, być skalowana w górę i w dół, restartowana w razie niepowodzenia oraz wykrywana i łączona z innymi mikrousługami poprzez warstwę sieciową definiowaną przez oprogramowanie.

Dlatego też uruchomienie mikrousługi w kontenerze Docker oferuje doskonały punkt startowy do spełnienia większości z tych wymagań.

Docker – dwa kluczowe wymiary

Docker zmienia sposób tworzenia, dostarczania i uruchamiania oprogramowania w dwóch różnych wymiarach:

  • Usprawnia proces, dzięki któremumożna niezawodnie uzyskiwać aplikacje – od tworzenia do produkcji.
  • Zapewnia standardowy format obrazu, pozwalający przejść z rozwiązań lokalnych do chmury.

Oba wymiary zostały szczegółowo omówione w kolejnych akapitach.

Obraz Docker – tworzenie do produkcji

Tworzenie obrazu Docker ze wszystkimi zależnościami rozwiązuje problem „ale przecież to działało na mojej maszynie do programowania”. Kluczową kwestią jest automatyczne tworzenie obrazu Docker w potoku kompilacji z repozytorium kodu źródłowego (np. Git) i początkowe testowanie go w środowisku programistycznym. Ten niezmienny obraz zostaje potem zapisany w rejestrze Docker.

Jak pokazano na ilustracji 4, ten sam obraz będzie używany do dalszych badań obciążenia, testów integracyjnych, testów odbiorczych itd. Ten sam obraz zostanie użyty w każdym środowisku. Małe, ale niezbędne różnice środowiskowe, takie jak adres URL JDBC dla produkcyjnej bazy danych, mogą być wprowadzane do kontenera jako zmienne środowiskowe lub pliki.

zrzut ekranu obrazu docker
Rysunek 4

Statystyki pokazują, że 65% wszystkich bieżących przypadków użycia Docker dotyczą tworzenia, a 48% używa Docker do ciągłej integracji.

Chmura Docker

Docker zmienił podejście do chmur publicznych: z jednej strony, dzięki obrazowi Docker po raz pierwszy w historii istnieje powszechny format pakietu, który może być uruchamiany zarówno lokalnie, jak i w każdej popularnej usłudze chmury. Kontenery Docker działają na laptopie w ten sam sposób, w jaki działają w Oracle Cloud.

Z drugiej strony, ponieważ kontenery Docker działają na każdej znanej chmurze publicznej, mają duży wkład w przezwyciężeniu od dawna kultywowanego uprzedzenia przeciwko publicznym chmurom: uzależnieniu się od jednego dostawcy usług. Każdy dostawca usług chmury oferuje teraz Docker jako usługę PaaS.

Wersje Docker – dojrzałość fundamentów technologicznych

Tempo wydań Docker jest o wiele szybsze niż cykl wydawniczy tradycyjnego oprogramowania dla firm. Czasami sama szybkość wydań Docker wraz ze świeżością projektu Docker wzbudza obawy dotyczące jego bezpieczeństwa i stabilności.

Mimo że Docker i jego linia poleceń, proces daemon Docker, jego API i narzędzia, takie jak Docker Swarm, Docker Machine i Docker Compose powstały jedynie w ciągu ostatnich trzech lat, podstawowe funkcje jądra są dostępne w każdym jądrze systemu Linux od niemal dekady.

Wybitnym przykładem wczesnego użytkownika technologii kontenerowej jest Google. Google używało kontenerów Linux zanim pojawił się Docker. Co więcej, w Google wszystko działa w kontenerze. Szacuje się, że Google uruchamia kilka miliardów kontenerów tygodniowo.

Historia grup kontrolnych i przestrzeni nazw

Funkcje jądra systemu Linux używane przez Docker to grupy kontrolne (cgroups) i przestrzenie nazw. W 2008 roku grupy kontrolne zostały wprowadzone do jądra Linux w oparciu o wcześniejszą pracę programistów Google1. Grupy kontrolne ograniczają i kontrolują zużycie zasobów zbioru procesów systemu operacyjnego.

Jądro Linux używa przestrzeni nazw do odizolowania od siebie zasobów procesów systemowych. Pierwsza przestrzeń nazw, tj. montowana (mount), została wprowadzona już w 2002 roku.2

Container Cloud Services

W pierwszej części tego artykułu wyjaśniono niektóre ważne koncepcje Docker. W środowisku produkcyjnym nie wystarcza jedynie uruchomienie aplikacji w kontenerze Docker.

Do konfiguracji i obsługi środowiska produkcyjnego wymagany jest sprzęt do uruchomienia kontenerów. Oprogramowanie (takie jak Docker), wraz z repozytoriami i menedżerami klastrów, musi zostać zainstalowane, uaktualnione i załatane. Jeśli kilka kontenerów Docker komunikuje się między hostami, trzeba utworzyć sieć. Zawodzące kontenery klastrowe należy ponownie uruchomić. Ponadto zestaw połączonych ze sobą kontenerów należy wdrożyć jako jedną logiczną instancję aplikacji. Przykładem może być urządzenie równoważenia obciążenia, kilka serwerów internetowych, niektóre instancje Oracle WebLogic Server z serwerem administracyjnym, zarządzanym serwerem oraz bazą danych. Do masowego zarządzania aplikacjami konteneryzowanymi wymagany jest system orkiestracji kontenerów, taki jak Kubernetes czy Docker Swarm. Wdrażanie, zarządzanie i operowanie system orkiestracji, takim jak Kubernetes, może być trudne i czasochłonne.

Aby programiści mogli łatwiej i skuteczniej tworzyć aplikacje konteneryzowane, dostawcy usług w chmurze oferują usługi Container Cloud Services lub Containers as a Service (CaaS). Usługi Container Cloud Services pomagają programistom i zespołom operacyjnym usprawniać cykl życia kontenerów oraz zarządzać nim w zautomatyzowany sposób. Te usługi orkiestracji, zazwyczaj tworzone przy użyciu Kubernetes, ułatwiają zespołom DevOps masowe zarządzanie i operowanie aplikacjami konteneryzowanymi. Oracle Container Engine for Kubernetes i Azure Kubernetes Service to dwa przykłady popularnych zarządzanych usług chmurowych do orkiestracji kontenerów.

Oracle Container Engine for Kubernetes to w pełni zarządzana, skalowalna, wysoce dostępna usługa, którą można wykorzystać do wdrożenia aplikacji konteneryzowanych w chmurze. Skorzystaj z usługi Container Engine for Kubernetes (czasami skracanej do OKE), jeśli Twój zespół programistów chce w niezawodny sposób tworzyć i wdrażać natywne aplikacje chmurowe oraz nimi zarządzać.

Obrazy Docker z Oracle

Kontenery mogą być pakowane przez dowolnego programistę. Osoby z branży oprogramowania często grupują progamistów według ich specjalizacji – frontend, backend lub dowolnej pośredniej kombinacji. Pomimo tego, że w większości przypadków pakowaniem kontenerów zajmują się programiści backendu, każda osoba zaznajomiona z podstawowymi pojęciami CaaS, może odnieść sukces w tym konkretnym obszarze cyklu rozwoju oprogramowania. Przed przystąpieniem do pakowania zależności aplikacji warto zapoznać się z developer.oracle.com i dowiedzieć się więcej o narzędziach, których można używać do tworzenia aplikacji lub programu.

Poniżej przedstawione są niektóre źródła uzyskiwania lub tworzenia obrazów Docker dla produktów Oracle. Repozytorium Oracle GitHub dla obrazów Docker zawiera pliki dokumentów i próbki służące do tworzenia obrazów Docker dla produktów komercyjnych Oracle i sponsorowanych przez Oracle projektów open source.

Laborarium praktyczne Docker – tworzenie w kontenerach z Docker

Adnotacje

  1. Cgroups (Wikipedia)
  2. Linux Namespaces (Wikipedia)