Contêineres do Hyper-V

Este é um conteúdo preliminar, estando sujeito a alterações.

A tecnologia de contêiner do Windows inclui dois tipos distintos de contêineres, contêineres do Windows Server e do Hyper-V. Ambos os tipos são criados, gerenciados e funcionam de maneira idêntica. Eles ainda produzem e consomem as mesmas imagens de contêiner. A diferença entre eles é o nível de isolamento criado entre o contêiner, o sistema operacional do host e todos os outros contêineres em execução no host.

Contêineres do Windows Server: várias instâncias de contêiner podem ser executadas simultaneamente em um host com o isolamento fornecido por meio do namespace, controle de recursos e tecnologias de isolamento do processo. Os contêineres do Windows Server compartilham o mesmo kernel com o host, bem como entre si.

Contêineres do Hyper-V: várias instâncias de contêiner podem ser executadas simultaneamente em um host, no entanto, cada contêiner é executado dentro de uma máquina virtual especial. Isso fornece isolamento no nível do kernel entre cada contêiner do Hyper-V e o host do contêiner.

Contêiner do Hyper-V

Criar contêiner

Gerenciar contêineres do Hyper-V com o Docker é quase igual a gerenciar contêineres do Windows Server. Ao criar um contêiner do Hyper-V com o Docker, o parâmetro --isolation=hyperv é usado.

docker run -it --isolation=hyperv microsoft/nanoserver cmd

Explicação de isolamento

Este exemplo diferenciará os recursos de isolamento entre contêineres do Hyper-V e do Windows Server.

Aqui, um contêiner do Windows Server está sendo implantado e hospedará um longo processo de execução de ping.

docker run -d microsoft/windowsservercore ping localhost -t

Usando o comando docker top, o processo de ping é retornado como visto dentro do contêiner. O processo neste exemplo tem uma ID de 3964.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

No host do contêiner, o comando get-process pode ser usado para retornar quaisquer processos de execução de ping do host. Neste exemplo, há um, e a ID do processo corresponde àquela do contêiner. É o mesmo processo visível do contêiner e do host.

get-process -Name ping

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
     67       5      820       3836 ...71     0.03   3964   3 PING

Para contraste, este exemplo inicia um contêiner de Hyper-V com um processo de ping também.

docker run -d --isolation=hyperv microsoft/nanoserver ping -t localhost

Da mesma forma, docker top pode ser usado para retornar os processos em execução do contêiner.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

No entanto, ao pesquisar o processo do host do contêiner, um processo de ping não é encontrado e um erro é gerado.

get-process -Name ping

get-process : Cannot find a process with the name "ping". Verify the process name and call the cmdlet again.
At line:1 char:1
+ get-process -Name ping
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ping:String) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

Por fim, no host, o processo vmwp está visível, que é a máquina virtual em execução que está encapsulando o contêiner em execução e protegendo os processos em execução do sistema operacional do host.

get-process -Name vmwp

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
   1737      15    39452      19620 ...61     5.55   2376   0 vmwp