Implantar aplicativos .NET existentes como contêineres do Windows
Implantações baseadas em Windows contêineres são aplicáveis Cloud-Optimized aplicativos Cloud-Native aplicativos.
No entanto, neste guia e especialmente nas seções a seguir, ele se concentra principalmente no uso de contêineres do Windows para aplicativos otimizados para nuvem em que você não precisa rearquitetar seu aplicativo.
O que são contêineres? (Linux ou Windows)
Contêineres são uma maneira de envolver um aplicativo em seu próprio pacote isolado. Em seu contêiner, o aplicativo não é afetado por aplicativos ou processos que existem fora do contêiner. Tudo o que o aplicativo depende para ser executado com êxito, pois um processo está dentro do contêiner. Onde quer que o contêiner possa se mover, os requisitos do aplicativo sempre serão atendidos, em termos de dependências diretas, porque ele é agrupado com tudo o que ele precisa para ser executado (dependências de biblioteca, runtimes e assim por diante).
A principal característica de um contêiner é que ele torna o ambiente o mesmo em diferentes implantações porque o próprio contêiner vem com todas as dependências de que precisa. Você pode depurar o aplicativo em seu computador e implantá-lo em outro computador, com o mesmo ambiente garantido.
Um contêiner é uma instância de uma imagem de contêiner. Uma imagem de contêiner é uma maneira de empacotar um aplicativo ou serviço (como um instantâneo) e implantá-la de maneira confiável e reproduzível. Você pode dizer que o Docker não é apenas uma tecnologia, mas também uma filosofia e um processo.
À medida que os contêineres se tornam mais comuns diariamente, eles estão se tornando uma "unidade de implantação" em todo o setor.
Benefícios dos contêineres (Mecanismo do Docker no Linux ou Windows)
A criação de aplicativos usando contêineres – que também podem ser definidos como blocos de construção leves – oferece um aumento significativo na agilidade para criar, enviar e executar qualquer aplicativo em qualquer infraestrutura.
Com contêineres, você pode levar qualquer aplicativo do desenvolvimento para a produção com pouca ou nenhuma alteração de código, graças à integração do Docker entre ferramentas de desenvolvedor da Microsoft, sistemas operacionais e nuvem.
Ao implantar em VMs simples, você provavelmente já tem um método em uso para implantar ASP.NET aplicativos em suas VMs. No entanto, é provável que seu método envolva várias etapas manuais ou processos automatizados complexos usando uma ferramenta de implantação como o Puppet ou uma ferramenta semelhante. Talvez seja necessário executar tarefas como modificar itens de configuração, copiar o conteúdo do aplicativo entre servidores e executar programas de instalação interativa com base em .msi configurações, seguidas por testes. Todas essas etapas na implantação adicionam tempo e risco às implantações. Você receberá falhas sempre que uma dependência não estiver presente no ambiente de destino.
No Windows Contêineres, o processo de empacotamento de aplicativos é totalmente automatizado. Windows Contêineres é baseado na plataforma do Docker, que oferece atualizações e revasões automáticas para implantações de contêiner. A principal melhoria que você recebe ao usar o mecanismo do Docker é que você cria imagens, que são como instantâneos do seu aplicativo, com todas as suas dependências. As imagens são imagens do Docker (uma Windows de contêiner, nesse caso). As imagens são ASP.NET aplicativos em contêineres, sem voltar ao código-fonte. O instantâneo do contêiner se torna a unidade de implantação.
Muitas organizações estão conteinerizando aplicativos monolíticos existentes pelos seguintes motivos:
Agilidade de lançamento por meio da implantação aprimorada. Os contêineres oferecem um contrato de implantação consistente entre o desenvolvimento e as operações. Ao usar contêineres, você não ouvirá os desenvolvedores dizerem: "Ele funciona em meu computador, por que não em produção?" Eles podem dizer: "Ele é executado como um contêiner, portanto, ele será executado em produção". O aplicativo empacotado, com todas as suas dependências, pode ser executado em qualquer ambiente baseado em contêiner com suporte. Ele será executado da maneira como foi destinado a ser executado em todos os destinos de implantação (desenvolvimento, qa, preparação, produção). Os contêineres eliminam a maioria dos atritos quando eles se movem de um estágio para o outro, o que melhora muito a implantação e você pode enviar mais rapidamente.
Reduções de custo. Os contêineres levam a custos menores, seja pela consolidação e remoção do hardware existente ou pela execução de aplicativos em uma densidade mais alta por unidade de hardware.
Portabilidade. Os contêineres são modulares e portáteis. Os contêineres do Docker têm suporte em qualquer sistema operacional de servidor (Linux e Windows), em qualquer nuvem pública principal (Microsoft Azure, Amazon AWS, Google, IBM) e em ambientes locais e de nuvem privada ou híbrida.
Controlar. Os contêineres oferecem um ambiente flexível e seguro que é controlado no nível do contêiner. Um contêiner pode ser protegido, isolado e até mesmo limitado definindo políticas de restrição de execução no contêiner. Conforme detalhado na seção sobre contêineres Windows, Windows Server 2016 e hyper-V oferecem opções adicionais de suporte corporativo.
Melhorias significativas na agilidade, portabilidade e controle, em última análise, levam a reduções de custos significativas quando você usa contêineres para desenvolver e manter aplicativos.
O que é o Docker?
O Docker é um projeto de software livre que automatiza a implantação de aplicativos como contêineres portáteis e autossuficientes que podem ser executados na nuvem ou localmente. O Docker é também um empresa que promove e evolui essa tecnologia. A empresa trabalha em colaboração com fornecedores de nuvem, Linux e Windows, incluindo a Microsoft.

