Se você não leu o primeiro post pra entender do que estou falando, ele está aqui.

O suporte ao Linux Containers On Windows (LCOW) melhorou bastante desde Outubro de 2017, quando avaliei o LCOW pela primeira vez. Tanto é que agora o LCOW vem habilitado por padrão, não sendo mais necessário ligá-lo e desligá-lo como antes. Vamos ver o que melhorou e o que mudou.

O que você precisa pra rodar

O último update do Windows 10 (versão 1709). Pra saber se essa versão é a sua rode no Powershell:

(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseId).ReleaseId

Ou rode winver na linha de comando e verifique na janela.

Você também precisa estar com a versão edge do Docker, e com o flag de experimental habilitado, o que você faz pelas configurações do Docker for Windows.

Você não precisa de uma versão insider do Windows 10.

Não testei se funciona no Windows Server, se você testou comenta aqui no post pras outras pessoas saberem. Mas eu acho que funciona. A Microsoft comenta que você precisa da versão Windows Server Insider Preview build 16267 or later, veja mais aqui.

O que passou a funcionar

Agora é possível rodar um contêiner Windows e um contêiner Linux em paralelo. É importante, no entanto, utilizar --platform=linux no comando run ou pull, ou o docker informa que não existe imagem pra sua plataforma. Isso é importante também porque se você não fizer isso, pode ser que esteja usando uma imagem multiplataforma baseada em Windows, como a do mongo, e acabar rodando um contêiner Windows quando queria rodar um contêiner Linux.

Contêiner Linux e Windows em paralelo

Outro ponto muito importante é que agora o compartilhamento de portas funciona. O único problema é o mesmo que já acontece com contêineres Windows, ou seja, o mapeamento é feito pra um IP maluco que o Docker inventa, não pro localhost, como acontece com contêineres Linux quando usamos a máquina virtual ou nativamente.

O que está melhor

Não tive problemas pra baixar ou extrair imagens, e não tive erros em geral. Antes ele tinha me dado uma série de problemas e bugs, não mais.

Não era possível usar multi stage build, agora testei e funcionou perfeitamente. Usei uma imagem do node:9 de base, depois node:alpine, e funcionou perfeitamente.

O que segue funcionando

O tempo para realizar as ações está como antes. Ele inicia um contêiner muito rápido. Não tão rápido quanto com a máquina virtual ou nativo no Linux, mas rápido o suficiente. Na prática, pelo que medi, leva menos de 3 segundos pra iniciar um contêiner. As ações de pull de uma imagem são tão rápidas quanto nativamente no Linux.

O mount de diretórios funciona conforme o esperado, mas há detalhes para melhorar, mais info sobre isso abaixo.

O que ainda tem problemas

Não é possível rodar com docker-compose, porque ele ainda não consegue especificar que quer imagens de outra plataforma, ele sempre pede imagens de Windows. Acompanhe esse issue no Github para saber mais.

O tempo de build me pareceu bastante pior que o tempo de build nativo.

O terminal interativo não funciona direito. Ao rodar uma app Node.js, o CTRL-C não era capaz de parar a aplicação. Tive que ir em outro terminal e chamar um docker stop na mão.

Há problemas pontuais no mount. Você pode ler mais sobre no documento que a Microsoft mantém online no MS Docs sobre o LCOW.

Conclusão

Vou tentar usar só o LCOW a partir de agora e avaliar se eu sinto muita diferença. Se ficar satisfeito será muito legal, porque a máquina virtual, pra ficar ligada, me consome 2GB de memória, mesmo se eu não estiver rodando nada. Com o LCOW, o contêiner vai usar só a memória que ele precisar usar, não preciso reservar os 2GB.

Com a efetiva evolução do LCOW, teremos no Windows o único SO capaz de rodar nativamente contêineres Linux e Windows.

Para ler mais, veja o post do Docker (em inglês).

Ainda não vi pronunciamento da Docker ou da Microsoft se isso será suportado em produção ou será só pra dev. Eu imagino que será suportado, mas acho que ainda estamos longe desta confirmação. E a recomendação é nunca rodar a versão edge em produção ou habilitar a flag de experimental, ou seja, hoje, não pense em produção.

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.