JavaRush /Blog Java /Random-PL /Pierwsza znajomość z Dockerem
Viacheslav
Poziom 3

Pierwsza znajomość z Dockerem

Opublikowano w grupie Random-PL
Konteneryzacja jest mechanizmem często stosowanym w praktyce. Na przykład, szukając headhuntera, na dzień dzisiejszy znajdziesz 477 wolnych stanowisk pracy, które wspominają o Dockerze. Dlatego nie byłoby złym pomysłem zapoznanie się z tym, co to jest. Mam nadzieję, że ta krótka recenzja pomoże w sformułowaniu pierwszego pomysłu. Cóż, poprze to dodatkowymi materiałami, takimi jak kursy na Udemy. Pierwsze wprowadzenie do Dockera – 1

Wstęp

W tej krótkiej recenzji chciałbym poruszyć taki temat, jak konteneryzacja. Musisz zacząć od zrozumienia, czym właściwie jest konteneryzacja. Według Wikipedii „ konteneryzacja ” to wirtualizacja na poziomie systemu operacyjnego (tj. NIE sprzętu), w której jądro systemu operacyjnego utrzymuje wiele izolowanych instancji przestrzeni użytkownika zamiast tylko jednej. „ Przestrzeń użytkownika ” to przestrzeń adresowa pamięci wirtualnej systemu operacyjnego zarezerwowana dla programów użytkownika. Instancje przestrzeni użytkownika (powszechnie zwane kontenerami) są całkowicie identyczne z pojedynczą instancją systemu operacyjnego z punktu widzenia użytkownika. Jądro zapewnia całkowitą izolację kontenerów, dzięki czemu programy z różnych kontenerów nie mogą na siebie oddziaływać. Okazuje się, że konteneryzacja to wirtualizacja oprogramowania, czyli wirtualizacja na poziomie systemu operacyjnego, za którą odpowiada jądro systemu operacyjnego. Jedną z charakterystycznych cech tego podejścia jest to, że wszystkie kontenery korzystają ze wspólnego jądra, takiego samego jak system operacyjny hosta (czyli ten, na którym znajdują się kontenery). Pozwala to pozbyć się narzutu związanego z emulacją sprzętu wirtualnego i uruchomieniem pełnoprawnej instancji systemu operacyjnego. Można powiedzieć, że jest to wirtualizacja „lekka”. Jądro jest centralną częścią systemu operacyjnego, która zapewnia aplikacjom skoordynowany dostęp do zasobów komputera, takich jak czas procesora, pamięć, sprzęt zewnętrzny oraz zewnętrzne urządzenia wejścia i wyjścia. Jądro zazwyczaj zapewnia również usługi systemu plików i protokołów sieciowych. Ogólnie rzecz biorąc, jest to serce całego systemu. W celu uzyskania dodatkowych informacji przydatne może być zapoznanie się z materiałem „ Ogólne informacje o kontenerach ”. I jeszcze kilka słów na uzupełnienie wstępu. Teraz rozumiemy, że system operacyjny ma jądro. Zapewnia izolację instancji przestrzeni użytkownika. W tym kontekście możesz spotkać się z terminem „ cgroups ”. Tak nazywa się mechanizm jądra Linuksa, który pozwala to osiągnąć. Można zatem powiedzieć, że droga konteneryzacji rozpoczęła się od systemów Linux. Jednak począwszy od Windows 10 pojawiła się także obsługa konteneryzacji. Aby pracować z wirtualizacją, musisz skonfigurować obsługę wirtualizacji w BIOS-ie komputera. Sposób wykonania tej czynności zależy od komputera. Na przykład może to wyglądać tak:
Pierwsze wprowadzenie do Dockera - 2
W systemie Windows możesz to sprawdzić na różne sposoby. Na przykład możesz pobrać specjalne narzędzie ze strony internetowej Microsoft: Narzędzie do wykrywania wirtualizacji wspomaganej sprzętowo . Cóż, warto wspomnieć o jeszcze jednej ważnej koncepcji – Hypervisorze. Hypervisor to monitor maszyny wirtualnej, program zapewniający równoległe wykonywanie kilku systemów operacyjnych na tym samym komputerze. Hiperwizor zapewnia izolację systemów operacyjnych od siebie i współdzielenie zasobów między działającymi systemami operacyjnymi. Jednym z takich hypervisorów jest Oracle VirtualBox .
Pierwsze wprowadzenie do Dockera - 3

