Jihyeok's Blog Build a Docker Image for Multi-Architectures
Jihyeok's Blog
Cancel

Build a Docker Image for Multi-Architectures

최근 M1 칩 기반의 맥북 프로를 사용하면서 Docker image를 생성하는데 문제가 발생하게 되었습니다. Apple M1은 ARM 기반의 칩으로서 기존의 인텔 기반의 칩과는 다른 CPU 아키텍처를 사용합니다. 따라서, Docker image를 생성할 때 이를 고려하지 않고 생성하게 되면, 다른 CPU 아키텍처에서는 Docker image를 사용할 수 없게 됩니다. 이를 해결하기 위해서, 이 글에서는 buildx 명령어를 사용하는 방법에 대해서 알아보도록 하겠습니다.

우선, 다음과 같이 buildx를 이용해 multiarch_builder라는 이름의 builder를 생성합니다. 여기서 --use 옵션은 생성과 동시에 이 builder를 사용하겠다는 의미입니다.

1
$ docker buildx create --name multiarch_builder --use

따라서, 이 명령어를 실행한 이후에 다음과 같이 현재 builder에 대한 검사를 해보면, 새롭게 multiarch_builder라는 builder가 생성되었고, 이를 사용중임을 알 수 있습니다.

1
2
3
4
5
6
7
8
$ docker buildx ls
NAME/NODE            DRIVER/ENDPOINT             STATUS  PLATFORMS
multiarch_builder *  docker-container
  multiarch_builder0 unix:///var/run/docker.sock running linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, 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 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
default              docker
  default            default                     running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

이렇게 여러 아키텍처를 위한 이미지 생성을 위한 준비는 완료가 되었습니다. 예시로, Ubuntu 20.04 LTS에 대한 docker를 기반으로 image를 생성해 보도록 하겠습니다. 우선, 다음과 같이 Dockerfile을 작성해줍니다.

1
2
FROM ubuntu:20.04
CMD echo 42

그리고 다음과 같이 linux/amd64linux/arm64 두 종류의 아키텍처를 위한 Docker image를 생성을 해보도록 하겠습니다.

1
$ docker buildx build --platform linux/amd64,linux/arm64 -t jhnaldo/temp --push .

그리고, 이제 서로 다른 CPU 아키텍처를 사용하는 머신에서 다음과 같이 Docker image를 실행하면 잘 실행이 된다는 것을 확인할 수 있습니다.

1
$ docker run -it --rm jhnaldo/temp

그리고, Docker Hub에 들어가서 해당하는 Docker image의 Tags 탭으로 들어가보면 각 Tag의 OS/ARCH 항목을 확인해 볼 수 있는데, 다음과 같이 linux/amd64와 linux/arm64가 모두 지원되는 것을 확인할 수 있습니다. Docker Hub 예시

This post is licensed under CC BY 4.0 by the author.
Trending Tags