일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Linux
- kotlin spring
- Pinpoint
- kotlin coroutine
- CKA 기출문제
- IntelliJ
- 코틀린 코루틴의 정석
- 오블완
- 티스토리챌린지
- 정보처리기사 실기
- PETERICA
- mysql 튜닝
- 공부
- Java
- AI
- CKA
- Elasticsearch
- kotlin
- aws
- APM
- AWS EKS
- MySQL
- 정보처리기사실기 기출문제
- minikube
- Spring
- 기록으로 실력을 쌓자
- 정보처리기사 실기 기출문제
- CloudWatch
- Kubernetes
- kotlin querydsl
- Today
- Total
피터의 개발이야기
[Docker] 멀티 플랫폼, --platform 옵션 사용법 본문
ㅁ 들어가며
대부분의 PC는 Intel이어서 Intel 맥북의 경우 대부분 Docker의 플랫폼에 대해서 구분을 두지 않았었다. 하지만 맥미니M1을 구입하면서 플랫폼 차이로 인해 Rosetta 2 에뮬레이션을 이용해 다른 플랫폼을 실행하기 위한 [Docker] 맥북M1에 도커 컨테이너 colima설치에 대한 글을 쓰기도하였다. 최근 새로운 작업의 CICD 구성을 하면서 M3 맥북과 다양한 서버들을 경험하면서 플랫폼 차이로 인해 빌드, 도커 실행 시 문제점이 생기곤 하였다.
이번 글에서는 Docker에서 --platform 옵션은 다양한 아키텍처와 운영 체제에 대한 이미지를 빌드하고 실행할 때 유용하다. 이 옵션을 통해 특정 플랫폼에 맞는 이미지를 생성하거나 실행할 수 있다.
그리고 이를 이해하기 위해서는 Intel, AMD, ARM 플랫폼의 차이점을 이해해야 한다. docker platform을 이해하기 위해서는 x86, x86_64, amd64, arm, arm64, arm64/v8의 의미도 이해해야 한다.
ㅁ Intel, AMD, ARM 차이
Intel
가장 먼저, 가장 유명한 CPU 제조사이다. Intel은 x86 아키텍처를 사용한다.
AMD
Intel의 x86과 호환되는 CPU를 만드는 회사이다.
Intel과 AMD는 x86 아키텍처를 기반으로 하는 CPU를 생산한다.
복잡한 명령어 세트(CISC)를 가지고 있어 고성능 컴퓨팅 작업에 적합하지만, 높은 소비 전력과 발열 문제가 있다.
참고로 나의 Intel 맥의 경우 팬 소음으로 Macs Fan Control을 이용하여 관리하지만 항공기 소리가 난다. ^^
용어정리하면,
ㄴ x86: 32비트 아키텍처를 지칭하며, 주로 이전 세대 PC와 서버에서 사용됨
ㄴ x86-64: 64비트 확장 버전으로, AMD가 처음 개발
ㄴ AMD64: x86-64의 AMD 구현체, 현재는 Intel도 이 확장을 채택하여 사용 중
ARM
모바일 중심의 아키텍처로 발전하였는데, ARM은 저전력, 고효율을 목표로 설계된 아키텍처로, 주로 모바일 기기에서 사용되다가 최근 PC와 서버 시장으로 확장되고 있다. 간단한 명령어 세트(RISC)를 사용하여 낮은 소비전력과 적은 열을 발생하여 모바일 기기나 임베디드 시스템에 주로 사용하였는데 맥에서도 사용하고 있다.
관련용어
ㄴ ARM: 일반적으로 32비트 ARM 아키텍처를 지칭
ㄴ ARM64: 64비트 ARM 아키텍처, AArch64라고도 함
ㄴ ARMv8: 64비트 지원을 도입한 ARM 아키텍처 버전
ㅁ 플랫폼 확인 명령어
$ arch
$ uname -a
x86 # 32bit
x86_64 # 64bit
ㅁ 이미지 빌드 시 사용법
docker build --platform <platform> -t <image-name> .
## ex
$ docker build --platform linux/amd64 -t build-test:arm64 .
ㅁ 컨테이너 실행 시 사용법
docker run --platform <platform> <image-name>
M3맥북에서 x86_64 아키텍처용 이미지를 실행하려면:
docker run --platform linux/amd64 --name=build-test build-test:arm64
ㅇ arch와 uname -a 명령어를 통해 x86_64를 확인할 수 있다.
ㅁ 멀티 플랫폼 이미지 빌드
Docker는 multi-architecture 빌드 옵션을 지원하는 Buildx CLI 플러그인을 제공한다.
Buildx는 19.03 이후 버전부터 사용이 가능하다.
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:multi .
ㅇ BuildKit을 사용하여 여러 플랫폼용 이미지를 한 번에 빌드할 수 있다.
ㅁ 멀티 플랫폼 지원 확인
# docker context 확인
$ docker context ls
# context의 지원 플랫폼 확인
$ docker buildx ls
ㅇ Intel 맥북은 colima가 필요하지 않았다.
ㅁ QEMU
QEMU는 Docker 내부에서 사용하는 에뮬레이터(emulate) 빌드 환경으로 리눅에서 사용하는 Hypervisor의 일종이다.
QEMU는 내부적으로 binfmt_misc handler라 불리는 리눅스 커널 기능을 사용한다. 리눅스 커널이 현재 플랫폼에서 처리할 수 없는 명령어를 실행하기 위해 유저 스페이스에 해당 명령어를 처리 할 수 있는 다른 명령어로 처리하도록 한다.
추가적으로 binfmt을 사용하여 binfmt_misc handler에 핸들러를 추가로 설치할 수도 있다.
# 현재 플랫폼
$ docker buildx ls ✔ 9518 07:04:09
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
colima* docker
\_ colima \_ colima running v0.13.2 linux/amd64, linux/386
default docker
\_ default \_ default running v0.15.2 linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux docker
\_ desktop-linux \_ desktop-linux running v0.15.2 linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
# binfmt를 통한 플랫폼 추가
$ docker run --privileged --rm tonistiigi/binfmt --install all
Unable to find image 'tonistiigi/binfmt:latest' locally
latest: Pulling from tonistiigi/binfmt
8d4d64c318a5: Pull complete
e9c608ddc3cb: Pull complete
Digest: sha256:66e11bea77a5ea9d6f0fe79b57cd2b189b5d15b93a2bdb925be22949232e4e55
Status: Downloaded newer image for tonistiigi/binfmt:latest
installing: arm OK
installing: s390x OK
installing: mips64le OK
installing: mips64 OK
installing: arm64 OK
installing: ppc64le OK
installing: riscv64 OK
{
"supported": [
"linux/amd64",
"linux/arm64",
"linux/riscv64",
"linux/ppc64le",
"linux/s390x",
"linux/386",
"linux/mips64le",
"linux/mips64",
"linux/arm/v7",
"linux/arm/v6"
],
"emulators": [
"python3.12",
"qemu-aarch64",
"qemu-arm",
"qemu-mips64",
"qemu-mips64el",
"qemu-ppc64le",
"qemu-riscv64",
"qemu-s390x"
]
}
# 확장된 플랫폼 확인
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
colima* docker
\_ colima \_ colima running v0.13.2 linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default docker
\_ default \_ default running v0.15.2 linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
desktop-linux docker
\_ desktop-linux \_ desktop-linux running v0.15.2 linux/arm64, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
ㅇ colima의 플랫폼이 확장된 것을 확인할 수 있다.
ㅁ 마무리
--platform 옵션을 효과적으로 활용하면 다양한 환경에서 Docker 이미지를 유연하게 사용할 수 있다. 특히 크로스 플랫폼 개발이나 배포 시 매우 유용한 기능이다. 이 글을 통해 용어와 다양한 확장성까지 알아 볼 수 있었다.
ㅁ 함께 보면 좋은 사이트
ㅇ [Docker] 맥북M1에 도커 컨테이너 colima설치
ㅇ https://velog.io/@480/이제는-개발자도-CPU-아키텍처를-구분해야-합니다
ㅇ [Docker] Buildx로 cross-platform 이미지 빌드하기
'DevOps > Docker' 카테고리의 다른 글
Trivy: 컨테이너 이미지 취약점 스캐너 사용법 (1) | 2025.01.04 |
---|---|
[Docker] Distroless 이미지란? (0) | 2025.01.04 |
[Docker] Docker 컨테이너에서 한국 시간(KST)을 적용하는 방법 (0) | 2024.12.13 |
[Docker] Multi-stage 빌드로 Go 애플리케이션 최적화하기 (0) | 2024.12.03 |
[Docker] Rocky Linux9 설치 및 FFMPEG 설치방법 (0) | 2024.12.02 |