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.
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:
- mapeamento de arquivos compartilhados ou volumes do host para o contêiner
- mapeamento de um pipe nomeado do host para o contêiner
- mapeamento de uma porta do host para o contêiner
- personalização e compartilhamento do namespace de rede
- compartilhamento da visibilidade do dispositivo host no contêiner
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.
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