Exercício - Crie uma imagem de contêiner para seu microsserviço .NET
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:
- Instale todos os requisitos do sistema para executar o Dev Container no Visual Studio Code.
- Verifique se o Docker está em execução.
- Em uma nova janela do Visual Studio Code, abra a pasta do repositório clonado
- Pressione Ctrl+Shift+P para abrir a paleta de comandos.
- Pesquisa: >Contêineres de desenvolvimento: reconstruir e reabrir no contêiner
- 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.
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.
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.
No painel EXPLORER, crie um arquivo chamado Dockerfile em ./dotnet-docker/Products. O ficheiro está vazio.
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 imagembuild
. - 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.
- Puxe a
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.
- Defina o diretório de trabalho dentro da imagem como
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 passeProducts.dll
como um argumento.
- Puxe a
Criar a imagem do Docker
Depois de concluir o Dockerfile, a próxima etapa é usá-lo para criar uma imagem do Docker:
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.
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.
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
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.
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" }, ... ]