docker buildx imagetools create 명령을 사용하여 이미지 결합 및 태그 지정 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker buildx imagetools create 명령을 효과적으로 사용하여 Docker 이미지를 결합하고 태그하는 방법을 배우게 됩니다. 이 실습을 통해 여러 소스 이미지의 내용을 병합하여 새로운 이미지를 생성하는 과정을 안내받게 되며, 이는 복잡한 애플리케이션을 구축하는 데 흔히 사용되는 방법입니다.

그런 다음 새로 생성된 이미지에 태그를 지정하고, --dry-run 플래그를 사용하여 푸시하지 않고 최종 이미지 구조를 미리 보며, 더 나은 구성 및 메타데이터 관리를 위해 이미지 인덱스에 유용한 주석을 추가하는 방법을 살펴보겠습니다. 이 랩을 마치면 고급 이미지 조작 및 관리를 위해 docker buildx imagetools create를 활용하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

여러 소스 이미지에서 새 이미지 생성

이 단계에서는 여러 소스 이미지의 내용을 결합하여 새로운 Docker 이미지를 생성하는 방법을 배우겠습니다. 이는 서로 다른 기본 이미지 또는 사전 구축된 이미지의 구성 요소를 포함하는 이미지를 빌드해야 할 때 흔히 발생하는 시나리오입니다.

먼저, 필요한 소스 이미지를 가져오겠습니다. 예시로 ubuntualpine 이미지를 사용합니다.

docker pull ubuntu:latest
docker pull alpine:latest

이미지가 가져와지고 있음을 나타내는 출력을 볼 수 있습니다.

latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest

이제 Dockerfile을 사용하여 새 이미지를 생성합니다. Dockerfile은 사용자가 명령줄에서 이미지를 조립하기 위해 호출할 수 있는 모든 명령을 포함하는 텍스트 문서입니다. ~/project 디렉토리에 Dockerfile이라는 새 파일을 만듭니다.

nano ~/project/Dockerfile

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

FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base

COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release

WORKDIR /app

CMD ["ls", "-l"]

Dockerfile을 자세히 살펴보겠습니다.

  • FROM ubuntu:latest AS base: 이 줄은 빌드의 첫 번째 단계의 기본 이미지를 ubuntu:latest로 설정하고 이 단계를 base로 명명합니다.
  • FROM alpine:latest AS alpine_base: 이 줄은 alpine:latest를 기본 이미지로 사용하여 새 빌드 단계를 시작하고 이 단계를 alpine_base로 명명합니다. 이는 여러 단계의 빌드이며, 단계 간에 파일을 복사할 수 있습니다.
  • COPY --from=alpine_base /etc/alpine-release /app/alpine-release: 이 명령은 alpine_base 단계에서 현재 단계의 /app/alpine-release 디렉토리로 /etc/alpine-release 파일을 복사합니다.
  • COPY --from=base /etc/os-release /app/ubuntu-release: 이 명령은 base 단계에서 현재 단계의 /app/ubuntu-release 디렉토리로 /etc/os-release 파일을 복사합니다.
  • WORKDIR /app: 이는 후속 지침의 작업 디렉토리를 /app으로 설정합니다.
  • CMD ["ls", "-l"]: 이는 이 이미지에서 컨테이너가 시작될 때 실행할 기본 명령을 지정합니다. /app 디렉토리의 내용을 나열합니다.

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

이제 docker build 명령을 사용하여 이미지를 빌드합니다. 명령 끝의 .은 빌드 컨텍스트 (현재 디렉토리, ~/project) 를 지정합니다.

docker build -t my-multi-stage-image:latest ~/project

다양한 단계가 실행되는 것을 포함하여 빌드 프로세스를 나타내는 출력을 볼 수 있습니다.

