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

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

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

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

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

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

Какие ресурсы изолируются

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

  • файловая система
  • реестр
  • сетевые порты
  • пространство идентификаторов процессов и потоков;
  • пространство имен диспетчера объектов.

Образование промежутков в границе изоляции

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

Сейчас контейнеры Windows не поддерживают:

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

Изоляция Hyper-V

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

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

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

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

В Docker управление контейнерами в режиме изоляции Hyper-V мало чем отличается от управления контейнерами с изолированными процессами. Для создания контейнера в режиме изоляции 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 Корпоративная по умолчанию включен режим изоляции Hyper-V. Начиная с обновления Windows 10 за октябрь 2018 г., в узле с Windows 10 Pro или Windows 10 Корпоративная пользователи могут запустить контейнер Windows в режиме изоляции процессов. Пользователи должны напрямую запрашивать изоляцию процесса с помощью флага --isolation=process .

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

Режим изоляции процессов в Windows 10 Pro и Windows 10 Корпоративная предназначен для разработки и тестирования. В узле нужно установить ОС Windows 10 сборки 17763 или выше, а также Docker Engine 18.09 или более поздней версии.

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

Пояснения по изоляции

В этом примере демонстрируются различия в возможностях режимов изоляции процессов и изоляции 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 с процессом проверки связи.

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

Как и прежде, команда docker top позволяет вернуть выполняемые процессы из контейнера.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 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