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

Для контейнеров Windows предлагается два разных режима изоляции среды выполнения: изоляция process и Hyper-V.Windows containers offer two distinct modes of runtime isolation: process and Hyper-V isolation. Контейнеры в этих двух режимах создаются, администрируются и работают одинаково.Containers running under both isolation modes are created, managed, and function identically. Они также создают и используют одни и те же образы контейнера.They also produce and consume the same container images. Отличие этих двух режимов заключается в уровне изоляции между контейнером, операционной системой узла и другими запущенными в этом узле контейнерами.The difference between the isolation modes is to what degree of isolation is created between the container, the host operating system, and all of the other containers running on that host.

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

Это стандартный режим изоляции для контейнеров. Он описан в статье о контейнерах Windows.This is the "traditional" isolation mode for containers and is what is described in the Windows containers overview. В режиме изоляции процессов несколько экземпляров контейнеров могут одновременно работать в одном узле, а изоляция обеспечивается с помощью пространств имен, управления ресурсами и технологий изоляции процессов.With process isolation, multiple container instances run concurrently on a given host with isolation provided through namespace, resource control, and process isolation technologies. В этом режиме контейнеры и узел используют одно и то же ядро.When running in this mode, containers share the same kernel with the host as well as each other. Это похоже на принцип работы контейнеров Linux.This is approximately the same as how Linux containers run.

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

Изоляция Hyper-VHyper-V isolation

Этот режим изоляции обеспечивает более высокий уровень безопасности и совместимости между версиями узлов и контейнеров.This isolation mode offers enhanced security and broader compatibility between host and container versions. В режиме изоляции Hyper-V несколько экземпляров контейнеров могут одновременно работать в одном узле. Но каждый контейнер выполняется на высокооптимизированной виртуальной машине и эффективно использует свое ядро.With Hyper-V isolation, multiple container instances run concurrently on a host; However, each container runs inside of a highly optimized virtual machine and effectively gets its own kernel. Наличие виртуальной машины обеспечивает изоляцию аппаратного уровня между контейнерами, а также узлом контейнера.The presence of the virtual machine provides hardware-level isolation between each container as well as the container host.

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

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

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

В Docker управление контейнерами в режиме изоляции Hyper-V мало чем отличается от управления контейнерами с изолированными процессами.Managing Hyper-V-isolated containers with Docker is nearly identical to managing process-isolated containers. Для создания контейнера в режиме изоляции Hyper-V с помощью Docker, используйте параметр --isolation, чтобы указать --isolation=hyperv.To create a container with Hyper-V isolation thorough Docker, use the --isolation parameter to set --isolation=hyperv.

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

Для создания контейнера с изоляцией процессов с помощью Docker, используйте параметр --isolation, чтобы указать --isolation=process.To create a container with process isolation through Docker, use the --isolation parameter to set --isolation=process.

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

Для контейнеров Windows под управлением Windows Server режим изоляции процессов включен по умолчанию.Windows containers running on Windows Server default to running with process isolation. А для контейнеров Windows под управлением Windows 10 Pro или Windows 10 Корпоративная по умолчанию включен режим изоляции Hyper-V.Windows containers running on Windows 10 Pro and Enterprise default to running with Hyper-V isolation. Начиная с обновления Windows 10 за октябрь 2018 г., в узле с Windows 10 Pro или Windows 10 Корпоративная пользователи могут запустить контейнер Windows в режиме изоляции процессов.Starting with the Windows 10 October 2018 update, users running a Windows 10 Pro or Enterprise host can run a Windows container with process isolation. Для этого пользователям следует напрямую запросить изоляцию процессов с помощью флага --isolation=process.Users must must directly request process isolation by using the --isolation=process flag.

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

Режим изоляции процессов в Windows 10 Pro и Windows 10 Корпоративная предназначен для разработки и тестирования.Running with process isolation on Windows 10 Pro and Enterprise is meant for development/testing. В узле нужно установить ОС Windows 10 сборки 17763 или выше, а также Docker Engine 18.09 или более поздней версии.Your host must be running Windows 10 build 17763+ and you must have a Docker version with Engine 18.09 or newer.

Для развертывания в рабочей среде в качестве узла следует продолжать использовать Windows Server.You should continue to use Windows Server as the host for production deployments. При использовании этой функции в Windows 10 Pro и Windows 10 Корпоративная необходимо также убедиться, что теги версии узла и контейнера совпадают. Иначе контейнер может не запуститься или продемонстрировать неожиданное поведение.By using this feature on Windows 10 Pro and Enterprise, you must also ensure that your host and container version tags match, otherwise the container may fail to start or exhibit undefined behavior.

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

В этом примере демонстрируются различия в возможностях режимов изоляции процессов и изоляции Hyper-V.This example demonstrates the differences in isolation capabilities between process and Hyper-V isolation.

Здесь развертывается контейнер с изоляцией процессов, в котором выполняется длительный процесс проверки связи.Here, a process-isolated container is being deployed and will be hosting a long-running ping process.

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

С помощью команды docker top процесс ping возвращается в том виде, который он имеет внутри контейнера.Using the docker top command, the ping process is returned as seen inside the container. В этом примере процесс имеет идентификатор 3964.The process in this example has an ID of 3964.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

На узле контейнера команду get-process можно использовать для возврата любых выполняющихся там процессов ping.On the container host, the get-process command can be used to return any running ping processes from the host. В этом примере присутствует один такой процесс, идентификатор которого совпадает с идентификатором процесса из контейнера.In this example there is one, and the process id matches that from the container. Из контейнера и с узла виден один и тот же процесс.It is the same process visible from both container and 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

В отличие от предыдущего примера, здесь запускается контейнер в режиме изоляции Hyper-V с таким же процессом проверки связи.To contrast, this example starts a Hyper-V -solated container with a ping process as well.

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

Как и прежде, команда docker top позволяет вернуть выполняемые процессы из контейнера.Likewise, docker top can be used to return the running processes from the container.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

Но процесс проверки связи не удается найти в узле контейнера, и происходит ошибка.However, when searching for the process on the container host, a ping process is not found and an error is thrown.

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, который является виртуальной машиной, инкапсулирующей запущенный контейнер и защищающей выполняющиеся процессы от операционной системы сервера виртуальных машин.Finally, on the host, the vmwp process is visible, which is the running virtual machine that is encapsulating the running container and protecting the running processes from the host operating system.

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