Pobieranie istniejącego obrazu platformy Docker i wdrażanie go w środowisku lokalnym

Ukończone

Technologia Docker umożliwia szybkie i łatwe wdrażanie aplikacji i usług. Uruchomiona aplikacja platformy Docker korzysta z obrazu platformy Docker. Wstępnie spakowany obraz platformy Docker zawiera kod aplikacji i środowisko, w którym jest wykonywany ten kod.

W opisanym wcześniej scenariuszu firmowym chcesz zbadać możliwości tworzenia pakietów i uruchamiania aplikacji za pomocą platformy Docker. Decydujesz się na utworzenie i wdrożenie obrazu platformy Docker umożliwiającego uruchomienie testowej aplikacji internetowej.

W tej lekcji poznasz podstawowe pojęcia i procesy dotyczące uruchamiania konteneryzowanej aplikacji przechowywanej w obrazie platformy Docker.

Omówienie platformy Docker

Platforma Docker umożliwia uruchamianie aplikacji konteneryzowanych. Aplikacja konteneryzowana obejmuje aplikację oraz system plików będący środowiskiem, w którym ta aplikacja jest uruchamiana. Aplikacja konteneryzowana może na przykład składać się z bazy danych oraz innego powiązanego oprogramowania i informacji konfiguracyjnych potrzebnych do uruchomienia aplikacji.

Konteneryzowana aplikacja zwykle zużywa znacznie mniej zasobów niż maszyna wirtualna skonfigurowana do uruchamiania tej aplikacji. Mniejsze zużycie zasobów wynika z tego, że maszyna wirtualna musi zapewniać zasoby dla całego systemu operacyjnego oraz skojarzonego środowiska obsługi. W przypadku kontenera platformy Docker to obciążenie nie występuje — do jego obsługi jest używane jądro systemu operacyjnego komputera hosta. Pobieranie i uruchamianie obrazu platformy Docker jest szybsze i bardziej wydajne niż pobieranie i uruchamianie maszyny wirtualnej, która zapewnia podobną funkcjonalność.

Aplikację konteneryzowaną można utworzyć, tworząc obraz zawierający zestaw plików i sekcję informacji o konfiguracji używanych przez platformę Docker. W celu uruchomienia aplikacji należy poinstruować platformę Docker, aby uruchomiła kontener powiązany z obrazem. Po uruchomieniu kontenera na podstawie konfiguracji obrazu platforma Docker uruchamia określoną aplikację wewnątrz kontenera. Platforma Docker zapewnia zasoby systemu operacyjnego i niezbędne zabezpieczenia. Dzięki temu kontenery są uruchomione jednocześnie i pozostają względnie odizolowane.

Ważne

Platforma Docker nie zapewnia poziomu izolacji dostępnego dla maszyn wirtualnych. W przypadku maszyny wirtualnej izolacja jest implementowana na poziomie sprzętu. Kontenery platformy Docker współdzielą bazowe zasoby i biblioteki systemu operacyjnego. Jednak platforma Docker zapewnia, że jeden kontener nie może uzyskać dostępu do zasobów innego kontenera, chyba że kontenery są skonfigurowane do tego celu.

Jeśli tworzysz i testujesz aplikacje lokalnie, możesz uruchomić platformę Docker na komputerze stacjonarnym lub laptopie. Platforma Docker jest dostępna dla produkcyjnych środowisk serwerowych, w tym wielu wariantów systemów Linux i Microsoft Windows Server 2016. Wielu dostawców zapewnia również jej obsługę w chmurze. Na przykład można przechowywać obrazy Docker w usłudze Azure Container Registry i uruchamiać kontenery za pomocą usługi Azure Container Instances.

W tym module użyjesz platformy Docker lokalnie do skompilowania i uruchomienia obrazu. Następnie przekażesz obraz do usługi Azure Container Registry i uruchomisz go w wystąpieniu kontenera platformy Azure. Ta wersja platformy Docker jest odpowiednia do lokalnego opracowywania i testowania obrazów platformy Docker.

Obrazy platformy Docker dla systemów Linux i Windows

Platforma Docker została początkowo opracowana dla systemu Linux i od tego czasu została rozszerzona o obsługę systemu Windows. Poszczególne obrazy platformy Docker są oparte na systemie Windows lub Linux. Nie mogą one korzystać z obu tych systemów naraz. System operacyjny obrazu określa, jakiego rodzaju środowisko systemu operacyjnego jest używane wewnątrz kontenera.

