Cvičení – vytvoření image kontejneru pro mikroslužbu .NET

Dokončeno

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:

  1. Nainstalujte všechny požadavky na systém ke spuštění vývojového kontejneru v editoru Visual Studio Code.
  2. Ujistěte se, že je Docker spuštěný.
  3. V novém okně editoru Visual Studio Code otevřete složku klonovaného úložiště.
  4. Stisknutím kláves Ctrl+Shift+P otevřete paletu příkazů.
  5. Hledání: >Dev Containers: Opětovné sestavení a opětovné otevření v kontejneru
  6. 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.

  1. 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.

  2. 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.

  1. V podokně EXPLORER vytvořte soubor s názvem dockerfile v ./dotnet-docker/Products. Soubor je prázdný.

  2. 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 image build.
    • 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.
  3. 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.
  4. 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ředejte Products.dll jako argument.

Vytvoření image Dockeru

Po dokončení souboru Dockerfile je dalším krokem jeho použití k vytvoření image Dockeru:

  1. 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.

  2. 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.

  1. 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
    
  2. 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.

    snímek obrazovky znázorňující, jak se připojit ke službě backendových produktů

  3. 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"
        },
        ...
    ]