본문 바로가기

취미, 관심/NAS, Server

[Docker] 도커 멀티플랫폼 빌드하기(Docker Multi platform build, Buildx)

이 글은 제 ghost 로 올렸던 게시글을 옮긴 것입니다.

들어가며

개인적으로 오라클 프리티어에 올려서 사용하고 있는 nginx-php docker이미지가 있습니다.(오라클 대인배!)오라클 인스턴스는 E2.1.Micro(1ocpu, 1GB RAM) 인스턴스 2개와 A1 Flex 인스턴스(2c, 12GB) 2개를 사용중입니다.두개는 AMD64, 두개는 ARM기반입니다. 그러다보니 멀티플랫폼 이미지가 아니면 도커 스웜에서 제대로 동작하지 않게 됩니다.

이거저거 따라하며 빌드한 이미지라 멀티플랫폼은 꿈도 못꾸고, 그냥 각자 빌드해서 썼는데.. 검색해보니 buildx를 사용하면 좀더 쉽게 빌드가 가능한 것 처럼 보였습니다.

아래의 문서들을 참고했습니다.

Buildx 설치 확인

buildx 사용을 위해 일단 사용 가능한지 확인을 해봐야 합니다.사용하는 도커의 버전이 20 이상이라면 포함되어있습니다. 만약 없다면, 위 블로그들에 설정 방법이 있으니 참고해주세요.

사실 플랫폼 추가를 하려고 하는데 내용을 못찾아서 그 내용 메모를 위한 글일 뿐입니다;

docker buildx 를 입력해 사용 가능한지 확인해봅니다.

제 경우에는 바로 뜹니다.

지원되는 플랫폼 확인/추가

docker buildx ls

를 입력해 인스턴스를 확인합니다.

제 시스템에선 amd64만 뜹니다.. 일단 무시하고 진행했으나, 당연하게도 arm 기반의 시스템에서는 사용이 불가능한 이미지가 생성됩니다.

다른 글을 많이 찾아봤지만, 역시 매뉴얼이 최곱니다.

https://docs.docker.com/build/building/multi-platform/

위 링크에 따라 명령어를 하나 넣어줍니다.

번역기를 돌리면 대충..

없으면 이거 한줄 넣어서 지원되도록 하라고 합니다.

docker run --privileged --rm tonistiigi/binfmt --install all

이렇게 나오고..

다시

docker buildx ls

를 입력해보면

이제 모든 플랫폼이 뜹니다.

빌더 생성

아래 명령을 한줄씩 넣어줍니다.

빌더를 생성하고 사용하도록 합니다.

docker buildx create --name mybuilder --use

제대로 구성되었는지 확인

docker buildx inspect --bootstrap

위와같이 뜨게 되면 빌드가 정상적으로 되지도 않을 뿐더러, 업로드 한다고 해도 아래와 같은 오류를 보게 됩니다.

docker run --privileged --rm tonistiigi/binfmt --install all

 을 다시 넣어봅시다.

docker buildx rm mybuilder

를 입력해서 빌더를 제거하고, 새로 만들어봅니다.

정상적으로 플랫폼 지원이 확인되면 다음으로 진행합니다.(문제가 생기는 경우 오류를 그대로 복사해서 검색해보시면 됩니다;;)

이미지 빌드

이제 빌드를 하면 됩니다.

docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v7 -t [이미지이름]:[tag] --push .

지정한 플랫폼 모두 빌드를 시작합니다.이미지 3개를 만들고 병합하는 과정이라 생성하는 이미지에 따라 시간이 많이 걸릴 수 있습니다.

번외 – 빌드 속도

저는 구형 제온 X5670(6C12T) 시스템과, AMD 5700U(8C16T)를 함께 사용하고 있습니다.저전력 시스템이 코어수가 더 많네요 나이차이만큼 성능차이가 나는지.. 동일한 빌드를 돌려봤습니다.환경은 둘 모두 proxmox VM으로 올린 우분투이며, 두 시스템 모두 최대코어로 설정하고 메모리는 8GB를 줬어요.X5670에서는 2312.2s 걸렸습니다.5700U는 1104.1s 걸리네요;

이젠 성능도 딸리고 밥만 많이먹는 친구가 되었습니다 ㅠㅠ..

그럼 다 되는것인가.

무조건 다 되는건 아닙니다. 일단 사용하는 이미지(base image)가 멀티플랫폼을 지원해야만 합니다. wordpress 이미지를 사용해서 빌드하는데 wordpress가 amd64만 지원한다면 arm쪽은 빌드가 된다고 해도 사용할 수 없는 이미지가 될 거에요.