Cvičení – vytvoření image kontejneru pro mikroslužbu .NET
V tomto cvičení vytvoříte koncový bod mikroslužby a kontejnerizujete ho pomocí sady .NET SDK a Dockeru.
Poznámka
Toto cvičení můžete dokončit v instanci GitHub Codespaces, která má předinstalované Docker a .NET SDK. Pokud tyto nástroje a techniky používáte ve vlastním vývojovém prostředí, ujistěte se, že máte nainstalované tyto požadavky.
Otevření vývojového prostředí
Můžete použít codespace GitHubu, který je hostitelem cvičení, nebo cvičení dokončit místně v editoru Visual Studio Code.
Chcete-li použít codespace, vytvořte předem nakonfigurovaný GitHub Codespace s tento odkaz pro vytvoření Codespace.
Vytvoření a konfigurace prostoru kódu na GitHubu trvá několik minut. Po dokončení procesu se zobrazí soubory kódu pro cvičení. Kód použitý pro zbytek tohoto modulu je v adresáři /dotnet-docker.
Pro použití Visual Studio Codenaklonujte úložiště https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative do místního počítače. Potom:
- Nainstalujte všechny požadavky na systém ke spuštění vývojového kontejneru v editoru Visual Studio Code.
- Ujistěte se, že je Docker spuštěný.
- V novém okně editoru Visual Studio Code otevřete složku klonovaného úložiště.
- Stisknutím kláves Ctrl+Shift+P otevřete paletu příkazů.
- Hledání: >Dev Containers: Opětovné sestavení a opětovné otevření v kontejneru
- V rozevíracím seznamu vyberte eShopLite – dotnet-docker. Visual Studio Code vytvoří vývojový kontejner místně.
Použijte příkaz .NET publish k vytvoření obrazu back-endu produktů.
Nejnovější verze .NET 8 zlepšuje podporu kontejnerizace. K vytvoření image Dockeru pro mikroslužby můžete použít příkaz dotnet publish
. Příkaz vytvoří image kontejneru bez root oprávnění, která spouští služby pod účtem app
. Spouštění rootless kontejnerů je skvělé pro zabezpečení a výkon. Příkaz ví, jak vybrat nejlepší základní image tím, že zkontroluje nastavení v souboru projektu.
Pokud chcete vytvořit image pro všechny služby eShopLite, přejděte na kartu TERMINAL a spusťte tento příkaz:
cd ./dotnet-docker dotnet publish /p:PublishProfile=DefaultContainer
Zobrazí se výstup podobný následujícím zprávům:
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'.
Příkaz přečte soubor řešení, určil, že obsahuje tři projekty, vytvořil je a vytvořil obrázky pro projekty obchodu a produktů. Obrazy jsou pojmenovány po projektech a publikovány do místního registru Dockeru.
Zkontrolujte, jestli jsou image dostupné v Dockeru:
docker images
Zobrazí se výstup podobný následujícím zprávům:
REPOSITORY TAG IMAGE ID CREATED SIZE products latest 63614e340088 About a minute ago 293MB store latest e9458c3abdb1 About a minute ago 218MB
Použijte Dockerfile k vytvoření obrazu back-endu Products
Pokud chcete mít větší kontrolu nad vytvářením imagí, můžete pomocí souboru Dockerfile vytvořit image pro webovou službu Products.
V podokně EXPLORER vytvořte soubor s názvem dockerfile v ./dotnet-docker/Products. Soubor je prázdný.
Zadejte následující kód:
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 dokončení následujících kroků tento kód nastaví knihovnu DataEntities v Docker image produktu Products.
- Stáhněte
mcr.microsoft.com/dotnet/sdk:8.0
image a pojmenujte imagebuild
. - Nastavte pracovní adresář v rámci image na
/DataEntities
. - Zkopírujte soubor s názvem DataEntities.csproj nalezen místně do
/DataEntities
adresáře, který jste vytvořili. - Zavolejte ohledně projektu
dotnet restore
. - Zkopírujte všechno v místním adresáři DataEntities do image.
- Zavolejte na projekt
dotnet publish
.
- Stáhněte
Přímo pod posledním řádkem zadejte tento kód:
WORKDIR /src COPY Products/Products.csproj . RUN dotnet restore COPY Products . RUN dotnet publish -c release -o /app
Tento kód provede následující kroky postupně při vyvolání:
- Nastavte pracovní adresář v rámci image na
/src
. - Zkopírujte soubor s názvem Products.csproj nalezen místně do
/src
adresáře, který jste vytvořili. - Zavolejte na projekt "
dotnet restore
". - Zkopírujte všechno v místním adresáři Products do image.
- Zavolejte na projekt
dotnet publish
.
- Nastavte pracovní adresář v rámci image na
Přímo pod posledním řádkem zadejte tento kód:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app EXPOSE 80 EXPOSE 443 COPY --from=build /app . ENTRYPOINT ["dotnet", "Products.dll"]
Tento kód provede následující kroky postupně při vyvolání:
- Stáhněte obrázek
mcr.microsoft.com/dotnet/aspnet:8.0
. - Nastavte pracovní adresář v rámci image na
/app
. - Otevřít porty 80 a 443
- Zkopírujte všechno z adresáře aplikace sestavení image, kterou jste vytvořili, do adresáře aplikace této image.
- Nastavte vstupní bod tohoto obrázku na
dotnet
a předejteProducts.dll
jako argument.
- Stáhněte obrázek
Vytvoření image Dockeru
Po dokončení souboru Dockerfile je dalším krokem jeho použití k vytvoření image Dockeru:
Pokud chcete vytvořit image back-endové služby Products, přejděte na kartu TERMINAL a spusťte tento příkaz:
cd ./dotnet-docker docker build -t productsbackend:latest -f Products/Dockerfile .
Tím se spustí příkazy v souboru Dockerfile v aktuálním adresáři a použije se značka productsbackend:latest na výslednou image.
Po mnoha výstupech bude obraz sestaven. Zadáním
docker images
zobrazíte seznam všech obrázků ve vašem prostoru kódu, včetně productsbackend. Druhý obrázek je ten, který je určený pro samotný codespace.Zobrazí se výstup podobný následujícím zprávům:
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
Zamyslete se nad rozdílem mezi používáním dotnet publish
a ručním vytvořením souborů Dockerfile pro každou mikroslužbu ve vašich aplikacích.
Spuštění kontejneru a otestování služby
Teď můžete image použít ke spuštění a hostování služby Products.
Pokud chcete vytvořit a spustit kontejner z nových produktů image a zpřístupnit službu na portu 32001, spusťte tento příkaz:
docker run -it --rm -p 32001:8080 products
Nebo pokud chcete spustit image, kterou jste vytvořili pomocí souboru Dockerfile, spusťte:
docker run -it --rm -p 32001:8080 productsbackend
Pokud chcete službu otestovat, přepněte na kartu PORTY a pak napravo od místní adresy pro port Back End vyberte ikonu zeměkoule. V prohlížeči se na této adrese otevře nová karta.
Pokud chcete zadat dotaz na některé produkty, připojte adresu pomocí /api/ produktu a stiskněte Enter. Měly by se zobrazit některé informace o produktu ve formátu 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" }, ... ]