Doker

Zatem jasne jest, czym jest wirtualizacja. Ale jak go używać? I tu z pomocą przychodzi nam Docker. Docker to oprogramowanie do automatyzacji wdrażania i zarządzania aplikacjami w środowiskach kontenerowych. Warto zacząć od tego, że Dockera reprezentuje taka koncepcja jak Docker Enginge. Powinieneś zacząć od oficjalnej strony Dockera i sekcji „ Przegląd Dockera ”.
Pierwsze wprowadzenie do Dockera - 4
Dokumentacja mówi, że okno dokowane składa się z:
  • Serwer Docker o nazwie proces Docker Daemon (dockerd).
  • Interfejs wiersza poleceń, znany również jako CLI (doker).
  • Interfejs API REST opisujący, w jaki sposób programy mogą „rozmawiać” z demonem i mówić mu, co ma robić.
Zanim zagłębimy się dalej, zainstalujmy dokera, czyli zainstalujmy demona dokera. Witryna Dockera zawiera instrukcje dotyczące instalacji „ Dockera dla Windows ”. Co ciekawe, Docker ma własne wymagania systemowe. A jeśli tak jak ja masz stary Windows, na przykład Windows 7, to musisz skorzystać z Docker Toolbox.
Pierwsze wprowadzenie do Dockera - 5

Zestaw narzędzi Dockera

Aby zainstalować Dockera na starych maszynach, które nie spełniają wymagań systemowych. Tak twierdzi witryna internetowa „Starsze rozwiązanie dla komputerów stacjonarnych”. Przejdźmy do strony „ Docker Toolbox ” i pobierzmy ją. Zestaw ten waży około 211 megabajtów. Zainstalujemy go domyślnie, czyli po prostu pokornie zgodzimy się na wszystko bez przestawiania flag. Po instalacji sprawdzimy, czy wszystko jest w porządku. W przyszłości naszym polem bitwy będzie linia dowodzenia. Radzę nie korzystać z wiersza poleceń systemu Windows, gdyż mogą z nim wystąpić nieoczywiste problemy. Lepiej użyć powłoki bash. W systemie Windows najbardziej zalecanym sposobem uzyskania tego jest instalacja systemu kontroli wersji git , nadal będzie przydatny. Ponieważ „w zestawie” będzie bash, którego potrzebujemy. Do tej recenzji użyję git bash. Możesz także zainstalować bash za pomocą CYGWIN . Uruchommy bash lub git bash. Upewnijmy się, że zainstalowaliśmy maszynę Docker, znaną również jako Maszyna Docker: docker-machine -version Co to jest ta maszyna Docker? Docker Machine to narzędzie do zarządzania hostami zadokowanymi (są to hosty, na których jest zainstalowany Docker Engine). Jeżeli od razu po zainstalowaniu Docket Toolbox wyświetlimy maszyny dokowane za pomocą polecenia docker-machine ls, zobaczymy pustą listę:
Pierwsze wprowadzenie do Dockera - 6
Stwórzmy nową maszynę. Aby to zrobić musimy uruchomić polecenie create : docker-machine create -- driver virtualbox javarush: Zobaczymy dziennik tworzenia maszyny dokującej:
Pierwsze wprowadzenie do Dockera - 7
To, co nas tutaj interesuje, jest następujące. Co to jest Boot2Docker? Jest to minimalistyczna dystrybucja Linuksa umożliwiająca uruchomienie Docker Engine (rozumiemy, że Docker działa dzięki narzędziom do wirtualizacji Linuksa, a w Windowsie niezbędny mechanizm pojawił się dopiero począwszy od Windows 10). Dystrybucja ta bazuje na dystrybucji „ Tiny Core Linux ”. Wspomniano także o VirtualBox VM. Dzieje się tak, ponieważ określiliśmy --driver virtualbox. Nowa maszyna wirtualna została utworzona w VirtualBox z obrazu Boot2Docker. Po utworzeniu możemy uruchomić VirtualBox (ponieważ VirtualBox jest instalowany z Docker Toolbox) i zobaczyć utworzoną maszynę wirtualną dla maszyny dokującej:
Pierwsze wprowadzenie do Dockera - 8
Po utworzeniu zostaniemy poproszeni o uruchomienie polecenia „ docker-machine env ”, aby uzyskać zmienne środowiskowe, które należy skonfigurować, aby połączyć się z maszyną dokującą:
Pierwsze wprowadzenie do Dockera - 9
Po wykonaniu tego polecenia za pomocą maszyny dokowanej łączymy się ze zdalnym hostem dokowanym (w tym przypadku wirtualnym hostowanym na Virtual Boxie) i możemy wykonywać polecenia dokera lokalnie, tak jakbyśmy wykonywali je na zdalnym hoście. Aby to sprawdzić, możemy uruchomić polecenie „ docker info ”. Jeśli połączenie z maszyną dokującą nie zostanie nawiązane, otrzymamy błąd. A jeśli wszystko jest w porządku, informacja o oknie dokowanym na maszynie dokującej. Nadszedł czas, aby zrozumieć, jak ogólnie działa Docker i jak go używać.
Pierwsze wprowadzenie do Dockera - 10

