Exercício - Crie uma imagem de contêiner para seu microsserviço .NET

Concluído

Neste exercício, você cria um ponto de extremidade de microsserviço e o conteineriza usando o SDK do .NET e o Docker.

Nota

Você pode concluir este exercício em uma instância do GitHub Codespaces que tenha o Docker e o SDK do .NET pré-instalados. Ao usar essas ferramentas e técnicas em seu próprio ambiente de desenvolvimento, certifique-se de ter esses pré-requisitos instalados.

Abra o ambiente de desenvolvimento

Você pode optar por usar um espaço de código GitHub que hospeda o exercício ou concluí-lo localmente no Visual Studio Code.

Para usar um codespace, crie um Codespace GitHub pré-configurado com este link de criação do Codespace.

O GitHub leva vários minutos para criar e configurar o espaço de código. Quando o processo for concluído, você verá os arquivos de código para o exercício. O código usado para o restante deste módulo está no diretório /dotnet-docker .

Para usar o Visual Studio Code, clone o https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative repositório para sua máquina local. Em seguida:

  1. Instale todos os requisitos do sistema para executar o Dev Container no Visual Studio Code.
  2. Verifique se o Docker está em execução.
  3. Em uma nova janela do Visual Studio Code, abra a pasta do repositório clonado
  4. Pressione Ctrl+Shift+P para abrir a paleta de comandos.
  5. Pesquisa: >Contêineres de desenvolvimento: reconstruir e reabrir no contêiner
  6. Selecione eShopLite - dotnet-docker na lista suspensa. O Visual Studio Code cria seu contêiner de desenvolvimento localmente.

Use a publicação .NET para criar a imagem de back-end de Produtos

A versão mais recente do .NET 8 melhora o suporte à conteinerização. Você pode usar o dotnet publish comando para criar uma imagem do Docker para seus microsserviços. O comando cria uma imagem de contêiner sem raiz que executa serviços em uma app conta. Executar contêineres sem raiz é ótimo para segurança e desempenho. O comando sabe como escolher a melhor imagem base, verificando as configurações no arquivo de projeto.

  1. Para criar as imagens para todos os eShopLite serviços, vá para a guia TERMINAL e execute este comando:

    cd ./dotnet-docker 
     dotnet publish /p:PublishProfile=DefaultContainer
    

    Você vê a saída como as seguintes mensagens:

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

    O comando lê o arquivo de solução, determina que ele contém três projetos, cria-os e cria imagens para os projetos de loja e produtos. As imagens são nomeadas após os projetos e publicadas no registro docker local.

  2. Verifique se as imagens estão disponíveis no docker:

    docker images
    

    Você vê a saída como as seguintes mensagens:

    REPOSITORY                          TAG       IMAGE ID       CREATED              SIZE
    products                            latest    63614e340088   About a minute ago   293MB
    store                               latest    e9458c3abdb1   About a minute ago   218MB
    

Usar um Dockerfile para criar a imagem de back-end dos Produtos

Se quiser ter mais controle sobre como as imagens são criadas, você pode usar um Dockerfile para criar uma imagem para o serviço Web Produtos.

  1. No painel EXPLORER, crie um arquivo chamado Dockerfile em ./dotnet-docker/Products. O ficheiro está vazio.

  2. Introduza o seguinte código:

    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
    

    Depois de concluir as etapas a seguir, esse código configurará a biblioteca DataEntities na imagem do docker de Produtos:

    • Puxe a mcr.microsoft.com/dotnet/sdk:8.0 imagem e nomeie a imagem build.
    • Defina o diretório de trabalho dentro da imagem como /DataEntities.
    • Copie o arquivo chamado DataEntities.csproj encontrado localmente para o /DataEntities diretório que você criou.
    • Ligue dotnet restore para o projeto.
    • Copie tudo no diretório DataEntities local para a imagem.
    • Ligue dotnet publish para o projeto.
  3. Diretamente abaixo da última linha, insira este código:

     WORKDIR /src
     COPY Products/Products.csproj .
     RUN dotnet restore
     COPY Products .
     RUN dotnet publish -c release -o /app
    

    Esse código executa as seguintes etapas sequencialmente quando invocado:

    • Defina o diretório de trabalho dentro da imagem como /src.
    • Copie o arquivo chamado Products.csproj encontrado localmente para o /src diretório que você criou.
    • Ligue dotnet restore para o projeto.
    • Copie tudo no diretório Produtos local para a imagem.
    • Ligue dotnet publish para o projeto.
  4. Diretamente abaixo da última linha, insira este código:

     FROM mcr.microsoft.com/dotnet/aspnet:8.0
     WORKDIR /app
     EXPOSE 80
     EXPOSE 443
     COPY --from=build /app .
     ENTRYPOINT ["dotnet", "Products.dll"]
    

    Esse código executa as seguintes etapas sequencialmente quando invocado:

    • Puxe a mcr.microsoft.com/dotnet/aspnet:8.0 imagem.
    • Defina o diretório de trabalho dentro da imagem como /app.
    • Exponha as portas 80 e 443.
    • Copie tudo do diretório do aplicativo da imagem de compilação que você criou para o diretório do aplicativo desta imagem.
    • Defina o ponto de entrada desta imagem para dotnet e passe Products.dll como um argumento.

Criar a imagem do Docker

Depois de concluir o Dockerfile, a próxima etapa é usá-lo para criar uma imagem do Docker:

  1. Para criar a imagem para o serviço back-end de Produtos, vá para a guia TERMINAL e execute este comando:

    cd ./dotnet-docker 
     docker build -t productsbackend:latest -f Products/Dockerfile .
    

    Isso executa os comandos no Dockerfile no diretório atual e aplica a tag productsbackend:latest à imagem resultante.

  2. Depois de muita saída, a imagem será construída. Inserir docker images mostra uma lista de todas as imagens em seu espaço de código, incluindo productsbackend. A outra imagem é a do próprio codespace.

    Você vê a saída como as seguintes mensagens:

    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
    

Pense na diferença entre usar dotnet publish e ter que criar manualmente os Dockerfiles para cada microsserviço em seus aplicativos.

Execute o contêiner e teste o serviço

Agora você pode usar a imagem para executar e hospedar o serviço de Produtos.

  1. Para criar e executar um contêiner a partir da imagem de novos produtos e expor o serviço na porta 32001, execute este comando:

    docker run -it --rm -p 32001:8080  products
    

    Ou se você quiser executar a imagem que criou usando o Dockerfile, execute:

    docker run -it --rm -p 32001:8080 productsbackend
    
  2. Para testar o serviço, alterne para a guia PORTS e, em seguida, à direita do endereço local da porta de back-end , selecione o ícone de globo. O navegador abre um novo separador nesse endereço.

    Captura de tela mostrando como se conectar ao serviço de produtos de back-end.

  3. Para consultar alguns produtos, acrescente o endereço com /api/product e pressione Enter. Você deve ver algumas informações do produto listadas no formato 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"
        },
        ...
    ]