docker manifest push 명령을 사용하여 매니페스트 목록 푸시하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker manifest push 명령을 효과적으로 사용하여 멀티 아키텍처 이미지를 관리하는 방법을 배우게 됩니다. 먼저, 서로 다른 아키텍처와 운영 체제용으로 빌드된 이미지를 단일 이미지 이름으로 참조할 수 있게 해주는 매니페스트 목록 (manifest list) 을 생성하는 것으로 시작합니다.

매니페스트 목록을 생성한 후, 표준 레지스트리에 푸시하는 연습을 하고, 보안되지 않은 레지스트리에 푸시하는 방법도 살펴볼 것입니다. 마지막으로, Docker 이미지의 효율적인 관리를 위해 로컬 매니페스트 목록을 푸시한 다음 제거하는 방법을 배우게 됩니다.

매니페스트 목록 생성

이 단계에서는 docker manifest create 명령을 사용하여 매니페스트 목록 (manifest list) 을 생성하는 방법을 배우겠습니다. 매니페스트 목록은 이미지 매니페스트의 목록으로, 단일 이름을 사용하여 서로 다른 아키텍처와 운영 체제용 이미지를 참조할 수 있게 해줍니다. 이는 멀티 아키텍처 이미지를 빌드하는 데 특히 유용합니다.

먼저, 매니페스트 목록을 생성하는 데 사용할 두 개의 서로 다른 이미지를 가져와 보겠습니다. amd64arm64 아키텍처에 대해 alpine 이미지를 사용합니다.

docker pull alpine:latest
docker pull arm64v8/alpine:latest

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

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

이제 방금 가져온 두 이미지를 포함하는 my-alpine:latest라는 매니페스트 목록을 생성합니다. 구문은 docker manifest create MANIFEST_LIST IMAGE [IMAGE...]입니다.

docker manifest create my-alpine:latest alpine:latest arm64v8/alpine:latest

명령이 성공하면 아무런 출력이 표시되지 않습니다. 이 명령은 로컬 매니페스트 목록을 생성합니다. 매니페스트 목록 정보를 보려면 docker manifest inspect 명령을 사용할 수 있습니다.

docker manifest inspect my-alpine:latest

amd64arm64 아키텍처에 대한 매니페스트를 포함하여 매니페스트 목록의 세부 정보를 보여주는 다음과 유사한 출력을 볼 수 있습니다.

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

이는 my-alpine:latest 매니페스트 목록이 성공적으로 생성되었으며 지정된 이미지를 포함하고 있음을 확인합니다.

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

이 단계에서는 이전 단계에서 생성한 매니페스트 목록을 Docker 레지스트리에 푸시합니다. 기본적으로 docker push는 개별 이미지를 푸시합니다. 매니페스트 목록을 푸시하려면 docker manifest push 명령을 사용해야 합니다.

푸시하기 전에 푸시할 레지스트리가 필요합니다. 이 랩에서는 Docker Hub 를 사용합니다. Docker Hub 계정이 없는 경우 무료로 계정을 만들 수 있습니다. 터미널에서 Docker Hub 에 로그인해야 합니다.

docker login

Docker Hub 사용자 이름과 비밀번호를 입력하라는 메시지가 표시됩니다. 자격 증명을 입력하여 로그인합니다.

Login with your Docker ID to push and pull images, scan them for vulnerabilities, sign and attest to them, and more.
Username: your_docker_username
Password: your_docker_password
Login Succeeded

이제 로그인했으므로 매니페스트 목록을 푸시할 수 있습니다. Docker Hub 에 푸시하기 위한 형식은 your_docker_username/manifest_list_name:tag입니다. Docker Hub 사용자 이름이 your_docker_username이라고 가정해 보겠습니다. your_docker_username을 실제 Docker Hub 사용자 이름으로 바꿉니다.

docker manifest push your_docker_username/my-alpine:latest

매니페스트 목록과 관련 이미지가 레지스트리에 푸시되고 있음을 나타내는 출력을 볼 수 있습니다.

Pushed manifest list your_docker_username/my-alpine:latest

푸시가 완료된 후 Docker Hub 웹사이트를 방문하거나 다른 아키텍처에서 이미지를 가져와서 매니페스트 목록이 Docker Hub 저장소에 있는지 확인할 수 있습니다.

보안되지 않은 레지스트리에 매니페스트 목록 푸시

이 단계에서는 보안되지 않은 레지스트리에 매니페스트 목록을 푸시하는 방법을 살펴보겠습니다. 보안되지 않은 레지스트리는 TLS/SSL 인증서를 사용하지 않는 레지스트리이며, 프로덕션 환경에서는 권장되지 않지만 테스트 또는 내부 네트워크에 유용할 수 있습니다.

기본적으로 Docker 는 레지스트리에 대한 보안 연결을 요구합니다. 보안되지 않은 레지스트리에 푸시하려면 해당 특정 레지스트리 주소에 대한 보안되지 않은 연결을 허용하도록 Docker 데몬을 구성해야 합니다.

이 랩에서는 TLS 없이 실행되는 로컬 레지스트리를 사용하여 보안되지 않은 레지스트리를 시뮬레이션합니다. 먼저, 로컬 레지스트리 컨테이너를 실행해 보겠습니다. 호스트의 포트 5000 을 컨테이너의 포트 5000 에 매핑합니다.

