Ćwiczenie — tworzenie obrazu kontenera dla mikrousługi platformy .NET
W tym ćwiczeniu utworzysz punkt końcowy mikrousługi i konteneryzujesz go przy użyciu zestawu .NET SDK i platformy Docker.
Uwaga
To ćwiczenie można wykonać w wystąpieniu usługi GitHub Codespaces z wstępnie zainstalowanym zestawem Docker i zestawem .NET SDK . Jeśli używasz tych narzędzi i technik we własnym środowisku programistycznym, upewnij się, że zostały zainstalowane te wymagania wstępne.
Otwieranie środowiska projektowego
Możesz użyć przestrzeni kodu usługi GitHub, która hostuje ćwiczenie, lub wykonać ćwiczenie lokalnie w programie Visual Studio Code.
Aby użyć przestrzeni kodu, utwórz wstępnie skonfigurowany element GitHub Codespace za pomocą tego linku tworzenia usługi Codespace.
Utworzenie i skonfigurowanie przestrzeni kodu w usłudze GitHub trwa kilka minut. Po zakończeniu procesu zobaczysz pliki kodu dla ćwiczenia. Kod używany w pozostałej części tego modułu znajduje się w katalogu /dotnet-docker .
Aby użyć programu Visual Studio Code, sklonuj https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative repozytorium na komputer lokalny. Następnie:
- Zainstaluj wszelkie wymagania systemowe, aby uruchomić kontener deweloperski w programie Visual Studio Code.
- Upewnij się, że platforma Docker jest uruchomiona.
- W nowym oknie programu Visual Studio Code otwórz folder sklonowanego repozytorium
- Naciśnij klawisze Ctrl+Shift+P, aby otworzyć paletę poleceń.
- Wyszukiwanie: Tworzenie kontenerów: >ponowne kompilowanie i ponowne otwieranie w kontenerze
- Wybierz pozycję eShopLite — dotnet-docker z listy rozwijanej. Program Visual Studio Code tworzy kontener dewelopera lokalnie.
Tworzenie obrazu zaplecza Products za pomocą publikowania platformy .NET
Najnowsza wersja platformy .NET 8 zwiększa obsługę konteneryzacji. Możesz użyć dotnet publish
polecenia , aby utworzyć obraz platformy Docker dla mikrousług. Polecenie tworzy obraz kontenera bez rootless, który uruchamia usługi na koncie app
. Uruchamianie kontenerów bez rootless doskonale nadaje się do bezpieczeństwa i wydajności. Polecenie wie, jak wybrać najlepszy obraz podstawowy, sprawdzając ustawienia w pliku projektu.
Aby utworzyć obrazy dla wszystkich eShopLite usług, przejdź do karty TERMINAL i uruchom następujące polecenie:
cd ./dotnet-docker dotnet publish /p:PublishProfile=DefaultContainer
Zobaczysz dane wyjściowe podobne do następujących komunikatów:
DataEntities -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/DataEntities/bin/Release/net8.0/publish/ Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/Products.dll Products -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Products/bin/Release/net8.0/publish/ Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/Store.dll Store -> /workspaces/mslearn-dotnet-cloudnative/dotnet-docker/Store/bin/Release/net8.0/publish/ Building image 'store' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'. Building image 'products' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'. Pushed image 'store:latest' to local registry via 'docker'. Pushed image 'products:latest' to local registry via 'docker'.
Polecenie odczytuje plik rozwiązania, ustalił, że zawiera trzy projekty, skompilowane i utworzone obrazy dla projektów sklepu i produktów. Obrazy są nazwane po projektach i publikowane w lokalnym rejestrze platformy Docker.
Sprawdź, czy obrazy są dostępne na platformie Docker:
docker images
Zobaczysz dane wyjściowe podobne do następujących komunikatów:
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 About a minute ago 293MB store latest e9458c3abdb1 About a minute ago 218MB
Tworzenie obrazu zaplecza Products za pomocą pliku Dockerfile
Jeśli chcesz mieć większą kontrolę nad sposobem tworzenia obrazów, możesz użyć pliku Dockerfile do utworzenia obrazu dla usługi internetowej Products.
W okienku EKSPLORATOR utwórz plik o nazwie Dockerfile w pliku ./dotnet-docker/Products. Plik jest pusty.
Wprowadź następujące kod:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /DataEntities COPY "DataEntities/DataEntities.csproj" . RUN dotnet restore COPY "DataEntities" . RUN dotnet publish -c release -o /app
Po wykonaniu poniższych kroków ten kod skonfiguruje bibliotekę DataEntities w obrazie platformy Docker Products:
- Pobierz obraz i nadaj
mcr.microsoft.com/dotnet/sdk:8.0
obrazowibuild
nazwę . - Ustaw katalog roboczy w obrazie na
/DataEntities
wartość . - Skopiuj plik o nazwie DataEntities.csproj znaleziony lokalnie do utworzonego
/DataEntities
katalogu. - Wywołaj projekt
dotnet restore
. - Skopiuj wszystko w lokalnym katalogu DataEntities do obrazu.
- Wywołaj projekt
dotnet publish
.
- Pobierz obraz i nadaj
Bezpośrednio poniżej ostatniego wiersza wprowadź następujący kod:
WORKDIR /src COPY Products/Products.csproj . RUN dotnet restore COPY Products . RUN dotnet publish -c release -o /app
Ten kod wykonuje następujące kroki sekwencyjnie po wywołaniu:
- Ustaw katalog roboczy w obrazie na
/src
wartość . - Skopiuj plik o nazwie Products.csproj znaleziony lokalnie do utworzonego
/src
katalogu. - Wywołaj projekt
dotnet restore
. - Skopiuj wszystko w lokalnym katalogu Products do obrazu.
- Wywołaj projekt
dotnet publish
.
- Ustaw katalog roboczy w obrazie na
Bezpośrednio poniżej ostatniego wiersza wprowadź następujący kod:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build /app . ENTRYPOINT ["dotnet", "Products.dll"]
Ten kod wykonuje następujące kroki sekwencyjnie po wywołaniu:
- Przeciągnij
mcr.microsoft.com/dotnet/aspnet:8.0
obraz. - Ustaw katalog roboczy w obrazie na
/app
wartość . - Uwidaczniaj port 80 i 443.
- Skopiuj wszystko z katalogu aplikacji obrazu kompilacji utworzonego do katalogu aplikacji tego obrazu.
- Ustaw punkt wejścia tego obrazu na
dotnet
i przekażProducts.dll
go jako argument.
- Przeciągnij
Tworzenie obrazu platformy Docker
Po ukończeniu pliku Dockerfile następnym krokiem jest użycie go do utworzenia obrazu platformy Docker:
Aby utworzyć obraz dla usługi zaplecza Products, przejdź do karty TERMINAL i uruchom następujące polecenie:
cd ./dotnet-docker docker build -t productsbackend:latest -f Products/Dockerfile .
Spowoduje to uruchomienie poleceń w pliku Dockerfile w bieżącym katalogu i zastosowanie tagu productsbackend:latest do wynikowego obrazu.
Po dużej ilości danych wyjściowych obraz zostanie skompilowany. Wprowadzenie
docker images
spowoduje wyświetlenie listy wszystkich obrazów w przestrzeni kodu, w tym productsbackend. Drugi obraz jest jednym dla samej przestrzeni kodu.Zobaczysz dane wyjściowe podobne do następujących komunikatów:
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 10 minutes ago 293MB store latest e9458c3abdb1 10 minutes ago 218MB productsbackend latest 190783f7e06f About a minute ago 293MB
Zastanów się nad różnicą między użyciem i dotnet publish
koniecznością ręcznego utworzenia plików Dockerfile dla każdej mikrousługi w aplikacjach.
Uruchamianie kontenera i testowanie usługi
Teraz możesz użyć obrazu, aby uruchomić i hostować usługę Products.
Aby utworzyć i uruchomić kontener na podstawie obrazu nowych produktów i uwidocznić usługę na porcie 32001, uruchom następujące polecenie:
docker run -it --rm -p 32001:8080 products
Lub jeśli chcesz uruchomić obraz utworzony przy użyciu pliku Dockerfile, uruchom polecenie:
docker run -it --rm -p 32001:8080 productsbackend
Aby przetestować usługę, przejdź do karty PORTY , a następnie po prawej stronie adresu lokalnego dla portu zaplecza wybierz ikonę globusa. Przeglądarka otwiera nową kartę pod tym adresem.
Aby wykonać zapytanie dotyczące niektórych produktów, dołącz adres za pomocą polecenia /api/product , a następnie naciśnij klawisz Enter. Powinny zostać wyświetlone informacje o produkcie w formacie JSON.
[ { "id": 1, "name": "Solar Powered Flashlight", "description": "A fantastic product for outdoor enthusiasts", "price": 19.99, "imageUrl": "product1.png" }, { "id": 2, "name": "Hiking Poles", "description": "Ideal for camping and hiking trips", "price": 24.99, "imageUrl": "product2.png" }, { "id": 3, "name": "Outdoor Rain Jacket", "description": "This product will keep you warm and dry in all weathers", "price": 49.99, "imageUrl": "product3.png" }, ... ]