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

  • 다중 아키텍처 이미지는 여러 개의 변종 이미지 형태로 빌드되고 레지스트리에 푸시된다.
  • 각각의 변종 이미지는 서로 다른 아키텍처나 운영체제 환경을 대상으로 한다.
  • 컨테이너를 실행하든 다른 이미지를 빌드하기 위해서든 다중 아키텍처 이미지를 내려받으려 시도하면, 도커는 현재 컴퓨터의 아키텍처와 운영체제에 일치하는 변종 이미지를 받아 온다.

실습 아쉽지만 이 실습은 도커 엔진 단독 환경이나 Play with Docker에서는 진행할 수 없다. ARM 에뮬레이션 기능은 도커 데스크톱에서만 사용할 수 있기 때문이다. 맥과 윈도(리눅스 컨테이너 모드)의 도커 데스크톱에서 실습을 진행하기 바란다.

  • 도커 데스크톱은 ARM 아키텍처에서 이미지를 빌드하고 컨테이너를 실행할 수 있는 에뮬레이션 기능을 제공한다
001) # 실습용 예제 코드 디렉터리로 이동
002)  cd ch16/exercises
003) 
004) # 64비트 ARM 프로세서용으로 빌드
005)  docker build -t diamol/ch16-whoami:linux-arm64 --platform linux/arm64 ./whoami 
006) [+] Building 6.6s (17/17) FINISHED                                                                               
007)  ...
008)  => [stage-1 3/3] COPY --from=builder /out/ .
009)  => exporting to image                                                                                       0.0s 
010)  => => exporting layers                                                                                      0.0s 
011)  => => writing image sha256:ad55de14a27641360400704fdad95575aa4c849dfe9ee598100ab64f5c9df979                 0.0s 
012)  => => naming to docker.io/diamol/ch16-whoami:linux-arm64                                                    0.0s
013)  
014) # 이미지 아키텍처를 확인한다
015)  docker image inspect diamol/ch16-whoami:linux-arm64 -f '{{.Os}}/{{.Architecture}}'
016) linux/arm64
017) 
018) # 도커 엔진의 네이티브 아키텍처와 비교한다
019)  docker info -f '{{.OSType}}/{{.Architecture}}'
020) linux/aarch64
  1. 008: 컨테이너에서 빌드가 수행되는 멀티 스테이지 빌드다. SDK 이미지가 다중 아키텍처 이미지이므로 이 이미지는 도커 데스크톱의 에뮬레이션 기능을 통해 ARM 프로세서용으로 빌드된다.
  2. 016: 이미지의 대상 아키텍처가 64비트 ARM 플랫폼 임을 알 수 있다.

  3. 이 이미지는 멀티 스테이지 Dockerfile로 컴파일되고 패키징된 닷넷 코어 애플리케이션이다.

  4. 닷넷 코어 플랫폼은 ARM 프로세서에서도 동작하므로 Dockerfile 스크립트에 지정된 기반 이미지도 ARM 프로세서 버전이 따로 있다.
  5. 이 조건만 충족하면 크로스 플랫폼 빌드가 가능하다.
  6. 이 이미지를 레지스트리에 푸시하고 진짜 ARM 프로세서가 달린 컴퓨터(라즈베리 파이 또는 AwS의 A1 인스턴스)에서 이 이미지를 내려받아 컨테이너를 실행하면 실제로 잘 동작한다.

실습 리눅스 컨테이너를 실행할 수 있는 도커 엔진을 실행 중이라면 이 실습을 진행할 수 있다. 마이크로소프트 윈도 이미지를 내려받아 보자.

  • 도커는 시스템 정보를 이용해 환경에 맞는 이미지를 내려받는다.
  • 이미지를 내려받는 과정에는 그냥 그 이미지를 구성하는 레이어를 내려받는 것 외에 이미지를 곧바로 사용할 수 있도록 레이어의 압축을 푸는 최적화 과정도 포함된다.
  • 하지만 이 최적화 과정은 이미지의 아키텍처와 현재 컴퓨터의 아키텍처가 일치해야만 한다.
  • 만약 두 아키텍처가 일치하지 않으면 이미지를 내려받을 수조차 없다.
001)  docker image pull mcr.microsoft.com/windows/nanoserver:1809
002) 1809: Pulling from windows/nanoserver
003) no matching manifest for linux/arm64/v8 in the manifest list entries
  1. 001: 이 이미지는 ARM 프로세서 및 인텔 프로세서용 변종이 모두 있는 멀티 아키텍처 이미지이지만, 이들은 모두 윈도용이다.
  2. 003: 운영체제와 일치하는 변종이 없기 때문에 오류가 발생한다. 이미지의 매니페스트 리스트는 이미지의 변종 목록이다.

윈도용 도커 엔진과 리눅스용 이미지 * 리눅스용 이미지는 아키텍처가 일치하지 않아도 내려받기가 가능하다. * 그러나 컨테이너를 실행해 보면 "user process caused 'exec format error'" 라는 메시지와 함께 오류를 일으킬 것이다. * 윈도용 도커 엔진 중에는 Linux Containers on Windows(LCOW)라는 실험적 기능을 탑재한 버전이 있다. * 이 기능이 탑재된 윈도용 도커 엔진은 리눅스 컨테이너를 실행할 수 있다(하지만 복잡한 애플리케이션은 한 층 더 읽기 힘든 로그를 내뿜으며 실행되지 않는다). * 최선은 엔진과 아키텍처가 일치하는 이미지를 사용하되 다중 아키텍처 이미지는 필요한 경우에 개별 운영체제와 아키텍처에 대한 맞춤 기능을 제공하는 목적으로 사용하는 것이다.

links

social