최근 클라우드 서버(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 .
이 명령어가 실행되는 과정은 다음과 같습니다.
- amd64 아키텍처 환경으로 격리된 컨테이너 빌드를 수행합니다. (Mac의 에뮬레이션 활용)
- arm64 아키텍처 환경으로 격리된 컨테이너 빌드를 수행합니다. (Apple Silicon 네이티브)
- 두 개의 독립된 이미지를 로컬 저장소에 저장합니다.
- 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를 실행했을 때 해당 장비 아키텍처에 맞는 컨테이너가 정확하게 구동됩니다.
'클라우드' 카테고리의 다른 글
| 🛡️ Docker Swarm에서 --with-registry-auth의 늪 탈출하기: 보안과 효율성 사이의 균형 (0) | 2026.01.09 |
|---|---|
| 🐳 도커 데몬 소켓 노출 가이드: 효율과 보안 사이의 균형 잡기 (0) | 2026.01.09 |
| 🐳 도커(Docker) 라이프 사이클 완벽 정리: 이미지부터 컨테이너 실행, 삭제까지 (0) | 2025.12.15 |
| 🚛 Docker에서 Containerd로 이사 가기: 명령어 완벽 적응 가이드 & 비교표 (0) | 2025.12.11 |
| [개발자 비상] "그 서버 왜 켜놨어요?"... 지갑을 감시하는 저승사자, FinOps의 습격 💸🕵️ (0) | 2025.12.09 |