[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest

빌드가 완료되면 로컬 이미지를 나열하여 이미지가 생성되었는지 확인할 수 있습니다.

docker images my-multi-stage-image

새로 생성된 이미지가 목록에 표시됩니다.

REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
my-multi-stage-image   latest    <image_id>     About a minute ago   ...MB

마지막으로, 이 이미지에서 컨테이너를 실행하여 복사된 파일을 확인해 보겠습니다.

docker run --rm my-multi-stage-image:latest

--rm 플래그는 종료 시 컨테이너를 자동으로 제거합니다. 출력은 ubuntualpine 이미지에서 복사된 파일을 표시해야 합니다.

total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release

이는 다단계 빌드를 사용하여 여러 소스 이미지의 내용을 결합하여 이미지를 성공적으로 생성했음을 확인합니다.

새로 생성된 이미지에 태그 지정

이 단계에서는 이전 단계에서 생성한 Docker 이미지에 추가 태그를 추가하는 방법을 배우겠습니다. 이미지에 태그를 지정하는 것은 버전 관리, 서로 다른 빌드 식별 또는 이미지를 특정 저장소와 연결하는 데 유용합니다.

이전 단계에서는 이미지를 빌드하고 자동으로 my-multi-stage-image:latest로 태그를 지정했습니다. 이제 이 이미지에 다른 태그, 예를 들어 my-multi-stage-image:v1.0을 추가해 보겠습니다.

docker tag 명령은 SOURCE_IMAGE 를 참조하는 태그 TARGET_IMAGE 를 생성하는 데 사용됩니다. 구문은 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]입니다.

먼저, 기존 이미지를 나열하여 my-multi-stage-image:latest의 이미지 ID 를 확인해 보겠습니다.

docker images my-multi-stage-image

다음과 유사한 출력을 볼 수 있으며, 여기서 <image_id>는 이미지의 고유 식별자입니다.

REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
my-multi-stage-image   latest    <image_id>     ...             ...MB

이제 docker tag 명령을 사용하여 이 이미지에 v1.0 태그를 추가합니다. 이미지 이름과 태그 (my-multi-stage-image:latest) 또는 이미지 ID(<image_id>) 를 소스로 사용할 수 있습니다. 일반적으로 이름과 태그를 사용하는 것이 더 쉽습니다.

docker tag my-multi-stage-image:latest my-multi-stage-image:v1.0

이 명령은 my-multi-stage-image:latest와 동일한 이미지 ID 를 가리키는 새 태그 v1.0을 생성합니다. 명령이 성공하면 출력이 없습니다.

새 태그가 추가되었는지 확인하려면 이미지를 다시 나열합니다.

docker images my-multi-stage-image

이제 동일한 이미지 ID 와 관련된 두 태그를 모두 볼 수 있습니다.

REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
my-multi-stage-image   latest    <image_id>     ...             ...MB
my-multi-stage-image   v1.0      <image_id>     ...             ...MB

Docker 이미지에 새 태그를 성공적으로 추가했습니다. 이를 통해 다른 이름 또는 버전을 사용하여 동일한 이미지를 참조할 수 있습니다.

--dry-run 옵션을 사용하여 푸시 없이 최종 이미지 확인

이 단계에서는 실제로 푸시 작업을 수행하지 않고 레지스트리에 푸시될 최종 이미지의 세부 정보를 보는 방법을 살펴보겠습니다. 이는 이미지를 공유하기 전에 이미지 매니페스트와 구성을 검사하는 데 유용합니다.

docker manifest 명령을 사용하면 이미지 매니페스트를 검사하고 관리할 수 있습니다. 이미지 매니페스트는 이미지, 레이어, 구성 및 매니페스트 목록의 다른 플랫폼별 이미지에 대한 잠재적 참조를 포함하여 이미지를 설명하는 JSON 문서입니다.

푸시하지 않고 my-multi-stage-image:latest 이미지의 매니페스트를 표시하려면 --dry-run 플래그와 함께 docker manifest inspect 명령을 사용할 수 있습니다.

docker manifest inspect --dry-run my-multi-stage-image:latest

이 명령은 이미지 매니페스트를 JSON 형식으로 터미널에 출력합니다. --dry-run 플래그는 명령이 레지스트리에 연결하거나 데이터를 푸시하려는 시도를 방지합니다.

출력은 이미지를 설명하는 자세한 JSON 구조가 됩니다. 이미지의 구성, 이미지의 레이어 (다이제스트로 표시됨) 및 기타 메타데이터와 같은 정보가 포함됩니다.

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
   "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": ...,
      "digest": "sha256:..."
   },
   "layers": [
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ...,
         "digest": "sha256:..."
      },
      ...
   ]
}