Twórcy obrazów platformy Docker, którzy chcą udostępniać podobne funkcje zarówno w obrazach opartych na systemie Linux, jak i na systemie Windows, mogą tworzyć te obrazy oddzielnie. Na przykład firma Microsoft oferuje obrazy platformy Docker z systemami Windows i Linux zawierające środowisko ASP.NET Core, których można użyć jako podstawy dla konteneryzowanych aplikacji ASP.NET Core.

Na komputerach z systemem Linux z zainstalowaną platformą Docker można uruchamiać tylko kontenery dla systemu Linux. Na komputerach z systemem Windows z zainstalowaną platformą Docker można uruchamiać oba rodzaje kontenerów. System Windows działa zarówno przy użyciu maszyny wirtualnej, aby uruchomić system Linux, jak i używa wirtualnego systemu Linux do uruchamiania kontenerów systemu Linux.

W tym module utworzysz i uruchomisz obraz oparty na systemie Linux.

Rejestry platformy Docker i usługa Docker Hub

Obrazy platformy Docker są przechowywane i udostępniane w rejestrach. Rejestr jest usługą internetową, z którą może łączyć się platforma Docker, umożliwiając przekazywanie i pobieranie obrazów kontenerów. Najczęściej używany jest rejestr publiczny Docker Hub. Z usługi Docker Hub korzysta wielu użytkowników indywidualnych i organizacji. Opublikowane obrazy można pobierać i uruchamiać na platformie Docker zainstalowanej na komputerze, na serwerze lub w chmurze. Możesz bezpłatnie utworzyć konto usługi Docker Hub i przekazać swoje obrazy.

Rejestr jest zorganizowany w postaci szeregu repozytoriów. Każde repozytorium zawiera wiele obrazów platformy Docker, które mają wspólną nazwę i zwykle to samo przeznaczenie oraz funkcjonalność. Te obrazy zwykle mają różne wersje identyfikowane z tagiem. Taki mechanizm pozwala publikować i przechowywać wiele wersji obrazów, co ułatwia zapewnienie zgodności. Aby pobrać i uruchomić obraz, musisz podać rejestr, repozytorium oraz tag wersji obrazu. Tagi są etykietami tekstowymi. Możesz używać swojego systemu numerowania wersji (1.0, 1.1, 1.2, 2.0 itd).

Załóżmy, że chcesz użyć obrazu platformy Docker środowiska uruchomieniowego ASP.NET Core. Ten obraz jest dostępny w dwóch wersjach:

  • 8.0 (długoterminowa pomoc techniczna): mcr.microsoft.com/dotnet/aspnet:8.0
  • 6.0 (długoterminowa pomoc techniczna): mcr.microsoft.com/dotnet/aspnet:6.0

Teraz załóżmy, że chcesz użyć obrazów platformy Docker przykładów platformy .NET Core. W tym miejscu dostępne są cztery wersje, z których można wybrać:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:dotnetapp-chiseled
  • mcr.microsoft.com/dotnet/samples:aspnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled

Uwaga

Do jednego obrazu można przypisać wiele tagów. Zgodnie z konwencją najnowsza wersja obrazu jest przypisywana do najnowszego tagu oprócz tagu opisującego jego numer wersji. Po wydaniu nowej wersji obrazu można ponownie przypisać tag latest, zmieniając jego odwołanie na nowy obraz.

Repozytorium jest również jednostką prywatności dla obrazu. Jeśli nie chcesz udostępniać obrazu, możesz oznaczyć repozytorium jako prywatne. Dostęp możesz przyznać innym użytkownikom, którym chcesz udostępnić obraz.

Przeglądanie usługi Docker Hub i ściąganie obrazu

Uwaga

Nie musisz wykonywać żadnych przykładów ani uruchamiać żadnego kodu w poniższych sekcjach. Zrobisz to w następnej lekcji.

Często w usłudze Docker Hub znajduje się obraz, który jest ściśle zgodny z typem aplikacji, którą chcesz konteneryzować. Taki obraz można pobrać i rozbudować przy użyciu swojego kodu aplikacji.

