Como vimos no artigo: Fatos Sobre Docker Containers Linux um container não é uma máquina virtual e o Docker image não é um sistema operacional. Os containers utilizam o mesmo Kernel Linux para rodar processos e um root file system próprio de forma isolada. Agora já que o Docker precisa de um Kernel Linux para rodar seus containers como o é que o Docker Desktop consegue rodar containers Linux no Windows?

Esse conteúdo também está no formato de vídeo no nosso canal do Youtube:

Máquina Virtual – DockerDesktopVM

Precisamos de um Kernel Linux para rodar containers Linux, o Window roda em cima de um Kernel NT, e agora José? A solução encontrada pelo time do Docker foi bem simples: uma máquina virtual.

Em uma distro Linux o Kernel Linux, Docker Daemon e Docker Client estão no mesmo stack. Já no Windows o Docker Desktop sobe uma máquina virtual pelo Hyper-V e essa máquina virtual vai ter o Kernel Linux, kernel space para o Hyper-V, e o user space um Alpine com somente o necessário para rodar o Docker daemon. Já o Docker Client roda no Windows é uma aplicação user mode do Windows.

Sendo assim o docker client se conecta ao docker daemon na VM e temos os utilitários normais do docker no nosso Power Shell.

Acessando o DockerDesktopVM

Se acessarmos o gerenciador do Hyper-V, com o Docker Desktop inicializado, no Windows vamos ver listado nas máquinas virtuais a VM que o Docker Desktop sobe:

A forma mais fácil de acessar essa máquina virtual é através de um Docker container:

A base distro que a VM está rodando é um Alpine então vamos pedir pro Docker rodar um container Alpine e com o diretório root “/” da VM compartilhado com o container pelo volume “/host”. Note que se executarmos o comando “ps” para listar os processos no container vamos ter:

Vamos executar o change root para o “/host” e pronto estamos dentro da VM “host” do Docker Desktop. Executando o ps:

Note que agora temos acesso a todos os processos e pacotes da VM do DockerDesktop.

Gerando um Kernel Panic no DockerDesktopVM

No artigo sobre os Fatos Sobre Docker Containers Linux vimos que um dos pontos negativos de se utilizar o mesmo Kernel é que, lógico, se esse Kernel sofrer um crash ou Kernel panic todos os containers e aplicações serão afetadas. Vou exemplificar isso com o DockerDesktopVM. Pelo Power shell Docker client no Windows vou inicializar um container:

Vou rodar então o container do Alpine com o root “/” compartilhado e executar o change root. Assim pelo Docker client do DockerDesktopVM podemos ver que temos dois containers rodando:

Agora vou gerar o Kernel panic com o seguinte comando:

Note que o docker client no windows vai perder a conexão, escrever na tela uma mensagem de erro, pelo gerenciador do Hyper-V e podemos ver que o DockerDesktopVM reinicia:

Mesmo com o DockerDesktopVM reiniciando e voltando ao estado “Executando” temos que reiniciar também o aplicativo Windows do Docker Desktop para que o Docker client se reconecte, o Docker Desktop, as vezes (eu digo as vezes, porque aconteceu comigo de mesmo com a VM executando ele reiniciar a VM), é inteligente o bastante para ver que a VM está executando e não tenta inicializa-la novamente:

E já vimos que nossos containers foram pro saco junto com o crash do Kernel.

O que podemos fazer também é desligar completamente a “máquina”, e aqui no caso a máquina virtual, com o seguinte comando:

Dessa vez a VM vai ser completamente desligada, note o estado:

Nesse estado quando reiniciarmos o aplicativo do Docker Desktop ele também terá que inicializar a VM novamente.

Conclusões

No artigo sobre Fatos Sobre Docker Containers Linux um dos fatos era “Docker Containers Não São Virtualizações”. Porém no caso do Windows por ele rodar em cima de um Kernel NT não tem pra onde fugir, temos que virtualizar uma Distro Linux que irá rodar o docker daemon e gerenciar os containers Linux. É essa a solução que o Docker Desktop recorre. Como o Docker foi arquitetado como uma aplicação cliente servidor temos também o Docker client implementado em uma aplicação Windows que então conecta ao Docker daemon da VM, assim podemos executar os utilitários do docker “nativamente” pelo Command ou Power Shell do Windows.

Podemos acessar a máquina virtual do DockerDesktop utilizando um container compartilhando o rootfs “/” em um volume no container e executando o change root. Isso pode ser útil para configurar ou customizar a distro “host”.