Compute Engine의 컨테이너


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

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

컨테이너 환경 및 컨테이너 조정 도구를 완전히 제어해야 하는 경우 Compute Engine에서 컨테이너를 실행합니다.

또는 기본 VM 인스턴스를 관리할 필요가 없도록 Google Kubernetes Engine(GKE)을 사용하여 클러스터 관리 및 컨테이너 조정 작업을 간소화할 수 있습니다. GKE에서는 Google 인프라를 사용하여 컨테이너화된 애플리케이션을 배포, 관리, 확장할 수 있는 관리형 환경을 제공합니다.

GKE 환경은 클러스터를 형성하도록 그룹화된 여러 머신(구체적으로 Compute Engine 인스턴스)으로 구성되어 있습니다. GKE 클러스터를 실행하면 Google Cloud가 제공하는 부하 분산, 노드 풀, 노드 자동 복구, 자동 확장 및 업그레이드, 로깅 및 모니터링과 같은 고급 클러스터 관리 기능을 활용할 수 있습니다.

Microsoft Windows Server를 실행하는 노드 풀로 GKE 클러스터를 만드는 방법을 알아보세요.

직접 사용해 보기

Google Cloud를 처음 사용하는 경우 계정을 만들어 실제 시나리오에서 Compute Engine의 성능을 평가할 수 있습니다. 신규 고객에게는 워크로드를 실행, 테스트, 배포할 수 있는 무료 크레딧 $300가 제공됩니다.

Compute Engine 무료로 사용해 보기

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

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

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

또한 Artifact Registry를 사용하여 컨테이너 이미지 버전을 관리할 수도 있습니다. Artifact 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

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

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

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

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

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

Windows Server 이미지에 Docker 설치

Windows Server 2016 이상 버전에는 컨테이너 지원이 제공됩니다. Windows Server 인스턴스에서 Docker 컨테이너를 실행할 계획이면 Windows Server 기본 이미지에 Docker를 설치하거나 Mirantis의 마켓플레이스 이미지를 사용할 수 있습니다.

Windows Server 기본 이미지에 Docker CE를 설치하려면 아래 단계를 수행합니다.

먼저 Windows Server 2019 이상 공개 이미지를 사용하여 Windows Server 인스턴스를 만듭니다. 최적의 컨테이너 지원을 위해서는 최신 LTSC 버전의 Windows Server를 사용하는 것이 좋습니다. LTSC에 대한 자세한 내용은 Windows Server 서비스 채널을 참조하세요.

Docker 설치

Windows에 Docker를 설치합니다. 자세한 내용은 컨테이너에 대해 Windows 준비를 참조하세요. 설치가 완료된 후 인스턴스를 다시 시작합니다.

추가 설정 단계

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

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

Docker의 기본 네트워크 MTU는 1,500바이트입니다. VPC 네트워크 MTU도 1,500바이트로 구성했다면 이 섹션의 나머지 부분은 무시해도 됩니다. 하지만 네트워크에서 1,460바이트의 기본 VPC MTU를 사용하는 경우 각 인스턴스에 대해 몇 가지 추가 구성을 수행해야 합니다.

각 인스턴스에서 다음 명령어를 PowerShell 터미널에서 실행하여 모든 네트워크 인터페이스(이더넷 및 vEthernet)의 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 컨테이너를 시작하는 데 사용할 수 있는 많은 리소스가 있습니다.

  • Microsoft는 광범위한 Windows 컨테이너 문서를 제공합니다.
  • Docker Hub는 Windows 컨테이너를 저장하고 가져오는 저장소로 사용할 수 있습니다.

Windows 컨테이너의 알려진 문제

컨테이너용 Windows Server 2019 이미지 지원 중단

Google은 Mirantis Container Runtime(이전 명칭: Docker EE)이 사전 설치된 Windows Server 이미지 계열을 제공했습니다.

  • Windows
    • 포함 기술: Docker
    • 이미지 프로젝트: windows-cloud
    • 이미지 계열: windows-2019-core-for-containers

2023년 초, Microsoft는 Windows Server용 Mirantis Container Runtime에 대한 배포 및 지원을 중지했습니다. Google은 2023년 10월 30일까지 이 이미지 계열을 계속 게시할 수 있었지만 이제 이미지 계열이 지원 중단되었고 계열 내 모든 이미지가 사용되지 않음으로 표시되었습니다.

2023년 10월 30일 이전에 만든 이러한 이미지를 기반으로 하는 가상 머신은 중단 없이 계속 실행됩니다. 그러나 해당 날짜 이후에는 이러한 이미지를 기반으로 하는 새 인스턴스 만들기가 실패합니다.

2023년 10월 30일 이전의 이미지에서 파생된 커스텀 이미지는 계속 작동합니다. 그러나 이러한 커스텀 이미지에는 화요일 Windows 업데이트 패치가 작동으로 수신되지 않으며 Mirantis Container Runtime의 업데이트된 버전도 수신되지 않습니다.

Mirantis Container Runtime이 사전 설치된 이미지를 계속 사용하려면 Google Cloud Marketplace에서 Miantsis Inc가 제공하는 이미지를 사용할 수 있습니다. 이러한 VM 이미지의 비용에는 Mirantis에서 직접 제공되는 Mirantis Container Runtime의 지원 및 라이선스가 포함됩니다. 또한 독립형 Mirantis Container Runtime을 사용하고 싶은 고객은 Mirantis website에서 직접 다운로드할 수 있습니다.

Docker CE와 같은 대체 컨테이너 런타임으로 마이그레이션하려면 위의 안내를 따르세요.

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

이전 버전의 Windows에서 빌드한 컨테이너는 최신 버전의 Windows를 실행 중인 Compute Engine 인스턴스에서 작동하지 않습니다. Docker는 기본적으로 Windows Server 2019 버전 컨테이너를 가져옵니다. 즉, 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 버전 20H2 인스턴스의 경우 다음 명령어를 사용하여 기본 2019 LTSC(1809) 컨테이너 대신 버전 20H2 nanoserver 컨테이너에서 명령어 프롬프트를 실행합니다.

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

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

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

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

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

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

이러한 제한 사항을 해결하는 데 권장되는 방법은 두 단계로 인스턴스 네트워크 인터페이스의 MTU1460으로 설정 단계와 컨테이너 네트워크 인터페이스의 MTU1460으로 설정하는 단계가 필요합니다. 또는 VPC의 MTU1500으로 설정할 수 있지만 이렇게 하려면 모든 VM을 중지하거나 마이그레이션해야 합니다.

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

Hyper-V 컨테이너 시작 실패

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

다음 단계