이 출력을 검사하여 레지스트리에 표시될 이미지의 구조와 내용을 이해할 수 있습니다. 이는 특히 디버깅 또는 이미지의 구성을 확인하는 데 유용합니다.

JSON 출력의 정확한 내용은 이미지의 레이어 및 구성에 따라 달라집니다.

생성된 이미지 인덱스에 어노테이션 추가

이 단계에서는 이미지 인덱스 (매니페스트 목록이라고도 함) 에 주석을 추가하는 방법을 배우겠습니다. 이미지 인덱스는 일반적으로 서로 다른 아키텍처 또는 운영 체제에 대해 여러 이미지 매니페스트를 참조하는 데 사용됩니다. 인덱스에 주석을 추가하면 전체 이미지 세트에 대한 메타데이터가 제공됩니다.

현재 my-multi-stage-image는 단일 아키텍처 이미지이지만, 이 경우 간단한 인덱스 역할을 하는 매니페스트에 주석을 추가하는 개념을 여전히 시연할 수 있습니다.

docker manifest annotate 명령은 매니페스트 목록 내에서 특정 이미지에 대한 주석을 추가하거나 업데이트하는 데 사용됩니다. 구문은 docker manifest annotate MANIFEST_LIST IMAGE --annotation KEY=VALUE입니다.

먼저, 이미지에 대한 매니페스트 목록을 생성해 보겠습니다. 이미지가 하나만 있으므로 매니페스트 목록은 단순히 기존 이미지를 참조합니다. docker manifest create 명령을 사용합니다.

docker manifest create my-multi-stage-image:annotated my-multi-stage-image:latest

이 명령은 my-multi-stage-image:latest에 대한 참조를 포함하는 my-multi-stage-image:annotated라는 새 매니페스트 목록을 생성합니다. 성공하면 출력이 없습니다.

이제 docker manifest annotate 명령을 사용하여 my-multi-stage-image:annotated 매니페스트 목록 내에서 my-multi-stage-image:latest에 대한 항목에 주석을 추가할 수 있습니다. 운영 체제를 나타내는 주석을 추가해 보겠습니다.

docker manifest annotate my-multi-stage-image:annotated my-multi-stage-image:latest --annotation "os=linux"

이 명령은 my-multi-stage-image:annotated 목록 내에서 my-multi-stage-image:latest에 대한 매니페스트 항목에 주석 os=linux를 추가합니다. 다시, 성공 시 출력은 없습니다.

주석이 추가되었는지 확인하려면 docker manifest inspect를 사용하여 매니페스트 목록을 검사할 수 있습니다.

docker manifest inspect my-multi-stage-image:annotated

출력은 매니페스트 목록을 나타내는 JSON 구조가 됩니다. my-multi-stage-image:latest에 대한 항목 내에서 추가한 주석을 볼 수 있습니다. "manifests" 배열 내에서 "annotations" 필드를 찾으십시오.

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": ...,
         "digest": "sha256:...",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         },
         "annotations": {
            "os": "linux"
         }
      }
   ]
}

이미지 인덱스에 주석을 성공적으로 추가했습니다. 주석은 레지스트리 및 클라이언트가 처리하는 이미지에 대해 더 자세히 이해하는 데 사용할 수 있는 귀중한 메타데이터를 제공합니다.

요약

이 랩에서는 docker buildx imagetools create 명령을 사용하여 이미지를 결합하고 태그하는 방법을 배웠습니다. 먼저, 멀티 스테이지 Dockerfile 을 사용하여 여러 소스 이미지에서 새 이미지를 생성하여 서로 다른 기본 이미지 간에 파일을 복사하는 방법을 시연했습니다.

이미지 생성 후, 새로 생성된 이미지에 태그를 지정하는 방법을 살펴보고 --dry-run 플래그를 사용하여 푸시하지 않고 최종 이미지를 미리 보았습니다. 마지막으로, 생성된 이미지 인덱스에 주석을 추가하여 결합된 이미지에 대한 추가 메타데이터를 제공하는 방법을 배웠습니다.