docker manifest

docker manifest

Docker 이미지 매니페스트(manifest)와 매니페스트 목록(manifest list)을 관리하는 명령이에요. 이미지가 어떤 운영체제·아키텍처용으로 빌드됐는지 확인하고, 멀티 아키텍처 이미지를 다룰 때 사용해요.

출처: 문서

본문

⚠️ 이 명령은 실험적(Experimental)이에요.

실험적 기능은 테스트와 피드백을 위한 것이며, 기능이나 설계가 릴리스 사이에 경고 없이 바뀌거나 향후 릴리스에서 완전히 제거될 수 있어요.

docker manifest 명령은 그 자체로는 아무 동작도 하지 않아요. 매니페스트 또는 매니페스트 목록을 다루려면 하위 명령 중 하나를 사용해야 해요.

단일 매니페스트는 레이어, 크기, 다이제스트 같은 이미지에 대한 정보예요. docker manifest 명령은 이미지가 빌드된 OS와 아키텍처 같은 추가 정보도 제공해요.

매니페스트 목록은 하나 이상(이상적으로는 둘 이상)의 이미지 이름을 지정해 만든 이미지 레이어 목록이에요. 그런 다음 docker pulldocker run 명령에서 이미지 이름과 같은 방식으로 사용할 수 있어요.

이상적으로 매니페스트 목록은 기능이 동일하지만 os/arch 조합이 다른 이미지들로 만들어져요. 이런 이유로 매니페스트 목록은 종종 "멀티 아키텍처 이미지"로 불려요. 하지만 AMD64용 Windows와 AMD64용 Darwin 같은 두 이미지를 가리키는 매니페스트 목록을 만들 수도 있어요.

docker manifest COMMAND

사용할 수 있는 하위 명령은 다음과 같아요.

명령 설명
docker manifest annotate 로컬 이미지 매니페스트에 추가 정보 추가
docker manifest create 레지스트리에 어노테이션·푸시할 로컬 매니페스트 목록 생성
docker manifest inspect 이미지 매니페스트 또는 매니페스트 목록 표시
docker manifest push 매니페스트 목록을 저장소로 푸시
docker manifest rm 로컬 저장소에서 하나 이상의 매니페스트 목록 삭제

각 하위 명령의 도움말을 보면 사용법을 확인할 수 있어요.

$ docker manifest inspect --help

Usage:  docker manifest inspect [OPTIONS] [MANIFEST_LIST] MANIFEST

Display an image manifest, or manifest list

Options:
      --help       Print usage
      --insecure   Allow communication with an insecure registry
  -v, --verbose    Output additional info including layers and platform

안전하지 않은(insecure) 레지스트리 사용

manifest 명령은 레지스트리와만 상호작용해요. 따라서 허용된 안전하지 않은 레지스트리 목록을 엔진에 물어볼 방법이 없어요. CLI가 안전하지 않은 레지스트리와 상호작용할 수 있게 하려면 일부 docker manifest 명령에 --insecure 플래그가 있어요. 레지스트리를 쿼리하는 create 같은 각 트랜잭션에 --insecure 플래그를 지정해야 해요. 이 플래그는 레지스트리 호출이 누락되거나 자체 서명된 인증서 같은 보안 문제를 무시해도 된다는 것을 CLI에 알려줘요. 마찬가지로 안전하지 않은 레지스트리에 manifest push할 때도 --insecure 플래그를 지정해야 해요. 안전하지 않은 레지스트리에서 이 플래그를 사용하지 않으면 manifest 명령은 기본 요구 사항을 충족하는 레지스트리를 찾지 못해 실패해요.

이미지의 매니페스트 객체 조사

$ docker manifest inspect hello-world
{
        "schemaVersion": 2,
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "config": {
                "mediaType": "application/vnd.docker.container.image.v1+json",
                "size": 1520,
                "digest": "sha256:1815c82652c03bfd8644afda26fb184f2ed891d921b20a0703b46768f9755c57"
        },
        "layers": [
                {
                        "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
                        "size": 972,
                        "digest": "sha256:b04784fba78d739b526e27edc02a5a8cd07b1052e9283f5fc155828f4b614c28"
                }
        ]
}

이미지 매니페스트 조사 및 os/arch 정보 얻기

docker manifest inspect 명령은 선택적 --verbose 플래그를 받는데, 이미지 이름(Ref)과 아키텍처·OS(Platform)를 알려줘요.

이미지 이름을 받는 다른 Docker 명령과 마찬가지로 태그 포함 여부와 무관하게 이미지를 참조하거나, 다이제스트로 참조할 수 있어요 (예: hello-world@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f).

--verbose 플래그로 이미지의 매니페스트를 조사하는 예시예요.