Kontenery Dockera

Mamy więc dokera. Co to w ogóle za doker? Dokumentacja Dockera i sekcja „ Pierwsze kroki ” pomogą nam to zrozumieć . We wstępnej części tej sekcji przedstawiono koncepcje platformy Docker . Stwierdza, że ​​Docker to platforma do tworzenia, debugowania i uruchamiania aplikacji w kontenerach. Dlatego najważniejszą rzeczą dla Dockera są kontenery. Nawet jeśli spojrzeć na logo dokera, jest to wieloryb trzymający kontenery na grzbiecie. Ale czym jest kontener? Następnie w sekcji „ Obrazy i kontenery ” jest napisane, że kontener jest działającą instancją Image. Image to „pakiet” zawierający wszystko, co niezbędne dla aplikacji (kod, środowisko, biblioteki, ustawienia itp.). Teraz spróbujmy sami. Witryna Dockera zawiera sekcję o nazwie „ Przykłady Dockera ”, która zawiera „ Docker dla początkujących ”. Przykłady stąd wydają mi się bardziej interesujące. Tak więc nagle zapragnęliśmy zapoznać się z Alpine Linux i możemy to zrobić za pomocą kontenerów Docker. Aby uzyskać obraz, musimy go „wyciągnąć” lub „wyciągnąć”. Dlatego wykonujemy polecenie docker pull :docker pull apline
Pierwsze wprowadzenie do Dockera - 11
Jak widzimy, skądś pobieramy. Domyślnie Docker przegląda swoje repozytorium w sieci https://hub.docker.com . Po pomyślnym pobraniu obrazu możemy sprawdzić listę dostępnych obrazów uruchamiając polecenie docker Images :
Pierwsze wprowadzenie do Dockera - 12
Teraz mamy obraz aplikacji. Ponieważ kontener jest działającą instancją obrazu, uruchommy właśnie ten obraz. Uruchommy kontener za pomocą polecenia docker run alpine. Jak widzimy, nic się nie stało. Jeśli wykonamy polecenie docker pswyświetlenia wszystkich aktywnych kontenerów, również nic nie otrzymamy. Ale jeśli wykonamy, docker ps -azobaczymy wszystkie kontenery:
Pierwsza znajomość z Dockerem - 13
Rzecz w tym, że nie uruchomiliśmy Dockera w trybie interaktywnym. Wykonał zatem polecenie i zatrzymał się. Polecenie brzmiało otwarcie terminala. Zróbmy to samo, ale w trybie interaktywnym (z flagą -it ):
Pierwsze wprowadzenie do Dockera - 14
Jak widać po pokonaniu jednego błędu i skorzystaniu z podpowiedzi dotarliśmy do kontenera i możemy w nim pracować! Aby wyjść z kontenera bez zatrzymywania jego działania, możesz nacisnąć Ctrl + p + q. Jeśli teraz uruchomimy docker ps, zobaczymy jeden aktywny kontener. Aby wejść do już działającego kontenera, uruchom komendę docker exec :
Pierwsza znajomość z Dockerem - 15
Polecam przeczytać opis przykładu Dockera, aby uzyskać doskonały opis tego, jak to wszystko się dzieje: „ 1.0 Uruchamianie pierwszego kontenera ”. Podoba mi się, bo wszystko jest tam napisane w bardzo przystępny i zrozumiały sposób. Krótko mówiąc, jesteśmy połączeni za pomocą maszyny dokującej z maszyną wirtualną, na której działa Docker Daemon. Korzystając z CLI poprzez REST API, prosimy o uruchomienie obrazu alpejskiego. Docker go znajdzie i dlatego go nie pobierze. Docker tworzy nowy kontener i uruchamia polecenie określone w tym kontenerze. I wszystko to oczywiście jest dobre. Ale po co nam to wszystko? I tutaj musimy dowiedzieć się, w jaki sposób doker tworzy obraz. I tworzy je w oparciu o plik dockerfile.
Pierwsze wprowadzenie do Dockera - 16

