Compute Engine의 컨테이너

소프트웨어 컨테이너를 사용하면 격리된 여러 사용자 공간 인스턴스에서 편리하게 앱을 실행할 수 있습니다. Linux 또는 Windows Server 공개 VM 이미지Container-Optimized OS 이미지에서 컨테이너를 실행할 수 있습니다. 컨테이너를 사용하면 호스트 가상 머신에서 더 적은 종속 항목으로 앱을 실행 가능하며, 동일한 VM 인스턴스에 배포하는 다른 컨테이너화된 앱과 독립적으로 앱을 실행할 수 있습니다. 이런 특성 때문에 컨테이너화된 앱의 이동성이 더 높아지고 대규모 앱 배포와 유지보수가 더 수월해집니다.

이 문서에서는 Compute Engine 인스턴스에서 컨테이너를 실행하는 데 사용할 수 있는 보다 일반적인 컨테이너 기술을 몇 가지 설명합니다. Compute Engine에서 제공하는 공개 VM 이미지 대부분에서 이 기술을 사용할 수 있습니다.

컨테이너 환경 및 컨테이너 조정 도구를 완전히 제어해야 하는 경우 Compute Engine에서 컨테이너를 실행합니다. 또는 기본 VM 인스턴스를 관리할 필요가 없도록 Google Kubernetes Engine을 사용하여 클러스터 관리 및 컨테이너 조정 작업을 간소화할 수 있습니다.

Compute Engine에서 실행하는 컨테이너 기술

일반적으로 Compute Engine 인스턴스는 거의 모든 컨테이너 기술이나 도구를 실행할 수 있습니다. 최신 Linux 운영체제에서 서로 다른 유형의 다수의 컨테이너를 실행할 수 있으며 Windows Server 2016 이상에서 Docker를 실행할 수도 있습니다. 다음 목록은 컨테이너화된 앱을 실행하고 관리하는 데 사용할 수 있는 일반적인 도구 중 일부입니다.

  • DockerPodman은 가장 많이 사용되는 2가지 컨테이너 기술이며 이를 통해 컨테이너식 앱을 실행할 수 있습니다.
  • Kubernetes는 여러 인스턴스나 하이브리드 클라우드 환경 내에서 실행 중인 컨테이너를 관리 및 확장하는 데 사용할 수 있는 컨테이너 조정 플랫폼입니다.
  • Compute Engine의 컨테이너를 사용하면 Compute Engine VM 인스턴스 또는 관리형 인스턴스 그룹에 컨테이너를 간단하게 배포할 수 있습니다.
  • 기존 시스템을 LXD 이미지로 변환하고 Compute Engine VM 인스턴스 내에서 실행하여 리프트 앤 시프트 방식으로 마이그레이션이 가능합니다. LXD는 Ubuntu 이미지에서 실행됩니다.

또한 Container Registry를 사용하여 컨테이너 이미지 버전을 관리할 수도 있습니다. Container Registry는 컨테이너 이미지를 Compute Engine의 Kubernetes로 배포하거나 Google Kubernetes Engine 클러스터로 배포하기 전에 해당 이미지를 저장하고 관리하는 단일 위치입니다.

컨테이너 최적화 VM 이미지

Compute Engine에는 인스턴스를 만들고 컨테이너 워크로드를 구동하는 데 사용할 수 있는 다수의 공개 VM 이미지가 있습니다. 이러한 공개 VM 이미지 중 일부는 최소 컨테이너 최적화 운영체제에 최신 버전의 Docker, Podman, Kubernetes가 사전 설치되어 제공됩니다. 다음 공개 이미지 계열은 컨테이너를 실행하도록 특별히 설계되었습니다.

  • Google의 Container-Optimized OS
    • 포함 기술: Docker, Kubernetes
    • 이미지 프로젝트: cos-cloud
    • 이미지 계열: cos-stable
  • Fedora CoreOS
    • 포함 기술: Podman, Docker
    • 이미지 프로젝트: fedora-coreos-cloud
    • 이미지 계열: fedora-coreos-stable
  • Ubuntu
    • 포함 기술: LXD
    • 이미지 프로젝트: ubuntu-os-cloud
    • 이미지 계열: ubuntu-2004-lts
  • Windows
    • 포함 기술: Docker
    • 이미지 프로젝트: windows-cloud
    • 이미지 계열: windows-1909-core-for-containers

특정 컨테이너 도구와 기술이 기본적으로 포함되지 않은 이미지에서 이러한 도구나 기술을 실행해야 하는 경우에는 해당 기술을 수동으로 설치합니다.

인스턴스에 컨테이너 기술 설치

인스턴스에서 단일 컨테이너를 실행하려면 인스턴스를 만들 때 컨테이너 이미지를 지정하면 됩니다. Compute Engine은 Docker가 설치된 최신 컨테이너 최적화 OS 이미지를 제공하며, VM이 시작될 때 컨테이너를 시작합니다. 자세한 내용은 VM에 컨테이너 배포를 참조하세요.

필요한 컨테이너 기술 및 조정 도구를 사용하여 Compute Engine에서 컨테이너 워크로드를 실행할 수도 있습니다. 공개 VM 이미지에서 인스턴스를 생성한 다음 원하는 컨테이너 기술을 설치합니다. 예를 들면 다음과 같습니다.

일부 상황에서는 이러한 기술의 특정 버전이 있어야 기술이 올바르게 호환 작동할 수 있습니다. 예를 들어 Kubernetes는 대체로 특정 버전의 Docker와 함께 가장 잘 구동합니다. 일반적으로 최신 버전 기술을 설치하면 가장 좋은 결과를 얻을 수 있습니다.

Windows Server 이미지에 Docker 설치

Windows Server 2016 이상 버전에는 컨테이너 지원이 제공됩니다. Windows Server 인스턴스에서 Docker 컨테이너를 실행할 계획이라면 컨테이너용 Windows Server 공개 이미지로 시작하는 것이 좋습니다. 이 이미지에 설치된 구성요소는 다음과 같습니다.

컨테이너용 Windows Server 이미지를 사용하는 대신 Windows Server 기본 이미지에 Docker를 설치하고 컨테이너화된 앱을 실행할 계획이라면 아래에서 설명하는 단계를 따릅니다.

먼저 Windows Server 2016 이상 공개 이미지를 사용하여 Windows Server 인스턴스를 만듭니다. 최적의 컨테이너 지원을 받으려면 Windows Server 버전 1909와 같은 Windows Server의 최신 반기 출시 버전을 사용하는 것이 좋습니다.

Docker 설치

  1. Windows 인스턴스에 연결합니다.

  2. 관리자 권한으로 PowerShell을 실행합니다.

  3. Microsoft 저장소에서 Docker를 설치합니다.

    PS C:\> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    
    PS C:\> Install-Package -Name docker -ProviderName DockerMsftProvider
    
  4. 다음 명령어를 실행하여 Compute Engine의 Windows 컨테이너에서 알려진 문제를 해결합니다.

    • Receive Segment Coalescing 사용 중지:

      PS C:\> netsh netkvm setparam 0 *RscIPv4 0
      
    • IPv6 사용 설정:

      PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
      /v DisabledComponents /t REG_DWORD /d 0x0 /f
      
  5. 인스턴스를 다시 시작합니다.

    PS C:\> Restart-Computer -Force
    

추가 설정 단계

이 시점에서 Docker를 사용하여 인스턴스에서 컨테이너를 실행할 수 있습니다. 예를 들어 다음 명령어는 Windows nanoserver 컨테이너 이미지를 다운로드하고 nanoserver 컨테이너 내부에서 명령 프롬프트를 실행합니다.

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1909 cmd.exe

인스턴스에 대한 연결성과 컨테이너에서 인터넷으로의 연결성에 영향을 주는 Docker의 기본 네트워크 MTU와 관련하여 알려진 문제가 있습니다. 이 문제를 해결하려면 먼저 인스턴스의 PowerShell 터미널에서 다음 명령어를 실행하여 모든 네트워크 인터페이스(이더넷 및 vEthenet)의 MTU를 1460으로 설정합니다.

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}
PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0          0  Loopback Pseudo-Interface 1
  1460                1     306804     668688  Ethernet
  1460                1          0       1282  vEthernet (nat)

컨테이너의 네트워크 인터페이스도 기본적으로 1500의 MTU를 사용하기 때문에 인스턴스의 MTU를 복구한 후에도 컨테이너에서 인터넷으로의 연결이 불안정할 수 있습니다. 모든 컨테이너에 MTU를 올바르게 설정하는 명령어는 컨테이너 MTU 섹션을 참조하세요.

Docker 네트워킹을 구성할 때 주기적으로 이러한 MTU 명령어를 재실행해야 할 수도 있습니다. 자세한 내용은 알려진 문제 섹션을 참조하세요.

Windows 컨테이너 실행

Windows 컨테이너를 시작하는 데 사용할 수 있는 많은 리소스가 있습니다.

Windows 컨테이너의 알려진 문제

서로 다른 Windows 버전 간에 컨테이너가 호환되지 않음

이전 버전의 Windows에서 빌드한 컨테이너는 최신 버전의 Windows를 실행 중인 Compute Engine 인스턴스에서 작동하지 않습니다. Docker는 기본적으로 Windows Server 2016 버전 컨테이너를 가져옵니다. 즉, Windows Server 버전 1709 이상을 실행하는 인스턴스에서 다음 명령어를 실행하면 오류가 발생합니다.

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver cmd.exe
docker: Error response from daemon: container
9a1eb8bbcba4e91792be65f3c40b5a1aee062f02fbc60a78444b47d043438069 encountered an
error during CreateContainer: failure in a Windows system call: The operating
system of the container does not match the operating system of the host.
(0xc0370101)

Microsoft의 Windows 컨테이너 버전 호환성 페이지에 자세한 내용이 나와 있습니다. Windows 컨테이너 버전 비호환성 문제를 해결하려면 컨테이너 가져오기 및 실행 시 Windows 버전에 해당하는 태그를 지정합니다. 예를 들어 Windows Server 버전 1909 인스턴스의 경우 다음 명령어를 사용하여 기본 2016 컨테이너 대신 버전 1909 nanoserver 컨테이너에서 명령어 프롬프트를 실행합니다.

PS C:\> docker run -it mcr.microsoft.com/windows/nanoserver:1909 cmd.exe

MTU 비호환성이 인스턴스 및 컨테이너 연결에 영향을 미침

docker network create 명령어나 New-VMSwitch 명령어를 사용하여 Windows 인스턴스에서 컨테이너 네트워크를 만들면 인스턴스 네트워크 인터페이스의 MTU는 일반적으로 1500으로 강제 지정됩니다. 새 Docker 컨테이너 내부의 기본 네트워크 인터페이스도 일반적으로 1500의 MTU를 사용합니다. Google Cloud는 1460의 MTU만 지원하므로 MTU가 1500으로 강제 지정되면 다음과 같은 문제가 발생할 수 있습니다.

  • RDP 세션이 중지되며, 이를 다시 연결하지 못할 수 있습니다. 이 문제는 투명 컨테이너 네트워크를 만들 때 발생하는 것으로 알려져 있습니다.

  • 컨테이너 내부 DNS 확인이 실패할 수 있습니다.

  • DNS 확인에 성공하지만 컨테이너에서 인터넷으로의 HTTP 연결 설정에 실패할 수 있습니다.

이러한 제한사항을 해결하려면 다음 두 단계, 즉 인스턴스 네트워크 인터페이스의 MTU 설정 단계와 컨테이너 네트워크 인터페이스의 MTU 설정 단계가 필요합니다.

1. Windows 인스턴스 네트워크 인터페이스의 MTU 설정

Windows 인스턴스의 PowerShell 터미널에서 다음 명령어를 실행하여 모든 네트워크 인터페이스(이더넷 및 vEthernet)의 MTU를 설정합니다.

PS C:\> Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

다음 명령어를 사용하여 인스턴스의 이더넷 및 vEthernet 인터페이스 MTU가 1460으로 설정되어 있는지 확인합니다.

PS C:\> netsh interface ipv4 show subinterfaces
   MTU  MediaSenseState   Bytes In  Bytes Out  Interface
------  ---------------  ---------  ---------  -------------
4294967295                1          0          0  Loopback Pseudo-Interface 1
  1460                1  628295912    2613170  Ethernet
  1460                1      37793     223909  vEthernet (nat)

RDP를 사용하여 더 이상 인스턴스에 연결할 수 없어서 이 명령어를 실행할 수 없는 경우에는 직렬 콘솔을 통해 인스턴스에 연결하여 cmd 프롬프트를 시작한 다음 netsh 명령어를 사용하여 MTU를 복구 가능합니다. 이렇게 하지 않으려는 경우에는 docker network ... 명령어나 New-VMSwitch 명령어를 MTU 복구 명령어를 실행하는 스크립트에 포함하여 실행하는 것이 좋습니다.

2. Windows 컨테이너 네트워크 인터페이스의 MTU 설정

컨테이너가 실행되는 동안 컨테이너 내부에서 또는 컨테이너를 호스팅하는 인스턴스에서 Windows 컨테이너의 MTU를 설정해야 합니다. 컨테이너에서 PowerShell을 사용할 수 있는 경우 다음 명령어를 양방향으로 실행하거나 컨테이너의 스크립트에서 실행하여 MTU를 올바르게 설정할 수 있습니다.

PS C:\> Get-NetAdapter | Where-Object Name -like "vEthernet*" | ForEach-Object {
  & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent
}

또는 Windows 인스턴스에서 이 명령어를 실행하여 실행 중인 모든 컨테이너의 MTU를 설정할 수도 있습니다.

PS C:\> Get-NetIPInterface -IncludeAllCompartments |
  Where-Object InterfaceAlias -like "vEthernet*" |
  Set-NetIPInterface -IncludeAllCompartments -NlMtuBytes 1460

Docker 컨테이너 시작 실패

docker run으로 컨테이너를 시작하면 다음 오류와 함께 실패할 수 있습니다.

C:\Program Files\Docker\docker.exe: Error response from daemon: container ...
encountered an error during CreateContainer: failure in a Windows system call:
Element not found. (0x490)

문제는 Windows Update KB4015217이 설치된 Windows Server 2016 인스턴스에서 발생합니다. 이 문제를 해결하려면 다음 PowerShell 명령어를 사용하여 인스턴스에서 IPv6를 사용하도록 설정합니다.

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0x0 /f

IPv6를 사용 설정한 후 인스턴스를 다시 시작합니다.

PS C:\> Restart-Computer -Force

향후 운영체제 업데이트에서 이 문제가 해결되는 경우 원래 IPv6 설정을 복원할 수 있습니다.

PS C:\> reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters `
/v DisabledComponents /t REG_DWORD /d 0xff /f

Hyper-V 컨테이너 시작 실패

Hyper-V 컨테이너는 현재 Compute Engine에서 지원되지 않습니다.

다음 단계