본문 바로가기
클라우드

Mac에서 Podman으로 멀티 아키텍처(Intel & ARM) 이미지 한 번에 빌드하기

by gasbugs 2026. 3. 18.

최근 클라우드 서버(Intel/AMD)와 개발용 개인 PC(Apple Silicon 등 ARM)의 아키텍처가 파편화됨에 따라, 단일 환경에 종속되지 않는 멀티 아키텍처(Multi-Architecture) 컨테이너 이미지의 필요성이 커졌습니다. 이 글에서는 Mac 환경에서 오직 Podman만을 사용하여 Intel(linux/amd64)과 ARM(linux/arm64) 계열 모두에서 동작하는 이미지를 구축하는 방법을 상세히 설명합니다.

 

 

1. 멀티 아키텍처 이미지와 매니페스트(Manifest)의 개념 🧠

일반적으로 컨테이너 이미지는 빌드를 수행하는 호스트의 아키텍처를 따릅니다. 따라서 Apple Silicon Mac에서 단순 빌드한 이미지는 Intel 서버에서 실행할 수 없습니다.

멀티 아키텍처 이미지는 '매니페스트(Manifest) 리스트'라는 개념을 사용합니다. 이는 하나의 이미지 태그(예: myapp:latest) 아래에 여러 아키텍처용 이미지를 묶어두는 목차 역할을 합니다. 사용자가 이미지를 내려받을 때, 컨테이너 엔진이 현재 시스템의 아키텍처를 확인하고 매니페스트에서 알맞은 이미지를 자동으로 선택합니다.

2. 사전 준비: Mac 환경의 Podman Machine 설정 ⚙️

Mac 환경에서는 리눅스 커널이 없으므로 Podman이 네이티브로 동작하지 않고 가상 머신(VM) 위에서 실행됩니다. Mac에 설치된 Podman은 podman machine 명령어를 통해 VM을 관리합니다.

Apple Silicon(M1, M2, M3 등) Mac의 경우, 이 VM 내부에서 QEMU 또는 Apple의 Rosetta 2를 통한 x86_64(Intel) 에뮬레이션이 기본적으로 지원됩니다. 따라서 리눅스 환경처럼 복잡한 에뮬레이터 패키지를 설치할 필요 없이 VM만 실행하면 됩니다.

# Podman 가상 머신 초기화 (최초 1회)
podman machine init

# Podman 가상 머신 실행
podman machine start

# VM 상태 및 에뮬레이션 지원 여부 확인
podman info

3. 실습용 Containerfile 작성 📄

테스트를 위해 아키텍처 정보를 출력하는 아주 간단한 이미지를 준비합니다. 파일 이름은 Containerfile 또는 Dockerfile 모두 무방합니다.

# Containerfile
FROM alpine:latest

# 빌드된 환경의 아키텍처를 출력하는 명령
CMD ["uname", "-m"]

4. 방법 1: 단일 명령어로 멀티 아키텍처 빌드 (권장) 🚀

Podman은 --platform 플래그와 --manifest 플래그를 조합하여 한 번의 명령어로 여러 아키텍처 이미지를 빌드하고 매니페스트로 묶는 기능을 제공합니다.

# linux/amd64와 linux/arm64 플랫폼을 동시에 빌드하고 my-multi-app:latest 매니페스트 생성
podman build --platform linux/amd64,linux/arm64 --manifest my-multi-app:latest .

 

이 명령어가 실행되는 과정은 다음과 같습니다.

  1. amd64 아키텍처 환경으로 격리된 컨테이너 빌드를 수행합니다. (Mac의 에뮬레이션 활용)
  2. arm64 아키텍처 환경으로 격리된 컨테이너 빌드를 수행합니다. (Apple Silicon 네이티브)
  3. 두 개의 독립된 이미지를 로컬 저장소에 저장합니다.
  4. my-multi-app:latest라는 이름의 매니페스트 리스트를 생성하고, 앞서 빌드한 두 이미지를 하나로 연결합니다.

5. 방법 2: 개별 빌드 후 매니페스트로 병합 🧩

빌드 과정이 아키텍처별로 상이하거나, 이미 빌드된 기존 이미지를 묶어야 할 때는 수동으로 매니페스트를 제어할 수 있습니다.

# 1. 빈 매니페스트 생성
podman manifest create my-manual-app:latest

# 2. 아키텍처별로 이미지 개별 빌드
podman build --platform linux/amd64 -t my-manual-app:amd64 .
podman build --platform linux/arm64 -t my-manual-app:arm64 .

# 3. 생성된 매니페스트에 개별 이미지 추가
podman manifest add my-manual-app:latest localhost/my-manual-app:amd64
podman manifest add my-manual-app:latest localhost/my-manual-app:arm64

6. 결과 확인 및 레지스트리 푸시 ☁️

생성된 매니페스트가 여러 아키텍처를 정상적으로 포함하고 있는지 검사합니다.

# 매니페스트 정보 검사
podman manifest inspect my-multi-app:latest

 

출력되는 JSON 정보의 manifests 배열 안에 amd64와 arm64가 모두 존재하는지 확인합니다. 확인이 끝났다면 외부 컨테이너 레지스트리(Docker Hub, AWS ECR 등)로 푸시합니다.

# 매니페스트 자체를 레지스트리에 푸시
# (매니페스트에 연결된 모든 아키텍처의 이미지 레이어가 한 번에 업로드됨)
podman manifest push my-multi-app:latest docker://docker.io/myusername/my-multi-app:latest

 

매니페스트 푸시가 완료되면, 인텔 서버나 ARM PC 등 어떤 장비에서든 podman run --rm myusername/my-multi-app:latest를 실행했을 때 해당 장비 아키텍처에 맞는 컨테이너가 정확하게 구동됩니다.