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?