Usługa Docker Hub zawiera tysiące obrazów. Możesz przeszukiwać i przeglądać rejestr przy użyciu platformy Docker z poziomu wiersza polecenia lub witryny internetowej usługi Docker Hub. Witryna internetowa umożliwia wyszukiwanie, filtrowanie i wybieranie obrazów według typu i wydawcy. Na poniższej ilustracji przedstawiono przykładową stronę wyszukiwania.

Zrzut ekranu przedstawiający stronę wyszukiwania w usłudze Docker Hub, która zawiera listę różnych obrazów kontenerów.

Obraz pobiera się przy użyciu polecenia docker pull z nazwą obrazu. Domyślnie platforma Docker pobierze obraz oznaczony tagiem latest z tego repozytorium w usłudze Docker Hub, jeśli określisz tylko nazwę repozytorium. Pamiętaj, że możesz tak zmodyfikować polecenie, aby ściągnąć obrazy z różnymi tagami i z różnych repozytoriów. W tym przykładzie obraz jest pobierany z tagiem aspnetapp z repozytorium mcr.microsoft.com/dotnet/samples:aspnetapp . Ten obraz zawiera prostą aplikację internetową ASP.NET Core.

Uwaga

W tej lekcji przedstawiono na przykładach składnię różnych poleceń platformy Docker. Nie musisz uruchamiać tych poleceń. W ćwiczeniach zawartych po tej lekcji znajdziesz bezpośrednie wskazówki dotyczące pracy z platformą Docker.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

Pobrane obrazy platformy Docker są przechowywane lokalnie i udostępniane w celu uruchamiania kontenerów. Obrazy w rejestrze lokalnym możesz wyświetlić za pomocą polecenia docker image list.

docker image list

Dane wyjściowe wyglądają jak w poniższym przykładzie:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

Możesz użyć identyfikatora nazwy obrazu, aby odwołać się do obrazu w wielu innych poleceniach platformy Docker.

Uruchamianie kontenera platformy Docker

Aby uruchomić kontener, użyj polecenia docker run. Wskaż obraz do uruchomienia przy użyciu nazwy lub identyfikatora obrazu. Jeśli jeszcze nie uruchomiono polecenia docker pull, platforma Docker wywoła je automatycznie.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

W tym przykładzie polecenie odpowiada następującym komunikatem:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Ten obraz zawiera aplikację internetową, dlatego nasłuchiwanie żądań przychodzących odbywa się za pośrednictwem portu HTTP 80. Jednak po otwarciu przeglądarki internetowej i przejściu do adresu http://localhost:80 aplikacja nie będzie widoczna.

Domyślnie platforma Docker nie zezwala przychodzącym żądaniom sieciowym na dostęp do kontenera. Musisz poinstruować platformę Docker, aby przypisała określony numer portu z komputera do określonego numeru portu w kontenerze, dodając opcję -p do polecenia docker run. Ta instrukcja włącza żądania sieciowe do kontenera na określonym porcie.

Ponadto aplikacja internetowa z tego obrazu nie jest przeznaczona do interakcyjnego użycia z poziomu wiersza polecenia. Chcemy, aby platforma Docker uruchomiła tę aplikację w tle. Przy użyciu flagi -d poinstruuj platformę Docker, aby uruchomiła aplikację internetową w tle.

Naciśnij Ctrl+C , aby zatrzymać obraz, a następnie uruchom go ponownie, jak pokazano w poniższym przykładzie:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

To polecenie umożliwia zamapowanie portu 80 w kontenerze na port 8080 na komputerze. Po otwarciu strony http://localhost:8080 w przeglądarce zobaczysz przykładową aplikację internetową.

Zrzut ekranu przedstawiający przykładową aplikację internetową uruchomioną w przeglądarce.

Kontenery i pliki

Zmiany wprowadzone w plikach w obrazie przez uruchomiony kontener są widoczne tylko w tym kontenerze. Jeśli nie podejmiesz określonych kroków w celu zachowania stanu kontenera, te zmiany zostaną utracone po usunięciu kontenera. Podobnie wiele kontenerów na podstawie tego samego obrazu, który jest uruchamiany jednocześnie, nie współużytkuje plików na obrazie. Każdy kontener ma własną niezależną kopię. Wszystkie dane, które jeden kontener zapisuje w swoim systemie plików, nie są widoczne dla drugiego.

