Partilhar via


Modos de isolamento

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

Os contêineres do Windows oferecem dois modos distintos de isolamento de tempo de execução: isolamento process e isolamento Hyper-V. Os contêineres executados em ambos os modos de isolamento são criados, gerenciados e funcionam de forma idêntica. Eles também produzem e consomem as mesmas imagens de container. A diferença entre os modos de isolamento é 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 de processos

Este é o modo de isolamento "tradicional" para contêineres e é o que é descrito na visão geral de contêineres do Windows . Com o isolamento de processos, várias instâncias de contêiner são executadas simultaneamente em um determinado host com isolamento fornecido por meio de namespace, controle de recursos e outras tecnologias de isolamento de processos. Ao executar nesse modo, os contêineres compartilham o mesmo kernel com o host, bem como entre si. Isso é aproximadamente o mesmo que como os contêineres Linux são executados.

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

O que fica isolado

Os 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 ficam isolados por contêiner:

  • sistema de arquivos
  • registo
  • portas de rede
  • espaço de identificação de processo e thread
  • Namespace do Gerenciador de Objetos

Ultrapassar o limite de isolamento

Há casos em que é útil furar o limite do isolamento. Estas operações devem ser deliberadamente solicitadas pelo utilizador e devem ser feitas com ponderação cuidada, uma vez que podem comprometer a postura de segurança do contentor. Os contêineres do Windows oferecem suporte ao seguinte:

Atualmente, os contêineres do Windows não são compatíveis:

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

Hyper-V isolamento

Esse modo de isolamento oferece segurança aprimorada e compatibilidade mais ampla entre as versões de host e contêiner. Com isolamento Hyper-V, várias instâncias de contentor são executadas simultaneamente num host; contudo, cada contentor é executado dentro de uma máquina virtual altamente otimizada e efetivamente obtém o seu próprio kernel. A presença da máquina virtual fornece isolamento no nível de hardware entre cada contêiner, bem como o host do contêiner.

Um diagrama de um contentor a ser isolado dentro de um sistema operativo numa máquina virtual que está a ser executada num sistema operativo dentro de uma máquina física.

Exemplos de isolamento

Criar contêiner

O gerenciamento de contêineres isolados do Hyper-V com o Docker é quase idêntico ao gerenciamento de contêineres isolados por processo. Para criar um contêiner com isolamento 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 contentores do Windows que funcionam no Windows Server geralmente operam com isolamento de processo. Os contêineres do Windows executados no Windows 10 Pro e Enterprise por padrão são executados com isolamento Hyper-V. A partir da atualização de outubro de 2018 do Windows 10, os usuários que executam um host 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.

Advertência

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

Você deve continuar a usar o Windows Server como host para implantações de produção. Ao usar esse recurso no Windows 10 Pro e Enterprise, você também deve garantir que suas tags de versão de host e contêiner correspondam, caso contrário, o contêiner pode falhar ao iniciar ou exibir um comportamento indefinido.

Explicação do isolamento

Este exemplo demonstra as diferenças nas capacidades de isolamento entre o processo e o isolamento Hyper-V.

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

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 ping em execução do host. Neste exemplo, há um, e a id do processo corresponde à 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 isolado Hyper-V 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 procurar o processo no host do contêiner, um processo de ping não é encontrado e um erro é lançado.

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

Finalmente, no host, é visível o processo vmwp, que corresponde à máquina virtual em execução responsável por encapsular o contêiner e proteger os processos em execução do sistema operativo 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