$ docker manifest inspect --verbose hello-world
{
        "Ref": "docker.io/library/hello-world:latest",
        "Digest": "sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f",
        "SchemaV2Manifest": {
                "schemaVersion": 2,
                "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
                ...
        },
        "Platform": {
                "architecture": "amd64",
                "os": "linux"
        }
}

매니페스트 목록 생성 및 푸시

매니페스트 목록을 만들려면 먼저 매니페스트 목록에 포함하려는 구성 이미지를 지정해 로컬에서 create해요. 이것은 레지스트리에 푸시되므로, docker 레지스트리가 아닌 다른 레지스트리로 푸시하려면 레지스트리 이름 또는 IP와 포트로 매니페스트 목록을 만들어야 한다는 점을 기억해요. 이는 이미지에 태그를 붙여 외부 레지스트리로 푸시하는 것과 비슷해요.

로컬 매니페스트 목록을 만든 뒤에는 선택적으로 annotate할 수 있어요. 허용되는 어노테이션은 아키텍처와 운영체제(이미지의 현재 값을 덮어씀), os 기능, 아키텍처 변형이에요.

마지막으로 원하는 레지스트리에 매니페스트 목록을 push해야 해요. 아래에 이 세 명령에 대한 설명과 함께 모두 합친 예제가 있어요.

$ docker manifest create 45.55.81.106:5000/coolapp:v1 \
    45.55.81.106:5000/coolapp-ppc64le-linux:v1 \
    45.55.81.106:5000/coolapp-arm-linux:v1 \
    45.55.81.106:5000/coolapp-amd64-linux:v1 \
    45.55.81.106:5000/coolapp-amd64-windows:v1

Created manifest list 45.55.81.106:5000/coolapp:v1
$ docker manifest annotate 45.55.81.106:5000/coolapp:v1 45.55.81.106:5000/coolapp-arm-linux --arch arm
$ docker manifest push 45.55.81.106:5000/coolapp:v1
Pushed manifest 45.55.81.106:5000/coolapp@sha256:9701edc932223a66e49dd6c894a11db8c2cf4eccd1414f1ec105a623bf16b426 with digest: sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f with digest: sha256:b64ca0b60356a30971f098c92200b1271257f100a55b351e6bbe985638352f3a
Pushed manifest 45.55.81.106:5000/coolapp@sha256:39dc41c658cf25f33681a41310372f02728925a54aac3598310bfb1770615fc9 with digest: sha256:df436846483aff62bad830b730a0d3b77731bcf98ba5e470a8bbb8e9e346e4e8
Pushed manifest 45.55.81.106:5000/coolapp@sha256:f91b1145cd4ac800b28122313ae9e88ac340bb3f1e3a4cd3e59a3648650f3275 with digest: sha256:5bb8e50aa2edd408bdf3ddf61efb7338ff34a07b762992c9432f1c02fc0e5e62
sha256:050b213d49d7673ba35014f21454c573dcbec75254a08f4a7c34f66a47c06aba

매니페스트 목록 조사

$ docker manifest inspect coolapp:v1
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 424,
         "digest": "sha256:f67dcc5fc786f04f0743abfe0ee5dae9bd8caf8efa6c8144f7f2a43889dc513b",
         "platform": {
            "architecture": "arm",
            "os": "linux"
         }
      },
      ...
   ]
}

안전하지 않은 레지스트리로 푸시

알려진 안전하지 않은 레지스트리를 사용해 매니페스트 목록을 생성·푸시하는 예시예요.

$ docker manifest create --insecure myprivateregistry.mycompany.com/repo/image:1.0 \
    myprivateregistry.mycompany.com/repo/image-linux-ppc64le:1.0 \
    myprivateregistry.mycompany.com/repo/image-linux-s390x:1.0 \
    myprivateregistry.mycompany.com/repo/image-linux-arm:1.0 \
    myprivateregistry.mycompany.com/repo/image-linux-armhf:1.0 \
    myprivateregistry.mycompany.com/repo/image-windows-amd64:1.0 \
    myprivateregistry.mycompany.com/repo/image-linux-amd64:1.0

$ docker manifest push --insecure myprivateregistry.mycompany.com/repo/image:tag

Note

어노테이션은 로컬에 저장된 매니페스트 목록 사본에 적용되므로 매니페스트 목록을 annotate할 때는 --insecure 플래그가 필요하지 않아요. 로컬에 저장된 매니페스트 목록에 docker manifest inspect를 수행할 때도 --insecure 플래그를 건너뛸 수 있어요. 로컬에 저장된 매니페스트 목록은 docker pull에서 엔진이 절대 사용하지 않는다는 점을 기억해요.

더 알아보기