Режимы изоляции
Область применения: 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