docker manifest create 명령을 사용하여 멀티 아키텍처 이미지 빌드 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker manifest create 명령을 사용하여 멀티 아키텍처 Docker 이미지를 구축하고 관리하는 방법을 배우게 됩니다. 멀티 아키텍처 이미지는 amd64arm64와 같이 서로 다른 CPU 아키텍처를 가진 다양한 환경에 애플리케이션을 배포하는 데 필수적입니다.

이 랩에서는 실험적 기능을 활성화하고 멀티 아키텍처 빌더 인스턴스를 생성하여 멀티 아키텍처 이미지를 준비하는 과정을 안내합니다. 그런 다음 이러한 이미지를 번들로 묶는 매니페스트 목록을 생성하고, 생성된 매니페스트 목록을 검사하여 내용을 확인한 다음, 매니페스트 목록을 레지스트리에 푸시하여 다양한 플랫폼에서 배포할 수 있도록 멀티 아키텍처 이미지를 사용할 수 있게 합니다.

멀티 아키텍처 이미지 준비

이 단계에서는 멀티 아키텍처 이미지를 준비합니다. 멀티 아키텍처 이미지를 사용하면 amd64arm64와 같은 서로 다른 아키텍처에서 실행할 수 있는 이미지를 빌드하고 푸시할 수 있습니다. 이는 클라우드 서버, 엣지 장치 및 로컬 머신을 포함한 다양한 환경에 애플리케이션을 배포하는 데 유용합니다.

먼저 Docker 에서 실험적 기능을 활성화해야 합니다. 이를 통해 멀티 아키텍처 이미지를 빌드하는 데 필요한 buildx 명령을 사용할 수 있습니다. Docker 구성 파일을 생성하거나 수정하여 이 작업을 수행할 수 있습니다.

nano를 사용하여 Docker 구성 파일을 엽니다.

nano ~/.docker/config.json

파일이 없으면 nano가 파일을 생성합니다. 파일에 다음 내용을 추가합니다. 파일이 이미 있는 경우 메인 JSON 객체 내에 "experimental": "enabled" 줄을 추가합니다.

{
  "experimental": "enabled"
}

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

다음으로, 여러 아키텍처를 지원하는 새로운 빌더 인스턴스를 생성해야 합니다. 빌더 인스턴스는 빌드 프로세스를 관리하는 Docker 구성 요소입니다.

mybuilder라는 새 빌더 인스턴스를 생성합니다.

docker buildx create --name mybuilder --use

이 명령은 mybuilder라는 새 빌더 인스턴스를 생성하고 후속 빌드 작업에 대한 기본 빌더로 설정합니다. 출력은 빌더가 생성되어 사용 중임을 나타내야 합니다.

이제 간단한 멀티 아키텍처 이미지를 빌드해 보겠습니다. Alpine Linux 를 기반으로 이미지를 생성하는 기본 Dockerfile을 사용합니다.

프로젝트용 디렉토리를 생성하고 해당 디렉토리로 이동합니다.

mkdir ~/project/multiarch-demo
cd ~/project/multiarch-demo

이 디렉토리에 Dockerfile을 생성합니다.

nano Dockerfile

Dockerfile에 다음 내용을 추가합니다.

FROM alpine:latest
CMD ["echo", "Hello from multi-architecture image!"]

Ctrl + X, Y, Enter를 눌러 Dockerfile을 저장합니다.

이제 linux/amd64linux/arm64 아키텍처 모두에 대해 이미지를 빌드하고 더미 레지스트리에 푸시합니다. 레지스트리 자리 표시자로 localhost:5000을 사용합니다. 실제 시나리오에서는 이를 실제 레지스트리 주소로 바꿉니다.

멀티 아키텍처 이미지를 빌드하고 푸시합니다.

docker buildx build --platform linux/amd64,linux/arm64 -t localhost:5000/multiarch-demo:latest --push .

이 명령은 지정된 플랫폼 (linux/amd64linux/arm64) 에 대한 이미지를 빌드하고, localhost:5000/multiarch-demo:latest로 태그를 지정하고, localhost:5000 레지스트리에 푸시합니다. 출력은 각 아키텍처에 대한 빌드 프로세스와 푸시 작업을 보여줍니다.

이미지용 매니페스트 목록 생성

이 단계에서는 이전 단계에서 빌드한 멀티 아키텍처 이미지에 대한 매니페스트 목록을 생성합니다. 매니페스트 목록은 각기 다른 아키텍처에 대한 이미지 매니페스트 목록입니다. 매니페스트 목록을 사용하여 이미지를 풀하면 Docker 는 자동으로 해당 아키텍처에 맞는 이미지를 선택합니다.

docker manifest create 명령을 사용하여 매니페스트 목록을 생성합니다. 이 명령은 생성하려는 매니페스트 목록의 이름과 목록에 포함하려는 이미지의 이름을 차례로 사용합니다.

localhost:5000/multiarch-demo:latest라는 매니페스트 목록을 생성합니다.

docker manifest create localhost:5000/multiarch-demo:latest \
  localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1) \
  localhost:5000/multiarch-demo:latest@sha256:$(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1)

