Parei pra dar uma olhada na versão nova do Windows Server 2016 que saiu recentemente, o quinto technology preview (TP5). Meu interesse é ver como está funcionando o suporte a contêineres, especialmente com Docker. Trabalhar com contêineres e Docker é algo que já temos feito na Lambda3, mas somente com Linux, já que o suporte pra Windows ainda não está pronto. É algo que temos visto como muito interessante, e eu pessoalmente acredito que uma grande parte, talvez a maioria das aplicações, no futuro, vai rodar dentro de um contêiner.

Eu havia testado no TP4, e nada da parte de contêineres funcionava por completo, e o próprio Windows Server Nano ainda estava muito cru. Por exemplo, não era possível acrescentar features no Windows Server Nano, você tinha que gerar a imagem já com tudo que iria precisar. Isso mudou, e no TP5 já podemos acrescentar funcionalidades, ainda que não esteja completo e simples como eu esperaria.

Criando seu Nano Server

Pra criar seu Nano, vá até essa página do Technet e siga as instruções, ou baixe diretamente a imagem do Nano aqui. Não é preciso nenhuma licença, já que ele ainda é preview. Em seguida, crie a máquina virtual no Hyper-V. Pode colocar pouca memória, eu coloquei memória dinâmica, começando em 512MB, indo até 1024MB.

O Nano não permite praticamente nenhum trabalho significativo de administração direto na console, você vai ter quer acessá-lo via Powershell remoto. O máximo que consegue é ver algumas informações. Pra saber o IP, o próprio Hyper-V mostra, basta clicar na máquina rodando na ferramenta de administração e checar a aba networking, lá aparecerá o IP.

Mas não necessáriamente você conseguirá conectar nele. Eu verifiquei que a rede dele estava setada como privada (use o Get-NetConnectionProfile para verificar, e o Set-NetConnectionProfile para configurar, via Powershell). Também é necessário acrescentar o host como trusted, ou todos (faça isso com “set-item wsman:localhost\client\trustedhosts -value *”). Outro ponto é arrumar o winrm, faça isso com “winrm quickconfig” e aceite os defaults. Ufa!

Acessando no host com o Powershell

Com tudo isso feito, você consegue entrar na máquina com Enter-PSSession:

image

Em seguida, temos que configurar o host para funcionar com contêineres. Eu já havia instalado no vhdx a função de contêineres, mas há mais coisas a fazer (veja as referências também no TechNet). Eles mandam você usar o wget (que no Powershell é um alias para Invoke-WebRequest) pra baixar o arquivo, mas esse cmdlet não existe no Nano! Nessa hora eu fiz uma gambiarra, eu havia criado o vhdx com a opção “-Storage”, para permitir a criação de network shares. Então, criei um share de rede assim:

net share "c=C:\" "/grant:everyone,FULL"

As aspas são importantes, ou não funciona…

E então baixei o arquivo  na minha máquina, e copiei pra VM via esse network share.

Se você tiver que instalar a feature de File Share pode usar o comando “Get-WindowsOptionalFeature  -online” pra listar as features que tem, e “Enable-WindowsOptionalFeature -Online -FeatureName $FeatureName -All”, sendo que o parâmetro $FeatureName deve ser “Storage-Services”, “FileAndStorage-Services”, “File-Services” e “CoreFileServer”.

Colocando o Docker daemon pra rodar no Nano Server

Com o arquivo na máquina, mandei rodar o script “Install-ContainerHost.ps1”, conforme especificado no TechNet.

Instalando a funcionalidade de contêineres

Note que o docker já fica instalado e as imagens já são baixadas.

Aqui o resultado do comando “docker info”, que mostra os dados do server (note o “Operating System” do tipo “Windows Server 2016 Datacenter Technical Preview 5”, e o “OSType” do tipo “Windows”):

docker info no Nano Server

Fui olhar no server quem era o docker, e o processo se chama “dockerd” e fica em “C:\Windows\system32\dockerd.exe”.

Tentei acessar remotamente o server, não consegui. A porta 2375 do docker não é aberta por padrão. Pra resolver, encontrei umas dicas no arquivo “InstallContainerHost.ps1”. Descobri, por exemplo, que o docker daemon não está rodando como um serviço, mas como uma tarefa agendada (scheduled task), o que parece uma bela gambiarra. Descobri também uma variável chamada $DockerData, que aponta para “C:\ProgramData\docker”, que é onde está o arquivo “runDockerDaemon.cmd”, que contém as configurações da tarefa agendada.