Figura 4-6. O Docker implanta contêineres em todas as camadas da nuvem híbrida
Para alguém familiarizado com máquinas virtuais, os contêineres podem parecer muito semelhantes. Um contêiner executa um sistema operacional, tem um sistema de arquivos e pode ser acessado por uma rede, assim como um sistema de computador físico ou virtual. No entanto, a tecnologia e os conceitos por trás dos contêineres são muito diferentes das máquinas virtuais. Do ponto de vista do desenvolvedor, um contêiner deve ser tratado mais como um único processo. Na verdade, um contêiner tem um único ponto de entrada para um processo.
Os contêineres do Docker (para simplificar, contêineres) podem ser executados na nativa no Linux e Windows. Ao executar contêineres regulares, Windows contêineres podem ser executados somente em hosts Windows (um servidor host ou uma VM) e os contêineres do Linux podem ser executados somente em hosts linux. No entanto, em versões recentes do Windows Server e contêineres do Hyper-V, um contêiner do Linux também pode ser executado na nativo no servidor Windows usando a tecnologia de isolamento do Hyper-V que atualmente está disponível apenas em contêineres do Windows Server.
Em um futuro próximo, ambientes mistos que têm contêineres linux e Windows serão possíveis e até mesmo comuns.
Benefícios de Windows contêineres para seus aplicativos .NET existentes
Os benefícios de usar Windows contêineres são fundamentalmente os mesmos benefícios que você recebe de contêineres em geral. Usar Windows contêineres é melhorar muito a agilidade, a portabilidade e o controle.
Os aplicativos .NET existentes referem-se aos aplicativos que foram criados usando o .NET Framework. Por exemplo, eles podem ser ASP.NET aplicativos Web tradicionais– eles não usam o .NET Core ou o .NET 5+, que é mais recente e é executado em plataforma cruzada no Linux, Windows e MacOS.
A dependência principal no .NET Framework é Windows. Ele também tem dependências secundárias, como o IIS e o System.Web, em ASP.NET.
Um .NET Framework aplicativo deve ser executado Windows, ponto final. Se você quiser conteinerizar aplicativos .NET Framework existentes e não puder ou não quiser investir em uma migração para o .NET Core ou posterior("Se funcionar corretamente, não migrá-los"), a única opção que você tem para contêineres é usar contêineres Windows.
Portanto, um dos principais benefícios dos contêineres Windows é que eles oferecem uma maneira de modernizar seus aplicativos .NET Framework existentes que estão sendo executados em Windows conteinerização. Por fim, Windows contêineres obtém os benefícios que você está procurando usando a agilidade dos contêineres, a portabilidade e o melhor controle.
Escolha um sistema operacional para direcionar com . Contêineres baseados em NET
Dada a diversidade de sistemas operacionais com suporte do Docker, bem como as diferenças entre o .NET Framework e o .NET Core, você deve direcionar um sistema operacional específico e versões específicas com base na estrutura que você está usando.
Para o Windows, é possível usar o Windows Server Core ou o Windows Nano Server. Essas Windows fornecem características diferentes (como o IIS versus um servidor Web auto-hospedado como Kestrel) que podem ser necessárias para aplicativos .NET Framework ou .NET.
Para Linux, várias distribuições estão disponíveis e há compatibilidade com elas nas imagens oficiais do .NET Docker (como Debian).
A Figura 4-7 mostra as versões do sistema operacional que você pode direcionar, dependendo da versão do aplicativo do .NET Framework.

Figura 4-7. Sistemas operacionais a ser destinados com base .NET Framework versão
Em cenários de migração para aplicativos existentes ou herdado baseados em aplicativos .NET Framework, as principais dependências estão no Windows e no IIS. Sua única opção é usar imagens do Docker com base Windows Server Core e o .NET Framework.
Ao adicionar o nome da imagem ao arquivo Dockerfile, você pode selecionar o sistema operacional e a versão usando uma marca, como nos exemplos a seguir para imagens de contêiner Windows baseadas em .NET Framework:
Tag Sistema e versão mcr.microsoft.com/dotnet/framework/runtime:4.x-windowsservercore-20H2 .NET Framework 4.x no Windows Server Core mcr.microsoft.com/dotnet/framework/aspnet:4.x-windowsservercore-20H2 .NET Framework 4.x com personalização de ASP.NET adicional, no Windows Server Core
Para .NET (plataforma cruzada para Linux e Windows), as marcas seriam como as seguintes:
Tag Sistema e versão mcr.microsoft.com/dotnet/runtime:5.0 Somente runtime do .NET no Linux mcr.microsoft.com/dotnet/runtime:5.0-nanoserver-20H2 Somente runtime do .NET no Windows Nano Server
Imagens de vários arcos
Desde 2017, o Docker tem um recurso chamado imagens de vários arcos. As imagens do Docker do .NET podem usar marcas de vários arcos. Os arquivos do Dockerfile não precisam mais definir o sistema operacional que você está direcionando. O recurso de vários arcos permite que uma única marca seja usada em várias configurações de computador. Por exemplo, com vários arcos, você pode usar uma marca comum: mcr.microsoft.com/dotnet/runtime:5.0. Se você receber essa marca de um ambiente de contêiner do Linux, obterá a imagem baseada em Debian. Se você receber essa marca de um ambiente Windows contêiner, obterá a imagem baseada no Nano Server.
Para .NET Framework imagens, como o .NET Framework tradicional dá suporte apenas Windows, você não pode usar o recurso de vários arcos.
Windows de contêiner
Assim como os contêineres do Linux, Windows contêineres do Servidor são gerenciados usando o Mecanismo do Docker. Ao contrário dos contêineres do Linux, Windows contêineres incluem dois tipos de contêiner diferentes ou tempos de Windows de servidor e isolamento do Hyper-V.
Windows de servidor: fornece isolamento de aplicativo por meio da tecnologia de isolamento de processo e namespace. Um Windows Server compartilha um kernel com o host do contêiner e todos os contêineres em execução no host. Esses contêineres não fornecem um limite de segurança hostil e não devem ser usados para isolar código não confiável. Devido ao espaço de kernel compartilhado, esses contêineres exigem a mesma versão e configuração de kernel.
Isolamento do Hyper-V: expande o isolamento fornecido Windows Contêineres de Servidor executando cada contêiner em uma VM altamente otimizada. Nessa configuração, o kernel do host do contêiner não é compartilhado com outros contêineres no mesmo host. Esses contêineres são projetados para hospedagem multilínguária agressiva, com as mesmas garantias de segurança de uma VM. Como esses contêineres não compartilham o kernel com o host ou outros contêineres no host, eles podem executar kernels com diferentes versões e configurações (com versões com suporte). Por exemplo, todos Windows contêineres no Windows 10 usam o isolamento do Hyper-V para utilizar a versão e a configuração do kernel Windows Server.
Executar um contêiner em Windows com ou sem isolamento do Hyper-V é uma decisão de tempo de execução. Você pode optar por criar o contêiner com o isolamento do Hyper-V inicialmente e, em vez disso, optar por executar o contêiner como um Windows Server.
Recursos adicionais
Windows de contêineres
https://docs.microsoft.com/virtualization/windowscontainers/
Windows conceitos básicos de contêineres
https://docs.microsoft.com/virtualization/windowscontainers/about/
Infográfico: Microsoft e contêineres
https://info.microsoft.com/rs/157-GQE-382/images/Container%20infographic%201.4.17.pdf
O ecossistema de contêiner no Azure
Nas seções anteriores, foi explicado quais são os benefícios dos contêineres do Docker, bem como detalhes sobre as imagens de contêiner específicas para aplicativos .NET. Todas essas informações genéricas são fundamentais para desenvolver ou conteinerizar um aplicativo. No entanto, ao pensar no ambiente de implantação de produção ou até mesmo em ambientes de qa e desenvolvimento/teste, o Microsoft Azure fornece uma ampla variedade de opções, um ecossistema de contêiner completo na nuvem (mostrado no diagrama abaixo). Dependendo das necessidades do aplicativo específico, você deve escolher um ou outro produto do Azure.

Figura 4-7.5. O ecossistema de contêiner no Azure
Do ecossistema de contêineres no Azure, os seguintes produtos que suportam contêineres que são considerados infraestrutura:
- ACI (Instâncias de Contêiner do Azure)
- Máquinas Virtuais do Azure (com suporte do contêiner)
- Conjuntos de Dimensionmento de Máquinas Virtuais do Azure (com suporte do contêiner)
Desses três, a ACI oferece um ótimo benefício, que é o fato de que você não precisa manter o sistema operacional subjacente, não é necessário atualizar/corrigir etc. mas a ACI ainda está posicionada no nível de infraestrutura, conforme explicado melhor nas próximas seções deste livro.
Os produtos no Azure que são contêineres de suporte que estão ao mesmo tempo posicionados mais no nível paaS (plataforma como serviço) são:
- Serviço de Aplicativo do Azure
- Serviço de Kubernetes do Azure (AKS e ACS)
- Lote do Azure
Em seguida, Registro de Contêiner do Azure é um registro de contêiner alto escalonável hospedado no Azure que você pode usar de todos os produtos anteriores ao registrar e implantar suas imagens de contêiner personalizadas.
Além disso, de seus contêineres, você pode consumir outros serviços gerenciados no Azure, como Banco de Dados SQL do Azure, cache Redis do Azure, banco de dados Cosmos Azure etc. além disso, há soluções/plataformas de terceiros disponíveis em Azure Marketplace como Cloud Foundry e OpenShift, em que você também pode usar contêineres no Azure.
Nas próximas seções, você pode explorar as recomendações da Microsoft sobre quando usar cada um desses produtos e soluções do Azure especificamente ao direcionar Windows Contêineres.