Docker e C#: guia completo para conteinerização de aplicações .NET
A conteinerização tornou-se o padrão de facto para a implantação de aplicações modernas. Se você desenvolve em C# (.NET), o Docker permite empacotar sua aplicação junto com todas as suas dependências em um contêiner leve e isolado. Neste artigo, percorreremos o caminho desde a criação de um Dockerfile simples até a publicação e execução de uma imagem pronta. Você aprenderá como conteinerizar uma aplicação em C#, otimizar o tamanho da imagem e usar as melhores práticas.
1. Fundamentos do Docker para o desenvolvedor .NET
Docker é uma plataforma para desenvolvimento, entrega e execução de aplicações em contêineres. Um contêiner é uma unidade padronizada de software que inclui o código e todas as suas dependências. Ao contrário das máquinas virtuais, os contêineres compartilham o kernel do sistema operacional, tornando-os mais rápidos e leves.
Para C# (.NET), o Docker é especialmente útil, pois resolve o problema "funciona na minha máquina" — você garante que a aplicação se comportará da mesma forma na máquina do desenvolvedor, no servidor de teste e em produção. Os principais componentes são:
- Docker Engine — ambiente de execução de contêineres
- Dockerfile — arquivo de texto com instruções para construir a imagem
- Imagem (Image) — modelo imutável para criar contêineres
- Contêiner (Container) — instância em execução de uma imagem
Instale o Docker Desktop para Windows/Mac ou o Docker Engine para Linux. Após a instalação, verifique o funcionamento com o comando:
docker --version2. Criando um Dockerfile para aplicação C# (.NET)
Vamos começar com uma aplicação simples ASP.NET Core Web API. Crie um novo projeto:
dotnet new webapi -n MyDockerAppcd MyDockerAppAgora, crie um arquivo Dockerfile (sem extensão) na raiz do projeto. Aqui está uma versão básica com construção em múltiplos estágios (multi-stage build):
# Estágio 1: construção da aplicaçãoFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /src
# Copiamos o csproj e restauramos as dependênciasCOPY ["MyDockerApp.csproj", "."]RUN dotnet restore
# Copiamos o restante do código e compilamos o projetoCOPY . .RUN dotnet publish -c Release -o /app/publish
# Estágio 2: criação de uma imagem mínima para execuçãoFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appEXPOSE 80EXPOSE 443
# Copiamos a aplicação compilada do primeiro estágioCOPY --from=build /app/publish .
# Ponto de entradaENTRYPOINT ["dotnet", "MyDockerApp.dll"]Explicação das instruções principais:
FROM— define a imagem base (SDK para construção, ASP.NET para execução)WORKDIR— define o diretório de trabalhoCOPY— copia arquivos do contexto de construção para a imagemRUN dotnet restore— restaura os pacotes NuGetRUN dotnet publish— compila e publica a aplicaçãoEXPOSE— indica as portas que o contêiner irá escutarENTRYPOINT— comando executado ao iniciar o contêiner
A construção em múltiplos estágios é criticamente importante para C#: a imagem final contém apenas o runtime e sua aplicação, sem o SDK e os fontes. Isso reduz o tamanho da imagem de ~1,5 GB para ~200 MB.
3. Construção e execução do contêiner
Construa a imagem Docker:
docker build -t my-dotnet-app:latest .A flag -t define a tag (nome:versão). O ponto no final indica o diretório atual como contexto de construção.
Execute o contêiner:
docker run -d -p 8080:80 --name my-app my-dotnet-app:latestParâmetros:
-d— execução em segundo plano (detached)-p 8080:80— redirecionamento de porta: porta do host 8080