Altere o arquivo “runDockerDaemon.cmd”, na linha que tinha a chamada do “dockerd” precisamos incluir a abertura da porta TCP (o padrão é net pipes somente), ela deve ficar assim: “dockerd -H npipe:// -H 0.0.0.0:2375”.

Isso ainda não vai permitir chamar o docker de fora do Nano Server, você precisa incluir uma regra no firewall, faça isso assim:

netsh advfirewall firewall add rule name="docker" protocol=TCP dir=in localport=2375 action=allow

Pare o daemon (com “ps” você consegue ver o pid do processo e com “kill” você o mata), e reinicie a tarefa agendada com “Start-ScheduledTask Docker” e em seguida “Start-ScheduledTask Docker”. Ou reinicie a VM.

Acessando o Docker daemon a partir de outra máquina

Agora você já consegue chamar o docker de fora do Nano Server. Pra isso, sete a variável DOCKER_HOST para o valor correto, assim:

$env:DOCKER_HOST="tcp://192.168.137.46:2375"

E chame “docker info”. Deve funcionar.

Agora você já consegue iniciar contêineres e entrar neles. Por exemplo, pra iniciar um contêiner do Nano server, rode:

docker run -ti nanoserver powershell

Se você já está acostumado com o Docker, a experiência é um pouco diferente. A tela inteira é limpa, e então você entra direto no PowerShell. Ele também demora uns 3 segundos, não é tão rápido quanto contêineres Linux, pelo menos não ainda.

Pra quem trabalhou com o TP4, outra mudança: no TP5 o Nano Server possui uma console interativa de Powershell! Isso torna a administração muito mais simples. Antes, só cmd.exe.

Infelizmente não é simples pra instalar o IIS no Nano, essa página explica como fazer, e é bem trabalhoso. Vou pular essa parte, por enquanto. No Server Core é bem mais simples, basta usar o cmdlet “Install-WindowsFeature”.

Tentei instalar o .NET CLI ou o DNX e não consegui, há dependências em ambos os intaladores que não rodam no Nano. Mas descobri que é possível montar volumes no contêiner, assim como compartilhar portas. Por exemplo, pra montar o diretório temp do host no contêiner, e abrir a porta 5000, rode:

docker run -ti -p 5000:5000 -v c:\temp:c:\temp nanoserver powershell

Há também suporte para o Dockerfile, o que é um passo bem interessante. Mas ainda não vi integração com o Docker hub, ainda precisamos instalar imagens usando “Install-ContainerImage” (mais info aqui). Talvez porque não exista nenhuma, ou que eu saiba de alguma.

Próximo passo: contêiner Server Core

Como visto anteriormente, o script de setup baixou somente a imagem do Nano Server, aí iniciei o download da imagem do Windows Server Core. Como ela tem quase 3GBs, não terminei (o download era extremamente lento, mesmo com minha conexão com 100Mb/s), e vou tentar baixar ela num gerenciador de downloads, usando a técnica exposta aqui. Vou postar depois se consegui rodar o contêiner do Server Core num host Nano Server. Meu interesse existe porque esse cenário será bastante comum, já que o Server Core é capaz de rodar aplicações .NET Full, enquanto o Nano roda somente .NET Core. O Server Core, na verdade, é capaz de rodar qualquer aplicação que rode em um Windows Server e que não demande interface gráfica. Ele será um passo importante no processo de conteinerização de aplicações Windows. Quando tiver mais informações eu posto aqui.

Concluindo

O suporte está bem melhor, mas ainda falta bastante pra deixar um contêiner Windows tão flexível quanto um contêiner Linux. Acrescentar novas funcionalidades ao Windows, a partir de uma imagem pré-existente é algo fundamental. Deu bastante trabalho também pra subir o Docker corretamente, e pra conectar no contêiner. Imagino que até a versão final esses problemas serão resolvidos. Fiquei feliz de ver que a integração com o Docker progrediu, e várias funcionalidades novas apareceram (vejam, por exemplo, o suporte a rede de um contêiner aqui).

Contêineres no Windows estão se tornando uma realidade. Já temos uma ótima experiência com o Docker Beta (falei dele aqui no blog), e agora os contêineres Windows estão chegando. Já há indícios de que teremos suporte também no Windows 10, não só no Server, facilitando muito o desenvolvimento, que não vai nem demandar uma VM.

E aí, o que você acha? Vê uso dos contêineres no Windows?

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.