이 명령을 자세히 살펴보겠습니다.

  • docker manifest create localhost:5000/multiarch-demo:latest: 생성하려는 매니페스트 목록의 이름을 지정합니다.
  • localhost:5000/multiarch-demo:latest@sha256:...: 매니페스트 목록에 추가하는 이미지입니다. 이미지 이름 뒤에 @sha256:과 이미지 다이제스트를 사용합니다. 다이제스트는 특정 이미지 레이어를 고유하게 식별합니다.
  • $(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | head -n 1): 이 명령 체인은 docker buildx imagetools inspect에 의해 나열된 첫 번째 이미지의 다이제스트를 검색합니다.
  • $(docker buildx imagetools inspect localhost:5000/multiarch-demo:latest | grep 'Digest:' | awk '{print $2}' | tail -n 1): 이 명령 체인은 docker buildx imagetools inspect에 의해 나열된 두 번째 이미지의 다이제스트를 검색합니다.

docker manifest create 명령의 출력은 새로 생성된 매니페스트 목록의 다이제스트가 됩니다.

생성된 매니페스트 목록 검사

이 단계에서는 이전 단계에서 생성한 매니페스트 목록을 검사합니다. 매니페스트 목록을 검사하면 목록에 포함된 이미지와 아키텍처 및 운영 체제와 같은 세부 정보를 확인할 수 있습니다.

docker manifest inspect 명령을 사용하여 매니페스트 목록의 세부 정보를 확인합니다.

localhost:5000/multiarch-demo:latest 매니페스트 목록을 검사합니다.

docker manifest inspect localhost:5000/multiarch-demo:latest

이 명령의 출력은 매니페스트 목록을 설명하는 JSON 문서가 됩니다. 각기 다른 아키텍처에 대한 이미지를 나타내는 "manifests" 배열이 표시되어야 합니다. 각 매니페스트 항목 내에서 "platform" 필드를 찾아 아키텍처 및 운영 체제를 확인하십시오. linux/amd64linux/arm64 항목이 모두 표시되어야 합니다.

이 검사를 통해 매니페스트 목록에 빌드한 서로 다른 아키텍처에 대한 이미지가 올바르게 포함되어 있는지 확인할 수 있습니다.

매니페스트 목록을 레지스트리에 푸시

이 단계에서는 생성한 매니페스트 목록을 레지스트리에 푸시합니다. 매니페스트 목록을 푸시하면 다른 사용자가 멀티 아키텍처 이미지를 풀 수 있게 됩니다. 누군가 매니페스트 목록 태그를 사용하여 이미지를 풀면 Docker 는 해당 시스템의 아키텍처에 맞는 이미지를 자동으로 다운로드합니다.

docker manifest push 명령을 사용하여 매니페스트 목록을 푸시합니다.

localhost:5000/multiarch-demo:latest 매니페스트 목록을 레지스트리에 푸시합니다.

docker manifest push localhost:5000/multiarch-demo:latest

이 명령은 매니페스트 목록과 목록이 참조하는 모든 이미지를 지정된 레지스트리 (localhost:5000) 로 푸시합니다. 첫 번째 단계에서 docker buildx build --push를 사용하여 개별 이미지를 이미 푸시했으므로, 이 명령은 주로 매니페스트 목록 자체를 푸시합니다.

출력에는 매니페스트 목록에 대한 푸시 진행률이 표시됩니다.

매니페스트 목록을 푸시한 후에는 레지스트리에서 사용할 수 있는지 확인할 수 있습니다. 이 랩 환경에서는 직접 쿼리할 수 있는 실행 중인 레지스트리가 없지만, docker manifest push 명령이 성공적으로 실행되면 매니페스트 목록이 푸시를 위해 준비되었음을 나타냅니다.

멀티 아키텍처 이미지를 풀링하고 Docker 가 올바른 아키텍처를 선택하는지 시뮬레이션하려면 다른 아키텍처의 시스템에서 이미지를 풀링해 볼 수 있습니다 (사용 가능한 경우). 그러나 이 랩 환경 내에서는 성공적인 푸시 명령과 이전 검사 단계를 통해 매니페스트 목록이 준비되었는지 확인할 수 있습니다.

요약

이 랩에서는 Docker 를 사용하여 멀티 아키텍처 이미지를 준비하는 방법을 배웠습니다. 여기에는 amd64arm64와 같은 다양한 아키텍처와 호환되는 이미지를 빌드하는 데 필수적인 buildx 명령을 활용하기 위해 Docker 에서 실험적 기능을 활성화하는 것이 포함됩니다. 실험적 기능을 활성화하기 위해 config.json 파일을 수정하여 Docker 클라이언트를 구성했습니다. 그 후, 멀티 아키텍처 빌드를 관리할 수 있는 docker buildx create --name mybuilder --use를 사용하여 mybuilder라는 새 빌더 인스턴스를 생성했습니다. 마지막으로, 기본 프로젝트 디렉토리를 설정하고 멀티 아키텍처 이미지 빌드의 기반으로 Alpine Linux 를 기반으로 하는 간단한 Dockerfile을 생성했습니다.