Ir para o conteúdo do rodapé
Iron Academy Logo
Aplicação C#
Aplicação C#

Outras categorias

Implantação em um contêiner e Docker Hub - Curso de criação de uma API de exemplo em C#

Tim Corey
23m 51s

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 restore e dotnet publish para 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.

Hero Worlddot related to Implantação em um contêiner e Docker Hub - Curso de criação de uma API de exemplo em C#
Hero Affiliate related to Implantação em um contêiner e Docker Hub - Curso de criação de uma API de exemplo em C#

Ganhe mais compartilhando o que você ama.

Você cria conteúdo para desenvolvedores que trabalham com .NET, C#, Java, Python ou Node.js? Transforme sua expertise em renda extra!

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim