Modos de isolamento

Aplica-se a: Windows Server 2022, Windows Server 2019 e Windows Server 2016

Os contêineres do Windows oferecem dois modos distintos de isolamento de tempo de execução: isolamento de process e Hyper-V. Os contêineres em execução em ambos os modos de isolamento são criados, gerenciados e funcionam de forma idêntica. Eles ainda produzem e consomem as mesmas imagens de contêiner. A diferença entre os modos de isolamento é que o grau de isolamento é criado entre o contêiner, o sistema operacional do host e todos os outros contêineres em execução nesse host.

Isolamento do processo

Esse é o modo de isolamento “tradicional” para contêineres e é o que está descrito na visão geral de contêineres do Windows. Com o isolamento do processo, as várias instâncias de contêiner são executadas simultaneamente em um determinado host com o isolamento fornecido por meio do namespace, controle de recursos e outras tecnologias de isolamento do processo. Durante a execução nesse modo, os contêineres compartilham o mesmo kernel com o host, bem como entre si. Isso é aproximadamente igual ao modo como os contêineres do Linux são executados.

Um diagrama que mostra um contêiner cheio de aplicativos sendo isolados do sistema operacional e do hardware.

O que é isolado

Contêineres do Windows virtualizam o acesso a vários namespaces do sistema operacional. Um namespace fornece acesso a informações, objetos ou recursos por meio de um nome. Por exemplo, o sistema de arquivos é provavelmente o namespace mais conhecido. Há vários namespaces no Windows que são isolados por contêiner:

  • sistema de arquivos
  • Registro
  • portas da rede
  • espaço de ID de thread e processo
  • namespace do Gerenciador de Objetos

Transpor o limite de isolamento

Há casos em que é útil transpor o limite de isolamento. Essas operações devem ser solicitadas deliberadamente pelo usuário e devem ser feitas com muito cuidado, pois podem comprometer a postura de segurança do contêiner. Contêineres do Windows são compatíveis com o seguinte:

Contêineres do Windows atualmente não dão suporte:

  • memória compartilhada
  • compartilhamento de objetos de sincronização (semáforos, mutexes etc)
  • namespaces de processo compartilhado

Isolamento do Hyper-V

Esse modo de isolamento oferece segurança aprimorada e maior compatibilidade entre as versões do host e do contêiner. Com o isolamento do Hyper-V, várias instâncias de contêiner são executadas simultaneamente em um host. No entanto, cada contêiner é executado dentro de uma máquina virtual altamente otimizada e obtém com eficiência o próprio kernel. A presença da máquina virtual fornece isolamento de nível de hardware entre cada contêiner, assim como para o host do contêiner.

Um diagrama de um contêiner sendo isolado em um sistema operacional em um computador visual que está sendo executado em um sistema operacional em um computador físico.

Exemplos de isolamento

Criar contêiner

O gerenciamento de contêineres isolados do Hyper-V com o Docker é praticamente idêntico ao gerenciamento de contêineres isolados do processo. Para criar um contêiner com isolamento do Hyper-V usando o Docker, use o parâmetro --isolation para definir --isolation=hyperv.

docker run -it --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 cmd

Para criar um contêiner com isolamento de processo por meio do Docker, use o parâmetro --isolation para definir --isolation=process.

docker run -it --isolation=process mcr.microsoft.com/windows/servercore:ltsc2019 cmd

Os contêineres do Windows em execução no Windows Server têm o padrão de execução com o isolamento do processo. Os contêineres do Windows em execução no Windows 10 Pro e Enterprise têm o padrão de execução com o isolamento do Hyper-V. A partir da atualização do Windows 10 de outubro de 2018, os usuários que executam um host do Windows 10 Pro ou Enterprise podem executar um contêiner do Windows com isolamento de processo. Os usuários devem solicitar diretamente o isolamento do processo usando o sinalizador --isolation=process.

Aviso

A execução com o isolamento de processos no Windows 10 Pro e Enterprise destina-se a desenvolvimento/teste. O host deve estar executando o Windows 10 build 17763+ e você deve ter uma versão do Docker com o Mecanismo 18.09 ou mais recente.

Você deverá continuar usando o Windows Server como o host para implantações de produção. Usando esse recurso no Windows 10 Pro e Enterprise, você também precisará verificar se as marcas de versão do host e do contêiner são correspondentes; caso contrário, o contêiner poderá falhar na inicialização ou exibir um comportamento indefinido.

Explicação de isolamento

Este exemplo demonstra as diferenças nos recursos de isolamento entre o isolamento do processo e do Hyper-V.

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

docker run -d mcr.microsoft.com/windows/servercore:ltsc2019 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

Por outro lado, este exemplo inicia um contêiner de Hyper-V isolado com um processo de ping também.

docker run -d --isolation=hyperv mcr.microsoft.com/windows/servercore:ltsc2019 ping localhost -t

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 no 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