[Docker] 플랫폼별 이미지 관리
Docker가 가상화를 해준다고 해서 모든 리눅스 환경에서 잘 동작하게 알아서 해주냐고 하면, 그렇지는 않다.
같은 리눅스라도 아키텍쳐, 그러니까 CPU 종류가 다르면 아예 다르게 동작하기 때문이다.
그래서 amd64 환경에서 빌드한 docker image는 arm64 환경에서는 동작하지 않는다.
이 세상이 아직 인텔 천하라면 별 문제가 없었겠지만, 문제는 arm64이 우월한 비용/성능으로 서버 환경까지 상당수 점유하고 있다는 것이다.
그런 까닭에 베이스로 사용할 Docker 이미지를 빌드하거나, 최종 이미지를 빌드하는데 있어서도 플랫폼별 처리가 상당히 중요해졌다.
Docker hub 등지에서 일반적인 이미지들을 보면,
보통 amd64와 arm64 정도는 기본으로 제공해주는 것을 볼 수 있다.
이렇게 만들어야 arm64 머신에서 다운을 받을 때도 잘 되고, amd64 머신에서 다운을 받을 때도 잘 된다.
buildx를 통한 크로스플랫폼 빌드
amd64 머신에서 docker 이미지를 말면 당연히 amd64 환경에만 맞는 이미지가 나온다. 당연한 이야기다.
docker의 확장 도구 중 하나인 buildx를 쓰면 다른 플랫폼에 맞는 형태로 이미지를 빌드할 수도 있다.
buildx는 내부적으로 qemu 에뮬레이터를 올려서 가상화된 환경에서의 빌드를 지원한다.
buildx 세팅이 되어있지 않다면 다음 명령으로 세팅할 수 있다.
sudo docker buildx create --name multiplatform --driver docker-container --use
sudo docker buildx inspect --bootstrap
만약 amd64 버전으로 빌드를 하고 싶다면, 이렇게 할 수 있다.
sudo docker buildx build --platform linux/amd64 -t 태그명 .
platform 플래그로 빌드할 환경을 지정할 수 있다는 것을 제외하면 docker build 명령과 거의 동등하다.
여러 플랫폼을 동시에 빌드하게 할 수도 있다.
sudo docker buildx build --platform linux/amd64,linux/amd64 -t 태그명 .
이러면 이걸 단일 이미지인 것처럼 매니페스트로 묶어준다.
그렇게 빌드해서 올려보면

이렇게 잘 엮여서 올라가있는 것을 볼 수 있다.
buildx 없이 직접 마는 방법
굳이굳이 buildx 없이 직접 크로스플랫폼 이미지를 만들고 싶다면, 물론 가능은 하다.
하지만 현재 머신과 다른 플랫폼을 빌드하기 위해서는 Qemu 같은 에뮬레이터 도구부터 사용해야 한다.
추가 세팅이 없으면 docker는 현재 플랫폼에 맞는 형태로만 빌드를 하기 때문이다.
그런 다음에는 manifest를 통해서 직접 플랫폼별 이미지에 대한 단일 매니페스트를 만들고 올려야 한다.
sudo docker manifest create 태그명 플랫폼1태그 플랫폼2태그...
sudo docker push 태그명참조
https://kimjingo.tistory.com/115
https://docs.docker.com/build/building/multi-platform/
https://stackoverflow.com/questions/72444103/what-does-running-the-multiarch-qemu-user-static-does-before-building-a-containe
https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/