Plik Dockera

Jak stwierdzono w dokumentacji Dockerfile , plik dokera to plik tekstowy zawierający wszystkie polecenia umożliwiające uzyskanie obrazu. Tak naprawdę wszystkie obrazy, które otrzymujemy (nawet Alpine z powyższego przykładu) zostały utworzone z pliku dockerfile. Zbudujmy nasz obraz za pomocą aplikacji Java. Najpierw potrzebujemy tej aplikacji Java. Sugeruję skorzystanie z systemu kompilacji Gradle, o którym możesz przeczytać więcej w tej krótkiej recenzji: „ Krótkie wprowadzenie do Gradle ”. Pomoże nam w stworzeniu projektu „ Wtyczka inicjująca Gradle Build ”. Utwórzmy nową aplikację Java za pomocą Gradle: gradle init --type java-application To polecenie tworzy szablon projektu Java. Jest to samodzielna aplikacja, ale chcielibyśmy stworzyć aplikację internetową. Usuńmy klasy App i AppTest (zostały wygenerowane automatycznie przez wtyczkę Gradle Build Init). Aby szybko stworzyć aplikację internetową skorzystamy z tutoriala z Gradle: „ Budowanie aplikacji internetowych w Javie ”. Zgodnie z tutorialem wykonajmy: Trzeba tu uważać. Jak zawsze, w przykładach mogą występować błędy. Oto ona:
Pierwsze wprowadzenie do Dockera - 17
Teraz, aby to przetestować, dodajmy wtyczkę gretty do build.gradle, jak wskazano w sekcji „ Dodaj wtyczkę gretty i uruchom aplikację ”:
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Co ciekawe, Gretty nie widzi błędu w HelloServlet, który opisano powyżej. Dowodzi to, że aplikacja może zachowywać się inaczej w różnych środowiskach. Gretty może pracować tam, gdzie zwykły samodzielny serwer zgłaszałby błąd. Pozostaje tylko sprawdzić, czy aplikacja działa poprawnie. Zróbmy:gradle appRun
Pierwsza znajomość z Dockerem - 18
Jeśli wszystko jest w porządku, użyj polecenia, gradle waraby zebrać archiwum z rozszerzeniem wojna (archiwum internetowe). Domyślnie gradle buduje go w pliku \build\libs. Teraz jesteśmy gotowi do napisania naszego pliku dockerfile. Korzystając z „ odniesienia do pliku Dockerfile ”, utworzymy plik Dockerfile. Utwórzmy plik o nazwie „Dockerfile” w katalogu głównym naszego projektu Java (w tym samym miejscu, co skrypt kompilacji). Otwórzmy go do edycji. Ten plik ma swój własny format, opisany w sekcji „ Dockerfile: Format ”. Każdy plik dokowany zaczyna się od instrukcji FROM, wskazującej „obraz bazowy”. Można powiedzieć, że jest to obraz macierzysty, na podstawie którego tworzymy nasz wizerunek. Bardzo łatwo jest nam wybrać obraz nadrzędny. Aplikacja internetowa wymaga serwera WWW. Możemy na przykład skorzystać z serwera WWW Tomcat. Przechodzimy do oficjalnego repozytorium Dockera, które nazywa się docker hub . Patrzymy tam, aby sprawdzić, czy potrzebny nam obraz jest tam:
Pierwsza znajomość z Dockerem - 19
Warto również zrozumieć, że nazywa się obraz kocurka. Ale oprócz nazwy ma etykietę. Tag jest jak wersja. Obrazy Tomcat różnych wersji różnią się pod względem używanej wersji Tomcat, wersji jre i obrazu podstawowego. Na przykład możemy uzyskać obraz. docker pull tomcat:9-jre8-alpine Jako bazę wykorzystuje wersję 9 Tomcat, wersję jre 8 i obraz alpejski. Może to być ważne, aby zmniejszyć rozmiar naszego obrazu:
Pierwsza znajomość z Dockerem - 20
Jak widzimy różnica jest ogromna. Jeśli zbudujemy nasz obraz w oparciu o Tomcata alpine, zaczniemy od zaledwie 100 megabajtów, a nie od 600. W związku z tym do wcześniej utworzonego pliku dockerfile dodamy następującą zawartość:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
A teraz wykonajmy polecenie zbudowania obrazu: docker build -t jrdocker ..
Pierwsza znajomość z Dockerem - 21
-t- to jest tag, czyli jak nazwać złożony obraz. Kropka na końcu oznacza, że ​​dodajemy bieżący katalog (katalog, w którym znajduje się plik dockerfile i z którego uruchomiliśmy polecenie) do Build context. Build context- to jest kontekst tych plików, które są dostępne podczas tworzenia pliku dockerfile. Jak widać, dzięki temu udało nam się skopiować zmontowany plik wojny na nasz obraz, do katalogu serwera WWW. Teraz uruchommy nasz obraz:docker run -d --rm -p 8888:8080 jrdocker
Pierwsza znajomość z Dockerem - 22
Aby zrozumieć, czy serwer został uruchomiony, możesz spojrzeć na dziennik z kontenera. Log można uzyskać za pomocą polecenia docker logs, podając kontener po jego identyfikatorze lub nazwie. Na przykład:
Pierwsza znajomość z Dockerem - 23
No cóż, nie zapominajmy, że zawsze możemy przejść do działającego kontenera po nazwie za pomocą polecenia: winpty docker exec -it NazwaКонтейнера sh Teraz pozostaje już tylko się połączyć. Wcześniej określiliśmy EXPOSE , czyli umożliwiliśmy dostęp z wnętrza kontenera do portu 8080. Kiedy uruchomiliśmy sam kontener, określiliśmy tag -p ( porty przychodzące ), korelując w ten sposób port 8080 w kontenerze (serwer WWW Tomcat czeka tam na połączenia) z portem 8888 na maszynie z demonem dokowania. Jak pamiętamy, uruchomiliśmy demona dokującego nie bezpośrednio, ale poprzez maszynę dokującą. Dlatego jeszcze raz zapytajmy o dane na naszych maszynach dokujących za pomocą komendy docker-machine ls i skontaktujmy się z serwerem w kontenerze:
Pierwsze wprowadzenie do Dockera – 24
Tym samym właśnie uruchomiliśmy naszą aplikację internetową w kontenerze Docker! ) Chciałbym również zwrócić uwagę na następującą kwestię. W przypadku problemów z dostępem należy pamiętać, że maszyna Docker to przede wszystkim maszyna wirtualna Virtual BOX. Mogą występować problemy z ustawieniami sieciowymi maszyny wirtualnej. Działająca konfiguracja VMBox może wyglądać następująco:
Pierwsza znajomość z Dockerem - 25
Pierwsza znajomość z Dockerem - 26

Warstwy

Ustaliliśmy już, że obrazy tworzone są z plików dockerfile i że pliki dockerfile stanowią zestaw poleceń. Odkryliśmy również, że plik dokowany ma rodzica. I że rozmiar obrazów jest inny. Co ciekawe, historię budowy obrazu można zobaczyć za pomocą polecenia historii dokowania . Na przykład:
Pierwsza znajomość z Dockerem - 27
Należy to powiedzieć, aby zrozumieć, że w istocie każdy obraz jest zbiorem obrazów. Każda zmiana obrazu (każde nowe polecenie w pliku dokowanym) tworzy nową warstwę, która ma swój własny identyfikator. Więcej o warstwach możesz przeczytać w dokumentacji „ Docker: Obrazy i warstwy ”. Gorąco polecam również przeczytanie artykułu na temat Habré: „ Obrazy Dockera i kontenery na zdjęciach ”.

Wniosek

Mam nadzieję, że ten krótki przegląd wystarczył, aby zainteresować Cię konteneryzacją. Poniżej znajdują się linki do dodatkowych materiałów, które mogą być przydatne: #Wiaczesław
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION