
Quando converso com os engenheiros do Linux e falo sobre os problemas do cluster Kubernetes no Windows, eles me olham com muita suspeita. Alguns nem acreditam que
isso é legítimo . Os contêineres no Windows não são tão comuns e demandados quanto no Linux. Mas acho que vale a pena falar sobre esse tópico, apenas para entender o conceito geral e as principais diferenças entre os contêineres do Windows e Linux. Na primeira entrada, examinarei a tela com um pincel largo e, em posts subsequentes, tentarei me aprofundar gradualmente nas nuances.
Contêineres do Windows
De acordo com
este artigo:Muitos desenvolvedores do .NET ou SQL Server morderam os cotovelos e invejaram seus colegas trabalhadores do Linux.
De fato, os contêineres no Windows eram exóticos até recentemente. E a pior parte é que a documentação tinha que ser coletada em migalhas, em cada recurso, fosse o site oficial do Docker ou da Microsoft, tudo era apresentado em um formulário de visão geral sem uma descrição de "como e por quê" e, após um ou dois meses, as informações existentes estavam desatualizadas. E não há nada sobrenatural nisso - contêineres e tecnologias associadas a eles estão se desenvolvendo a uma velocidade irrealista.
No momento, tudo está melhor com a documentação e para mergulhar no mundo dos contêineres para Windows, basta ler a
documentação oficial da Microsoft e monitorar suas alterações. Curiosamente, a documentação está bem escrita e em russo, embora com um estudo aprofundado você não possa evitar clicar em links para vários recursos, como
https://www.docker.com/ ou
https://kubernetes.io/, onde tudo está escrito no antigo bom ingles
Agora, as respostas para quaisquer perguntas podem ser encontradas na documentação oficial, mas existem algumas nuances que são conhecidas com antecedência. Talvez isso seja útil para você e economize tempo quando imerso em tecnologia de contêiner sob a bandeira da Microsoft.
Você não pode executar contêineres do Windows no Linux e no Windows *
A tecnologia de contêiner facilita o manuseio do ambiente, graças às imagens reconfiguradas do aplicativo. É como uma Apple Appstore ou Google Play, mas apenas para engenheiros e desenvolvedores. Como nas lojas de aplicativos para celular, você não pode colocar o aplicativo no Google Play no iOS. Portanto, no host do Docker com o sistema operacional Linux, não é possível iniciar o contêiner com o sistema operacional Windows. O inverso também é verdadeiro, embora com alguns "buts", já que o host Docker com Windows ainda pode fornecer ao Linux um ambiente para a execução de contêineres.
Além disso, você não pode iniciar um contêiner do Windows em um ambiente Windows sem verificar se as versões do sistema operacional são compatíveis. Ao trabalhar com contêineres da Microsoft, você deverá
revisar a Compatibilidade de Versão de Contêiner do
Windows e abrir periodicamente este documento.
Falando em controle de versão - a Microsoft, com o advento dos contêineres, decidiu lançar novas versões semestrais do Windows semestralmente. São versões como o servidor Windows 1703, 1709, 1803, 1809, 1903. Os números indicam o ano e o mês do lançamento e são suportados por 18 meses. Os dois primeiros já estão em paz e estão no fim do serviço. Além disso, existem versões LTS, como o Windows Server 2016 e o Windows Server 2019.
Lista de versões.Portanto, se você coletou o contêiner em um host com uma versão do Windows 1803, poderá executá-lo apenas em hosts com o Windows 1803. Portanto, para não reconstruir o próprio contêiner a cada vez, será necessário usar a versão LTS do Windows, que com velocidades de desenvolvimento da tecnologia moderna nem sempre justificado. Ou, no entanto, pense em versionar e ainda remonte constantemente os contêineres, seguindo o programa passo a passo da semestralidade.
A tag mais recente nos contêineres do Dokerfile for Windows nem sempre está presente e geralmente está
obsoleta . De uma maneira boa, você sempre precisa saber qual é a sua versão do Windows e fazer as alterações apropriadas no Dockerfile.
Os contêineres fazem parte da abordagem Infraestrutura como código. Os contêineres precisam ser remontados constantemente, não é apenas simples e divertido, mas essa é a principal mágica que permite que os aplicativos sempre trabalhem em software novo e aprimorado. Porém, no nosso caso, somos confrontados com uma limitação: não funcionará para manter um arquivo Dockerfile universal para todos os sistemas Windows. Isso deve ser levado em consideração.
Tudo acima é verdadeiro para contêineres em execução no modo de isolamento do processo. No modo de isolamento do Hyper-V, a compatibilidade com versões anteriores se aplica - você pode executar todos os contêineres criados nas versões atual e anterior. Em geral, usando o isolamento do Hyper-V, você também pode executar contêineres Linux em um host do Windows. Mas esse modo até agora suporta menos guloseimas, que é apenas a falta de Kubernetes.
A diferença entre isolamento do processo e isolamento do Hyper-V é o tópico de um artigo separado. Por enquanto, vou apenas dizer que os cenários com isolamento do Hyper-V não são completamente óbvios para mim e, por padrão, o Windows usa o isolamento do processo.
Outra dor de cabeça é encontrar a versão correta das imagens no Docker Hub. Algumas imagens geralmente estão ausentes no Windows. Por exemplo, você não encontrará a compilação oficial do Nginx, MySQL, Nodejs, bem como centenas de outros aplicativos para Windows e terá que coletar contêineres por conta própria ou usar contêineres coletados e fornecidos pelos membros da comunidade.
Windows custa dinheiro.Não esqueça que o Windows ainda é uma coisa paga. Por exemplo, as versões semestrais estão disponíveis por meio da assinatura do Visual Studio ou do Software Assurance no contrato de licença existente da Microsoft.
LinkMas a Microsoft tem um grande número de maneiras de ser pago gratuitamente. Este é o programa BizSpark e todos os tipos de versões de avaliação do Windows Server 2019 por 180 dias e assim por diante.
Os contêineres do Windows não são leves.É geralmente aceito que os contêineres são leves, mas que a verdade para o Linux nem sempre é verdadeira para o Windows. A grande maioria dos contêineres do Windows, à primeira vista, pesa proibitivamente. E, à segunda vista, a impressão não muda. Por exemplo, uma imagem básica do aspnet: 4.8 pesa cerca de 7,5 GB.

Mesmo se você hospedar imagens básicas em um repositório local, o upload inicial da imagem para o host levará um bom tempo, muito menos em repositórios remotos, como o Docker Hub.
Sim, você pode usar o Windows Nano Server leve em alguns cenários, mas, infelizmente, ele tem várias limitações. E ainda mais, você não está a caminho com o Windows Nano Server se estiver desenvolvendo para o .Net Framework.
Para gerenciar, você precisa conhecer bem o CMD e o Powershell.Provavelmente, você precisará trabalhar com a versão principal do Windows Server nos hosts do Docker. O Windows Server possui diversos recursos de gerenciamento remoto. A abordagem geral é que, com um Windows Server com uma interface gráfica, você pode conectar todos os snap-ins gráficos a qualquer servidor núcleo.
Essa abordagem não funciona em cenários de contêiner, embora o contêiner contenha uma versão completa do Windows Server. Dentro de um contêiner do Windows, é teoricamente possível conectar-se via WMI, mas isso não é tão simples, apenas porque o sistema operacional host interceptará esse tráfego por si próprio. Pode haver várias dezenas e centenas de contêineres em um host e, nesse caso, direcionar o tráfego para o contêiner certo é uma coisa toda.
O CMD e o Powershell serão necessários para a administração do contêiner e para o host no qual o Docker está instalado. Além disso, o conhecimento desses shells é necessário para escrever um arquivo Dockerfile, pois todas as instruções RUN serão executadas nos shells mencionados acima.
Lembrar todos os longos cmdlets do Powershell é bastante complicado. Estes não são comandos concisos do bash para você. Embora agora a maioria dos cmdlets tenha aliases claros para qualquer engenheiro de Linux. No PowerShell, você pode usar:
rm Remove-Item pwd Get-Location. cat Get-Content touch New-Item etc. # Linux . rm –rf . # Powershell man Get-Help <>
Das coisas extremamente úteis, é que, usando o Powershell, você pode executar um
servidor Web simples em um contêiner para fins de teste. No Powershell, tudo aparece como objetos. Se você é um proponente do OOP, apreciará rapidamente os benefícios desse shell.
Como conclusão do artigo introdutório, quero dizer que não resolvi deliberadamente a questão da orquestração e do gerenciamento de cluster. O Docker no Windows está atualizando e os aplicativos de orquestração, como Swarm e Kubernetes no Windows, não percebem completamente sua funcionalidade.
Também no momento, se você deseja aumentar o cluster do Docker, provavelmente será multiplataforma. Ou seja, você precisará ter um ou mais hosts Linux no cluster. Por exemplo, para o Kubernetes, os nós principais devem estar no Linux. E no Swarm, os contêineres Linux são necessários, por exemplo, para implementar um balanceador no Nginx ou executar outros aplicativos populares de cluster que estão disponíveis apenas para Linux.
PS O uso do Windows em contêineres tem um conjunto muito limitado de scripts para usar. No entanto, esses cenários podem ser extremamente produtivos. Obviamente, a primeira coisa que vem à mente são os aplicativos Web do IIS, mas minha experiência mostra que os serviços independentes do Windows e alguns serviços como o MSMQ estão bem isolados em contêineres.
UPD Há uma pequena imprecisão no artigo; você pode criar um cluster do Docker apenas nos hosts do Windows. Além disso, este não é apenas o Swarm, mas também um produto desenvolvido pela Micrisoft para orquestrar o cluster do Service Fabric
UPD2. Os contêineres do Docker para Windows 10 estão disponíveis apenas no modo de isolamento do Hyper-V e usam imagens básicas diferentes do Windows Server.