Update 2 (20/fev/2018): A última versão do Docker estável, no canal edge, já não apresenta os problemas relatados abaixo. Podem utilizar sem problemas.

Update: há um problema no LCOW que impede o compartilhamento de portas, mesmo com o LCOW desabilitado. O problema parece afetar a versão edge atual do Docker, ou seja, é melhor evitá-la por enquanto, se mantendo na Stable. Para resolver, caso você esteja tendo problemas:
1) Desinstale o Docker (renomeie o vhdx primeiro pra não perder imagens e contêineres)
2) Remova o virtual switch nat no Registry em HKLM\SYSTEM\CurrentControlSet\Services\VMSMP\Parameters\SwitchList
3) Reinicie o PC
4) Instale o Docker Stable, não o Edge
5) Renomeie o vhdx de volta pra ter seus contêineres de volta
E fiquem longe do LCOW até a próxima versão. 🙂
Agora, segue o post:

Ontem saiu uma release nova na versão edge do Docker, a versão 17.10.0-ce. Nos release notes eu vi que uma tecnologia nova era mencionada, ela dizia:

“Experimental support for Microsoft Linux Containers On Windows, on Windows 10 RS3”

Logo isso me remeteu à DockerCon, em Abril, onde Microsoft e Docker mostraram contêineres Linux rodando nativamente no Windows, sem uma máquina virtual. Perguntei sobre o assunto no Slack de comunidades do Docker, sem resposta satisfatória (clique nas imagens para ampliar):

image

Pois é, na versão 1709 do Windows que acaba de sair (a.k.a. Fall Creators Update), e que já está instalada no meu Surface Pro 4, isso foi habilitado. Tanto no Windows 10 quanto no Server. Você lê mais sobre o anúncio no blog do Docker, um post do mês passado que pouca gente parece ter notado, eu inclusive. E já havia sido anunciado no começo de setembro pelo Docker e pela Microsoft.

E, vejam só a supresa, hoje, ao iniciar o Docker, ele me perguntou se eu queria experimentar o LCOW (Linux Containers on Windows). Lógico que eu quero!

image

Note a observação: não é possível rodar contêineres Windows e ao mesmo tempo ter o LCOW ligado. Além disso, a funcionalidade é experimental. Após ligá-lo, você o verá ativado nas configurações do Docker (note o último checkbox):

image

Outro ponto que percebi é que as suas imagens e contêineres antigos desaparecem, o que faz sentido, afinal, eles estavam num host Linux. E agora estamos em um host Windows rodando contêineres Linux.

Aqui a prova de que funciona:

image

O que funciona

Consegui rodar diversas imagens diferentes (Node.js, Ubuntu, Alpine, .NET, entre outras) sem o menor problema. Consegui fazer um build complexo de uma aplicação .NET Core que eu já tinha montada. O mount de diretórios do host para o contêiner também funcinou.

Está pronto?

Não, é preview, Docker e Microsoft já avisaram. Ou seja, não há suporte. E já notei que há alguns problemas.

O maior problema pra mim foi que a porta compartilhada no contêiner não funciona no host, o que torna impossível testar qualquer aplicação. Testei um app Node.js e uma .NET. Esse é deal breaker, não tem como utilizar dessa forma. Vou esperar uma próxima versão.

Multi stage builds não funcionam, ele falha com COPY failed: failed to open file /tmp/hashgigante-mount/dir: invalid arguments. Também é algo muito chato que me leva a não aceitar o uso.

Notei que os contêineres demoram cerca de 1 segundo pra iniciar, mas depois rodam em uma velocidade normal (não fiz benchmarks ainda, mas pelo que percebi nada mudou). Sim, é um segundo só, mas é que normalmente é tão rápido iniciar um contêiner que a impressão que dá é que está demorando. Mas é bem rápido ainda assim.

A extração das imagens baixadas parece estar um pouco mais lenta do que usando um host Linux nativo.

A primeira vez que fiz um docker pull ele não terminava de fazer o extract. Tive que reiniciar o processo de pull duas vezes pra finalmente tudo engrenar. Não tive mais esse problema depois disso, baixei várias imagens sem problemas.

Desligar o LCOW e voltar para a máquina virtual pode ser problemático. A primeira vez que fiz isso o Docker for Windows se perdeu e não conseguiu voltar a funcionoar. O reiniciei, novamente desliguei o LCOW e ele voltou a funcionar. Fiquei preocupado se não perderia todos os meus contêineres e imagens, mas ao final estava tudo lá.

Conclusão

Essa será uma tecnologia incrível quando estiver pronta. Poder rodar nativamente contêineres Linux no Windows já seria algo incrível pra desenvolvimento, e não tenho dúvida de que isso rodará em produção, com suporte da Microsoft, nos Windows Servers do futuro.

Em Dev, a ausência de máquinas virtuais vai tornar os requisitos para desenvolvimento de contêineres Linux no Windows menores, iguais aos que hoje temos para desenvolvimento de Linux com Linux.

Em Ops, as empresas terão a possibilidade de fazer gestão de hosts Windows usando as ferramentas que já estão acostumadas, enquanto rodam contêineres Linux e Windows com o mesmo desempenho.

E, por fim, o Windows será o único SO capaz de rodar nativamente, sem máquinas virtuais, contêineres Linux e Windows. Windows FTW!

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.