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