최근 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/amd64
와 linux/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가 모두 지원되는 것을 확인할 수 있습니다.