Поделиться через


Режимы изоляции

Область применения: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Контейнеры Windows предлагают два различных режима изоляции среды выполнения: изоляция process и Hyper-V. Контейнеры, работающие в обоих режимах изоляции, создаются, управляются и работают одинаково. Они также создают и используют те же образы контейнеров. Разница между режимами изоляции заключается в том, какая степень изоляции создается между контейнером, операционной системой узла и всеми другими контейнерами, работающими на этом узле.

Изоляция процессов

Это "традиционный" режим изоляции для контейнеров и описывается в обзоре контейнеров Windows. При изоляции процесса несколько экземпляров контейнеров выполняются одновременно на определенном узле с изоляцией, предоставляемой с помощью пространства имен, управления ресурсами и других технологий изоляции процессов. При запуске в этом режиме контейнеры используют одно и то же ядро совместно с узлом, а также друг с другом. Это примерно так же, как запускаются контейнеры Linux.

Схема, показывающая контейнер, полный приложений, изолированных от ОС и оборудования.

Что подлежит изоляции

Контейнеры Windows виртуализируют доступ к различным пространствам имен операционной системы. Пространство имен предоставляет доступ к информации, объектам или ресурсам с помощью имени. Например, файловая система, вероятно, является самым известным пространством имен. В Windows существует множество пространств имен, которые изолируются в каждом контейнере:

  • файловая система
  • регистратура
  • сетевые порты
  • пространство идентификаторов процессов и потоков
  • Пространство имен Диспетчера объектов

Пробить границу изоляции

Существуют случаи, когда полезно пронзить границу изоляции. Эти операции должны быть намеренно запрошены пользователем и должны быть выполнены с осторожностью, так как это может скомпрометировать состояние безопасности контейнера. Контейнеры Windows поддерживают следующие функции:

Контейнеры Windows в настоящее время не поддерживаются:

  • общая память
  • совместное использование объектов синхронизации (семафоры, мьютекси и т. д.)
  • общие пространства имен процессов

изоляция Hyper-V

Этот режим изоляции обеспечивает повышенную безопасность и более широкую совместимость между версиями узлов и контейнеров. При изоляции Hyper-V несколько экземпляров контейнеров выполняются одновременно на узле; однако каждый контейнер выполняется внутри высокооптимизируемой виртуальной машины и эффективно получает собственное ядро. Наличие виртуальной машины обеспечивает изоляцию на уровне оборудования как между каждым контейнером, так и хостом контейнеров.

Схема контейнера, изолированного в ОС, на виртуальной машине, работающей в операционной системе на физическом компьютере.

Примеры изоляции

Создание контейнера

Управление изолированными контейнерами Hyper-V с помощью Docker почти идентично управлению изолированными процессами контейнерами. Чтобы создать контейнер с изоляцией Hyper-V с помощью Docker, используйте параметр --isolation для задания --isolation=hyperv.

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

Чтобы создать контейнер с изоляцией процесса с помощью Docker, используйте параметр --isolation, чтобы задать --isolation=process.

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

Контейнеры Windows, работающие в Windows Server по умолчанию, выполняются с изоляцией процесса. Контейнеры Windows, работающие в Windows 10 Pro и Windows 10 Enterprise, по умолчанию выполняются с изоляцией Hyper-V. Начиная с обновления Windows 10 за октябрь 2018 г. пользователи под управлением узла Windows 10 Pro или Enterprise могут запускать контейнер Windows с изоляцией процесса. Пользователи должны напрямую запрашивать изоляцию процесса с помощью флага --isolation=process.

Предупреждение

Выполнение с изоляцией процессов в Windows 10 Pro и Enterprise предназначено для целей разработки и тестирования. Ваш хост должен работать под управлением Windows 10 сборки 17763+ и иметь версию Docker с движком 18.09 или более поздней.

Вы должны продолжать использовать Windows Server в качестве узла для рабочих развертываний. Используя эту функцию в Windows 10 Pro и Enterprise, необходимо также убедиться, что теги версий узла и контейнера совпадают, в противном случае контейнер может завершиться ошибкой запуска или отображать неопределенное поведение.

Объяснение изоляции

В этом примере показаны различия в изоляционных возможностях процесса и изоляции Hyper-V.

Здесь развертывается контейнер с изоляцией процессов и будет запускаться долгосрочный процесс пинга.

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

Используя команду docker top, процесс ping возвращается в состояние, как внутри контейнера. В этом примере у процесса имеется идентификатор 3964.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

На хосте контейнера можно использовать команду get-process для получения любых выполняющихся процессов ping с хоста. В этом примере есть один и идентификатор процесса соответствует идентификатору процесса из контейнера. Этот процесс одинаково виден как из контейнера, так и с хоста.

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

В отличие от этого, в данном примере также запускается изолированный контейнер Hyper-V с процессом ping.

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

Аналогичным образом docker top можно использовать для возврата выполняемых процессов из контейнера.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

Однако при поиске процесса на узле контейнера процесс ping не найден, и возникает ошибка.

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

Наконец, на узле отображается процесс vmwp, который является работающей виртуальной машиной, которая инкапсулирует запущенный контейнер и защищает выполняемые процессы от операционной системы узла.

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