다음을 통해 공유


격리 모드

적용 대상: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

Windows 컨테이너는 process 격리와 Hyper-V 격리라는 두 가지 고유한 런타임 격리 모드를 제공합니다. 두 격리 모드에서 실행되는 컨테이너는 생성, 관리 및 동일하게 작동합니다. 또한 동일한 컨테이너 이미지를 생성하고 사용합니다. 격리 모드의 차이점은 컨테이너, 호스트 운영 체제 및 해당 호스트에서 실행되는 다른 모든 컨테이너 간에 생성되는 격리 수준입니다.

프로세스 격리

이것은 컨테이너에 대한 "전통적인" 격리 모드이며 Windows 컨테이너 개요에서 설명되어 있습니다. 프로세스 격리를 사용하면 네임스페이스, 리소스 제어 및 기타 프로세스 격리 기술을 통해 제공되는 격리를 사용하여 지정된 호스트에서 여러 컨테이너 인스턴스가 동시에 실행됩니다. 이 모드에서 실행하는 경우 컨테이너는 호스트와 동일한 커널을 공유하고 서로 공유합니다. 이는 Linux 컨테이너를 실행하는 방법과 거의 동일합니다.

OS 및 하드웨어에서 격리되는 애플리케이션으로 가득 찬 컨테이너를 보여 주는 다이어그램입니다.

무엇이 격리되는가

Windows 컨테이너는 다양한 운영 체제 네임스페이스에 대한 액세스를 가상화합니다. 네임스페이스는 이름을 통해 정보, 개체 또는 리소스에 대한 액세스를 제공합니다. 예를 들어 파일 시스템은 아마도 가장 잘 알려진 네임스페이스일 것입니다. Windows에는 컨테이너별로 격리되는 수많은 네임스페이스가 있습니다.

  • 파일 시스템
  • 레지스트리
  • 네트워크 포트
  • 프로세스 및 스레드 ID 공간
  • 개체 관리자 네임스페이스

격리 경계를 뚫다

격리 경계를 관통하는 것이 유용한 경우가 있습니다. 이러한 작업은 사용자가 의도적으로 요청해야 하며 컨테이너의 보안 상태를 손상시킬 수 있으므로 신중하게 고려해야 합니다. Windows 컨테이너는 다음을 지원합니다.

  • 호스트의 공유 파일 또는 볼륨을 컨테이너에 매핑하는
  • 호스트에서 컨테이너로 명명된 파이프를 연결하기
  • 호스트에서 컨테이너로 포트 매핑
  • 네트워크 네임스페이스 사용자 지정 및 공유
  • 컨테이너에 호스트 디바이스 표시를 공유하기

Windows 컨테이너는 현재 다음을 지원하지 않습니다.

  • 공유 메모리
  • 동기화 개체 공유(세마포, 뮤텍스 등)
  • 공유 프로세스 네임스페이스

Hyper-V 격리

이 격리 모드는 향상된 보안과 호스트 버전과 컨테이너 버전 간의 광범위한 호환성을 제공합니다. Hyper-V 격리를 사용하면 여러 컨테이너 인스턴스가 호스트에서 동시에 실행됩니다. 그러나 각 컨테이너는 고도로 최적화된 가상 머신 내에서 실행되며 자체 커널을 효과적으로 가져옵니다. 가상 머신이 있으면 각 컨테이너와 컨테이너 호스트 간에 하드웨어 수준 격리가 제공됩니다.

물리적 컴퓨터 내의 OS에서 실행되는 시각적 컴퓨터의 OS 내에서 격리되는 컨테이너의 다이어그램입니다.

격리 예제

컨테이너 만들기

Docker를 사용하여 Hyper-V 격리 컨테이너를 관리하는 것은 프로세스 격리 컨테이너를 관리하는 것과 거의 동일합니다. Docker를 사용하여 Hyper-V 격리된 컨테이너를 만들려면 --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 Server에서 실행되는 Windows 컨테이너는 기본적으로 프로세스 격리를 사용하여 실행됩니다. Windows 10 Pro 및 Enterprise에서 실행되는 Windows 컨테이너는 기본적으로 Hyper-V 격리를 사용하여 실행됩니다. Windows 10 2018년 10월 업데이트부터 Windows 10 Pro 또는 Enterprise 호스트를 실행하는 사용자는 프로세스 격리를 사용하여 Windows 컨테이너를 실행할 수 있습니다. 사용자는 --isolation=process 플래그를 사용하여 프로세스 격리를 직접 요청해야 합니다.

경고

Windows 10 Pro 및 Enterprise에서 프로세스 격리를 사용하여 실행하는 것은 개발/테스트를 위한 것입니다. 호스트가 Windows 10 빌드 17763 이상을 실행해야 하며 엔진 18.09 이상이 있는 Docker 버전이 있어야 합니다.

프로덕션 배포의 호스트로 Windows Server를 계속 사용해야 합니다. Windows 10 Pro 및 Enterprise에서 이 기능을 사용하면 호스트 및 컨테이너 버전 태그가 일치하는지 확인해야 합니다. 그렇지 않으면 컨테이너가 시작되지 않거나 정의되지 않은 동작이 나타날 수 있습니다.

격리 설명

이 예제에서는 프로세스와 Hyper-V 격리 간의 격리 기능의 차이점을 보여 줍니다.

여기서는 프로세스 격리 컨테이너가 배포되고 장기 실행 ping 프로세스를 호스팅합니다.

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

docker top 명령을 사용하면 컨테이너 내부에서 볼 수 있듯이 ping 프로세스가 반환됩니다. 이 예제의 프로세스의 ID는 3964입니다.

docker top 1f8bf89026c8f66921a55e773bac1c60174bb6bab52ef427c6c8dbc8698f9d7a

3964 ping

컨테이너 호스트에서 get-process 명령을 사용하여 호스트에서 실행 중인 ping 프로세스를 반환할 수 있습니다. 이 예제에는 하나가 있으며 프로세스 ID는 컨테이너의 ID와 일치합니다. 컨테이너와 호스트 모두에서 볼 수 있는 동일한 프로세스입니다.

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

반대로 이 예제에서는 ping 프로세스를 사용하여 Hyper-V 격리된 컨테이너를 시작합니다.

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

마찬가지로 docker top 사용하여 컨테이너에서 실행 중인 프로세스를 반환할 수 있습니다.

docker top 5d5611e38b31a41879d37a94468a1e11dc1086dcd009e2640d36023aa1663e62

1732 ping

그러나 컨테이너 호스트에서 프로세스를 검색할 때 ping 프로세스를 찾을 수 없으며 오류가 throw됩니다.

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