Implantação em um contêiner e Docker Hub - Curso de criação de uma API de exemplo em C#
Implantar uma aplicação .NET Core em um contêiner Docker é uma habilidade crucial para desenvolvedores modernos. Os contêineres oferecem infraestrutura imutável, fácil distribuição e ambientes de execução leves. Neste guia detalhado, vamos mostrar como implantar uma API de exemplo em um contêiner Docker e, em seguida, publicá-la no Docker Hub, seguindo os passos demonstrados no tutorial em vídeo abrangente de Tim Corey: " Implantando em um Contêiner e no Docker Hub – Criando uma API de Exemplo em C# ".
Vamos explorar o processo passo a passo, referenciando horários específicos para facilitar o acompanhamento. Este guia inclui o uso de comandos como dotnet publish, o comando docker run e termos como imagem base, imagem de tempo de execução e imagem de contêiner — todos conceitos importantes para implantar um aplicativo .NET usando o Docker.
Criando e compreendendo a API de exemplo
No início do vídeo, Tim destaca a utilidade de um aplicativo de exemplo ao aprender desenvolvimento web. O aplicativo inclui endpoints como /courses e /health, simula problemas do mundo real, como verificações de integridade degradadas, e foi projetado para ser executado tanto em sua máquina local quanto em um servidor remoto.
Este é um aplicativo .NET Core (mais precisamente, uma API ASP.NET Core mínima) que pode ser executado e testado facilmente por meio de contêineres Docker.
Configurando o Docker localmente
Tim verifica se o Docker está instalado em sua máquina local, usando o Docker Desktop. Ele observa que é possível publicar diretamente no Docker Hub sem o Docker instalado localmente, mas, para fins de demonstração, ele começa com a implantação local.
Ele mostra duas imagens Docker pré-instaladas:
-
Uma ferramenta pessoal para legendas
- A imagem base oficial do ASP.NET Core da Microsoft: mcr.microsoft.com/dotnet/aspnet
Essa imagem base tem cerca de 328 MB e serve como alicerce para nossa imagem de contêiner. A Microsoft hospeda essas imagens em seu MCR (Microsoft Container Registry) e oferece suporte tanto a contêineres Linux quanto a contêineres Windows. Para este projeto, o Linux é o sistema operacional alvo.
Publicando em um contêiner localmente
Tim navega até a pasta do projeto da API e executa o seguinte comando na linha de comando:
dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer
Este comando utiliza o suporte integrado a contêineres no .NET 8 e .NET 9, eliminando a necessidade de um Dockerfile. O processo de publicação seleciona uma imagem de tempo de execução adequada e cria uma imagem de contêiner autocontida.
Eis o que acontece nos bastidores:
-
O arquivo de projeto (.csproj) é usado para construir a API.
-
As dependências são restauradas usando o comando dotnet restore
-
O resultado é direcionado para uma pasta de publicação.
- Um arquivo DLL é gerado e incorporado ao contêiner.
A imagem resultante tem cerca de 333 MB (apenas 5 MB a mais que a imagem base).
Executando a imagem com o Docker
Após a criação da imagem, Tim utiliza o Docker Desktop para executar o contêiner. Internamente, o aplicativo escuta na porta 8080. Tim mapeia essa porta para uma porta de host aleatória, inserindo 0 na configuração da porta.
O contêiner é iniciado com um nome aleatório (por exemplo, elegant_hoover) e o navegador é aberto exibindo uma API funcional com "Olá Mundo" como resposta padrão.
Ao navegar até /courses e /health, Tim confirma que a API está funcionando. O endpoint de verificação de integridade é útil para simular um cenário de ambiente de produção.
Para visualizar os contêineres em execução, você pode usar o comando docker ps na CLI. Tim exclui o contêiner e a imagem em execução em seguida para demonstrar a limpeza.
Criando um repositório no Docker Hub
Em seguida, Tim passa para a parte de implantação na nuvem. Ele acessa sua conta do Docker Hub e cria um repositório público chamado thesampleapi.
É aqui que a imagem Docker será enviada para que outros possam baixá-la usando:
docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest
Configurando o projeto para o Docker Hub
Dentro do arquivo de projeto da API, Tim adiciona metadados para definir onde e como publicar a imagem Docker. Ele adiciona o seguinte bloco de código:
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>
-
ContainerRegistry: Especifica o Docker Hub como o registro de destino.
-
ContainerRepository: O caminho para o repositório do Docker Hub.
- ContainerImageTags: Marca a imagem para controle de versão e a versão mais recente.
Isso prepara a imagem para um fluxo de construção em várias etapas no futuro, embora Tim esteja mantendo as coisas simples por enquanto.
Publicando no Docker Hub
Tim executa o mesmo comando de publicação novamente:
dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer
Inicialmente, o envio falha porque ele se esqueceu de salvar o arquivo .csproj. Após salvar e executar o comando novamente, a imagem é enviada com sucesso para o Docker Hub.
No Docker Hub, as tags "latest" e "1.0.0" aparecem no repositório thesampleapi. Essas etiquetas permitem flexibilidade na seleção de versões específicas.
Obtendo a imagem do Docker Hub
Tim demonstra como extrair a imagem de qualquer máquina com o Docker instalado:
docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest
Graças ao cache de camadas do Docker, a imagem é baixada rapidamente, já que a maior parte dela já existe na imagem base.
Para executar a imagem:
docker run -p 0:8080 timcorey/thesampleapi:latest
docker run -p 0:8080 timcorey/thesampleapi:latest
Isso mapeia uma porta de host aleatória para a porta interna 8080.
Criando uma nova versão da imagem
Para demonstrar o controle de versões, Tim edita o arquivo .csproj para:
<ContainerImageTags>1.0.1;latest</ContainerImageTags>
<ContainerImageTags>1.0.1;latest</ContainerImageTags>
Em seguida, ele executa novamente o comando de publicação:
dotnet publish -p:PublishProfile=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer
Agora o repositório do Docker Hub exibe três tags:
-
1.0.0
-
1.0.1
- mais recente (agora apontando para 1.0.1)
Tim explica que, apesar das múltiplas tags, o Docker não armazena camadas duplicadas, otimizando o uso do disco por meio de camadas distintas.
Utilizando a imagem Docker para desenvolvimento local
Tim enfatiza que, uma vez que a imagem esteja no Docker Hub, você pode executá-la a qualquer momento em qualquer máquina usando:
docker pull timcorey/thesampleapi:latest
docker pull timcorey/thesampleapi:latest
Em seguida, use o comando docker run para iniciar o serviço. Quando terminar, faça a limpeza com:
docker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the image
docker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the image
Ele explica que isso o torna perfeito para desenvolvimento e testes sob demanda, sem sobrecarregar sua máquina local.
Qual o próximo passo?
Tim conclui mencionando o próximo passo: implantar essa mesma API em um Servidor Virtual Privado (VPS). Ele vai explicar passo a passo como mapear um domínio e configurar o contêiner para que seja acessível publicamente.
Conclusão: Da compilação local à implantação na nuvem
Utilizando o guia em vídeo de Tim Corey, nós:
-
Criei uma API .NET Core usando o comando dotnet new console.
-
Utilizei os comandos
dotnet restoreedotnet publishpara compilar e implantar. -
Criei um contêiner Docker sem precisar de um Dockerfile de exemplo.
-
A imagem do contêiner foi carregada no Docker Hub.
-
Baixei e executei o contêiner usando o comando
docker run. -
Gerenciamento de tags e camadas de imagem distintas
- Preparado para ambientes de produção usando imagens versionadas
Esse fluxo de trabalho, centrado em Docker e .NET, é perfeito para criar aplicativos escaláveis, testáveis e compartilháveis.