docker run -d -p 5000:5000 --name registry registry:2

컨테이너가 실행 중임을 나타내는 다음과 유사한 출력을 볼 수 있습니다.

Unable to find image 'registry:2' locally
2: Pulling from library/registry
...
Status: Downloaded newer image for registry:2
a1b2c3d4e5f6...

이제 localhost:5000에서 이 보안되지 않은 레지스트리를 신뢰하도록 Docker 데몬을 구성해야 합니다. 이렇게 하려면 Docker 데몬 구성 파일을 수정해야 합니다. 이 파일의 위치는 다를 수 있지만 대부분의 Linux 시스템에서는 /etc/docker/daemon.json입니다.

sudo nano를 사용하여 이 파일을 편집합니다.

sudo nano /etc/docker/daemon.json

파일이 없으면 만들 수 있습니다. insecure-registries 키를 추가하거나 수정하여 localhost:5000을 포함합니다. 파일 내용은 다음과 같아야 합니다.

{
  "insecure-registries": ["localhost:5000"]
}

파일을 저장하고 편집기를 종료합니다 (nano 에서 Ctrl+X, Y, Enter).

구성을 수정한 후 변경 사항을 적용하려면 Docker 데몬을 다시 시작해야 합니다.

sudo systemctl restart docker

이제 보안되지 않은 레지스트리 주소로 매니페스트 목록에 태그를 지정하고 푸시할 수 있습니다. 첫 번째 단계에서 생성한 my-alpine:latest 매니페스트 목록을 사용합니다.

docker manifest create localhost:5000/my-alpine:latest alpine:latest arm64v8/alpine:latest
docker manifest push localhost:5000/my-alpine:latest

레지스트리가 보안되지 않더라도 푸시가 성공했음을 나타내는 출력을 볼 수 있습니다.

Pushed manifest list localhost:5000/my-alpine:latest

이는 Docker 데몬을 구성한 후 보안되지 않은 레지스트리에 매니페스트 목록을 푸시하는 방법을 보여줍니다.

로컬 매니페스트 목록 푸시 및 제거

이 단계에서는 매니페스트 목록을 푸시하고 성공적인 푸시 후 로컬 복사본을 자동으로 제거하는 방법을 배웁니다. 이는 다중 아키텍처 이미지를 푸시한 후 로컬 환경을 정리하는 데 유용할 수 있습니다.

docker manifest push 명령에는 레지스트리에 성공적으로 푸시된 후 로컬 매니페스트 목록을 제거하는 --purge 플래그가 있습니다.

먼저, my-alpine:latest 매니페스트 목록이 로컬에 있는지 확인해 보겠습니다. 이는 첫 번째 단계에서 생성했습니다. 존재 여부를 확인하기 위해 검사할 수 있습니다.

docker manifest inspect my-alpine:latest

이전과 같이 매니페스트 목록 세부 정보를 볼 수 있습니다.

이제 이 매니페스트 목록을 Docker Hub 에 다시 푸시하지만 이번에는 --purge 플래그를 사용합니다. your_docker_username을 실제 Docker Hub 사용자 이름으로 바꾸는 것을 잊지 마십시오.

docker manifest push --purge your_docker_username/my-alpine:latest

푸시가 진행 중임을 나타내는 출력과 매니페스트 목록이 제거되었음을 확인하는 메시지를 볼 수 있습니다.

Pushed manifest list your_docker_username/my-alpine:latest
Purged manifest list your_docker_username/my-alpine:latest

명령이 완료된 후 로컬 매니페스트 목록 my-alpine:latest는 더 이상 존재하지 않아야 합니다. 다시 검사해 보려고 시도하여 이를 확인할 수 있습니다.

docker manifest inspect my-alpine:latest

이번에는 매니페스트 목록을 찾을 수 없다는 오류 메시지가 표시됩니다.

no such manifest: my-alpine:latest

이는 --purge 플래그가 레지스트리에 푸시한 후 로컬 매니페스트 목록을 성공적으로 제거했음을 확인합니다.

마지막으로, 이전 단계에서 시작한 로컬 보안되지 않은 레지스트리 컨테이너를 정리해 보겠습니다.

docker stop registry
docker rm registry

컨테이너가 중지되고 제거되었음을 확인하는 출력을 볼 수 있습니다.

registry
registry

요약

이 랩에서는 docker manifest 명령을 사용하여 다중 아키텍처 이미지를 관리하는 방법을 배웠습니다. 먼저 alpine 이미지의 서로 다른 두 아키텍처 버전을 가져오는 것으로 시작했습니다. 그런 다음, docker manifest create를 사용하여 이러한 이미지를 단일 매니페스트 목록으로 결합하여 단일 이름으로 참조할 수 있도록 했습니다. docker manifest inspect를 사용하여 매니페스트 목록의 생성을 확인했습니다.

이어서, docker manifest push를 사용하여 이 매니페스트 목록을 Docker 레지스트리에 푸시하는 방법을 살펴보았습니다. 또한 --insecure 플래그를 추가하여 보안되지 않은 레지스트리에 푸시하는 특정 경우도 다루었습니다. 마지막으로, docker manifest push 명령과 함께 --purge 플래그를 사용하여 매니페스트 목록을 푸시하고 동시에 로컬 복사본을 제거하는 방법을 배웠습니다.