Do kontenera można dodać woluminy z możliwością zapisu. Wolumin reprezentuje system plików, który kontener może zainstalować i jest udostępniany aplikacji działającej w kontenerze. Dane w woluminie są utrwalane po zatrzymaniu kontenera. Wiele kontenerów może współdzielić ten sam wolumin. Szczegółowe informacje dotyczące tworzenia i używania woluminów wykraczają poza zakres tego modułu.

Najlepszym rozwiązaniem jest unikanie konieczności wprowadzania zmian w systemie plików obrazów dla aplikacji wdrożonych za pomocą platformy Docker. Należy robić to tylko w przypadku plików tymczasowych, których utrata może być dopuszczalna.

Zarządzanie kontenerami platformy Docker

Aktywne kontenery możesz wyświetlić przy użyciu polecenia docker ps.

docker ps

Dane wyjściowe zawierają stan kontenera — w górę , jeśli jest uruchomiony, Zakończono , jeśli został zakończony — między innymi wartościami, takimi jak flagi wiersza polecenia określone podczas uruchamiania obrazu i dodatkowe informacje. Platforma Docker umożliwia jednoczesne uruchamianie wielu kontenerów z tego samego obrazu, dzięki czemu każdy kontener ma przypisany unikatowy identyfikator i unikatową nazwę czytelną dla człowieka. W przypadku większości poleceń platformy Docker służących do zarządzania poszczególnymi kontenerami można używać zarówno identyfikatora, jak i nazwy podczas odwoływania się do określonego kontenera.

W poniższych danych wyjściowych można zobaczyć dwa kontenery. Zgodnie z zawartością pola PORTS (Porty) kontener o identyfikatorze elegant_ramanujan jest uruchomionym obrazem, którego port 80 na hoście platformy Docker został zamapowany na port 8080 na komputerze. Wystąpienie youthful_heisenberg jest kontenerem dla poprzedniego uruchomienia obrazu. Pole COMMAND (Polecenie) zawiera polecenie użyte przez kontener do uruchomienia aplikacji w obrazie. W takim przypadku w przypadku obu kontenerów jest to aspnetapp.dll dotnet. Identyfikator obrazu dla kontenerów jest również taki sam, ponieważ oba kontenery wykonują ten sam obraz.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Uwaga

docker container ls to skrót dla docker ps. Nazwy tych poleceń są oparte na narzędziach systemu Linux ps i ls, które umożliwiają wyświetlenie listy procesów i plików.

Aktywny kontener można zatrzymać za docker stop pomocą polecenia , określając identyfikator kontenera.

docker stop elegant_ramanujan

Jeśli ponownie uruchomisz polecenie docker ps, zobaczysz, że kontener elegant_ramanujan nie jest już widoczny w danych wyjściowych. Kontener nadal istnieje, ale nie obsługuje już uruchomionego procesu. Aby w danych wyjściowych polecenia docker ps uwzględnić zatrzymane kontenery, dołącz flagę -a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Zatrzymany kontener możesz uruchomić ponownie za pomocą polecenia docker start. Główny proces kontenera został uruchomiony na nowo.

docker start elegant_ramanujan

Zazwyczaj po zatrzymaniu kontenera należy go również usunąć. Usunięcie kontenera powoduje wyczyszczenie wszystkich zasobów używanych przez ten kontener. Usunięcie kontenera powoduje trwałą utratę wszelkich zmian wprowadzonych w systemie plików obrazu.

docker rm elegant_ramanujan

Nie można usunąć uruchomionego kontenera, ale możesz wymusić zatrzymanie i usunięcie kontenera z flagą -f do docker rm polecenia . Jest to szybki sposób zatrzymywania i usuwania kontenera, ale powinien być używany tylko wtedy, gdy aplikacja wewnątrz kontenera nie musi wykonywać bezproblemowego zamknięcia.

docker container rm -f elegant_ramanujan

Usuwanie obrazów platformy Docker

Obraz z lokalnego komputera można usunąć za pomocą polecenia docker image rm. Określ identyfikator obrazu do usunięcia. Poniższy przykład usuwa obraz przykładowej aplikacji internetowej.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Przed usunięciem obrazu należy zakończyć działanie kontenerów, w których jest on uruchomiony. Jeśli obraz jest nadal używany przez kontener, zostanie wyświetlony komunikat o błędzie podobny do poniższego. W tym przykładzie występuje błąd, ponieważ kontener youthful_heisenberg nadal używa obrazu.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe