16 어떤 시스템이든 실행 가능한 Docker 이미지 구축

seohan·2022년 3월 22일
0

이 책에는 수십 가지의 실습 실습이 있으며, 따라 하기 위해 다른 기계를 사용했다면 Mac, Windows, Linux 및 Raspberry Pi에서 동일한 방식으로 실습이 작동하는 것을 보았을 것입니다. 이 책의 모든 Docker 이미지를 다중 아키텍처 이미지로 구축했습니다. 다중 아키텍처 이미지는 각각 다른 운영 체제 또는 CPU 아키텍처를 대상으로 하지만 모두 동일한 이미지 이름을 사용하는 여러 변형이 있는 레지스트리에 빌드되고 푸시됩니다. 이러한 이미지 중 하나를 사용하여 컨테이너를 실행하거나 다른 이미지를 빌드하면 Docker는 시스템의 CPU 및 OS에 대해 일치하는 변형을 가져옵니다. 다른 아키텍처에서 동일한 이미지 이름을 사용하는 경우 다른 이미지 변형을 얻게 되지만 동일한 앱이고 동일한 방식으로 작동합니다. 사용자에게는 매우 쉬운 워크플로이지만 이미지 게시자에게는 약간의 노력이 필요합니다.

이 장에서는 다중 아키텍처 빌드를 생성하는 다양한 방법을 배우게 되지만 Windows 또는 Arm을 사용하지 않기 때문에 이 빌드를 건너뛸 생각이라면 최소한 첫 번째 섹션을 읽고 이것이 왜 필요한지 알아야 합니다.

16.1 다중 아키텍처 이미지가 중요한 이유

Amazon Web Services는 Intel, AMD 또는 Arm 프로세서를 사용하는 VM에 대해 다양한 클래스의 컴퓨팅을 제공합니다. Arm 옵션(A1 인스턴스라고 함)은 Intel/AMD 옵션 가격의 거의 절반입니다. AWS는 Arm을 지원하는 최초의 주요 클라우드이지만 Arm CPU의 절감으로 인해 다른 클라우드도 AWS에 대한 워크로드를 잃기 시작하면 지원을 추가할 것이라고 확신할 수 있습니다. 애플리케이션을 가져 와서 거의 절반 가격으로 실행할 수 있다면 왜 하지 않겠습니까? 글쎄요, Intel용으로 빌드된 앱을 Arm에서 실행하기가 어렵기 때문입니다.

다른 한편으로 IoT 장치는 전력 소비 면에서 매우 효율적이기 때문에 일반적으로 ARM 프로세서를 실행하고(따라서 클라우드에서 가격 인하), 컨테이너 이미지로 장치에 소프트웨어를 제공하는 것도 좋을 것입니다. 그러나 ARM CPU 명령어는 Intel과 AMD가 사용하는 표준 x64 명령어와 호환되지 않습니다. 따라서 클라우드나 에지(또는 Raspberry Pi로 가득 찬 데이터 센터)에서 ARM CPU를 지원하려면 ARM에서 실행할 수 있는 애플리케이션 플랫폼을 사용해야 하고 ARM 머신을 사용하여 앱을 빌드해야 합니다. 프로덕션 빌드 팜과 개발자 워크플로 모두에서 Docker가 해결하는 어려운 부분입니다. Docker Desktop은 Intel 시스템에서도 ARM 아키텍처를 사용하여 Docker 이미지를 빌드하고 컨테이너를 실행하기 위한 에뮬레이션을 지원합니다.

TRY 이것은 Docker Engine 또는 PWD 사용자를 위한 것이 아닙니다. 엔진에만 ARM 에뮬레이션이 없기 때문에 Docker Desktop에만 제공됩니다. Mac 또는 Windows(Linux 컨테이너 모드)에서 이 작업을 수행할 수 있습니다.

  1. 먼저 고래 아이콘 설정에서 실험 모드를 활성화해야 합니다(그림 16.1 참조).

  2. Now open a terminal and build an image using Arm emulation:

# switch to the exercises folder:
 cd ch16/exercises
 # build for 64-bit Arm:
 docker build -t diamol/ch16-whoami:linux-arm64 --platform linux/arm64 ./whoami
 # check the architecture of the image:
 docker image inspect diamol/ch16-whoami:linux-arm64 -f '{{.Os}}/{{.Architecture}}'
 # and the native architecture of your engine:
 docker info -f '{{.OSType}}/{{.Architecture}}'

자신의 컴퓨터가 64비트 Intel 또는 AMD 컴퓨터에서 실행 중이더라도 빌드한 이미지가 64비트 ARM 플랫폼을 대상으로 한다는 것을 알 수 있습니다. 이 이미지는 다단계 Dockerfile을 사용하여 .NET Core 애플리케이션을 컴파일하고 패키징합니다. .NET Core 플랫폼은 ARM에서 실행되고 Dockerfile의 기본 이미지(SDK 및 런타임용)에는 ARM 변형이 있습니다. 이것이 플랫폼 간 빌드를 지원하는 데 필요한 전부입니다.

이 이미지를 레지스트리로 푸시하고 정품 ARM 머신(예: Raspberry Pi 또는 AWS의 A1 인스턴스)에서 컨테이너를 실행할 수 있으며 제대로 작동합니다. 그림 16.2에서 내 출력을 볼 수 있습니다. 여기서 Intel 시스템에서 ARM 이미지를 구축했습니다.

Docker는 운영 체제 및 CPU 아키텍처를 포함하여 시스템에 대한 많은 정보를 알고 있으며 이미지를 가져오려고 할 때 일치 항목으로 사용합니다. 이미지 가져오기는 단순히 레이어를 다운로드하는 것 이상입니다. 압축된 레이어를 확장하고 이미지를 실행할 준비를 하기 위한 최적화도 있습니다. 이 최적화는 사용하려는 이미지가 실행 중인 아키텍처와 일치하는 경우에만 작동하므로 일치하는 항목이 없으면 오류가 발생합니다. 이미지를 가져와서 시도하고 실행할 수도 없습니다.

TRY Linux 컨테이너를 실행하는 Docker 엔진을 사용하여 이를 확인할 수 있습니다. Microsoft Windows 이미지를 다운로드해 보십시오.

# pull the Windows Nano Server image:
docker image pull mcr.microsoft.com/windows/nanoserver:1809

매니페스트 목록은 이미지의 변형 집합입니다. Windows Nano 서버 이미지는 진정한 다중 아키텍처가 아니며 Windows 컨테이너에서만 실행됩니다. 매니페스트 목록에는 Linux 변형이 없습니다. 기본 원칙은 이미지의 아키텍처가 엔진의 아키텍처와 일치해야 하지만 몇 가지 뉘앙스가 있다는 것입니다. 일치하지 않는 CPU 아키텍처에 대해 Linux 이미지를 가져올 수 있지만 컨테이너는 "사용자 프로세스로 인한 '실행 형식 오류'" 메시지. 일부 Windows 엔진에는 LCOW(Linux Containers on Windows)라는 실험적 기능이 있어 Linux 컨테이너를 실행할 수 있습니다(그러나 복잡한 앱은 훨씬 더 모호한 로그로 실패함). 엔진에 대해 일치하는 아키텍처를 고수하는 것이 가장 좋으며, 다중 아키텍처 이미지를 사용하면 필요한 경우 각 OS 및 CPU에 맞게 이미지를 조정할 수 있습니다.

16.2 하나 이상의 Dockerfile에서 다중 아키텍처 이미지 빌드

다중 아치 이미지를 구축하는 데에는 두 가지 접근 방식이 있습니다. 먼저 이 장의 연습에서 whoami 앱의 예를 따릅니다. 소스에서 앱을 컴파일하고 컨테이너에서 실행되도록 패키지하는 다단계 Dockerfile을 작성합니다. SDK 및 런타임에 사용하는 이미지가 지원하고자 하는 모든 아키텍처를 지원한다면 계속 진행할 수 있습니다.

이 접근 방식의 큰 이점은 단일 Dockerfile이 있고 지원하려는 아키텍처를 얻기 위해 다른 시스템에 빌드한다는 것입니다. 이 접근 방식을 사용하여 .NET Core 스택에 대한 고유한 골든 이미지를 빌드합니다. 그림 16.4는 SDK에 대한 접근 방식을 보여줍니다.


그림 16.4 다중 구조 이미지를 기반으로 하는 다중 단계 Dockerfile을 사용하여 고유한 다중 구조 이미지 빌드

소스 이미지가 다중 아키텍처 이미지가 아니거나 지원하려는 모든 이미지를 지원하지 않는 경우 이 접근 방식을 따를 수 없습니다. Docker Hub의 대부분의 공식 이미지는 다중 아키텍처이지만 원하는 모든 변형을 모두 지원하지는 않습니다. 이 경우 Linux용과 Windows용 또는 Arm 32비트 및 64비트용 추가 Dockerfile이 필요합니다. 이 접근 방식은 유지 관리할 Dockerfile이 여러 개 있기 때문에 더 많은 관리가 필요하지만 각 대상 아키텍처에 대해 동작을 조정할 수 있는 훨씬 더 많은 자유를 제공합니다. 나는 이 접근 방식을 Maven용 골든 이미지(자바 앱을 빌드하는 도구)에 사용합니다. 그림 16.5는 스택을 보여줍니다.

이 장의 연습에는 매우 간단한 폴더 목록 앱이 있습니다. 이 앱은 런타임에 대한 몇 가지 기본 정보를 인쇄한 다음 폴더의 내용을 나열합니다. 이 책에서 지원하는 아키텍처별로 하나씩 네 개의 Dockerfile이 있습니다. Windows on Intel, Linux on Intel, Linux on 32비트 Arm, Linux on 64비트 Arm입니다. Linux 컨테이너와 함께 Docker Desktop의 CPU 에뮬레이션을 사용하여 이 중 세 가지를 빌드하고 테스트할 수 있습니다.


그림 16.5 각 아키텍처에 맞게 조정된 Dockerfile을 사용하여 다중 아키텍처 이미지를 빌드할 수도 있습니다.

profile
코드코드

0개의 댓글