docker image save 명령으로 이미지 내보내는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker save 명령을 사용하여 Docker 이미지를 tar 아카이브 파일로 내보내는 방법을 배우게 됩니다. 이는 이미지를 백업하고, 레지스트리 없이 시스템 간에 이미지를 전송하거나, 배포를 위해 여러 이미지를 번들로 묶는 데 필수적인 기술입니다.

단일 이미지 저장, 여러 이미지를 하나의 아카이브로 저장, 이미지의 특정 플랫폼 변형 저장, 그리고 gzip 을 사용하여 저장된 이미지 아카이브 압축을 탐구할 것입니다. 이 랩을 마치면 다양한 이미지 관리 작업에 docker save를 능숙하게 사용할 수 있게 될 것입니다.

단일 이미지를 tar 아카이브로 저장

이 단계에서는 단일 Docker 이미지를 tar 아카이브 파일로 저장하는 방법을 배우게 됩니다. 이는 이미지를 백업하거나 Docker 레지스트리에 직접 연결하지 않고 다른 시스템으로 전송하는 데 유용합니다.

먼저, 이 예제에 사용할 간단한 Docker 이미지를 가져와 보겠습니다. 작고 이 데모에 적합한 hello-world 이미지를 사용합니다.

docker pull hello-world

이미지가 풀링되고 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

이제 hello-world 이미지를 로컬로 가지고 있으므로 docker save 명령을 사용하여 tar 아카이브에 저장할 수 있습니다. 기본 구문은 docker save -o <output_file.tar> <image_name>입니다.

hello-world 이미지를 현재 디렉토리 (~/project) 에 있는 hello-world.tar라는 파일에 저장합니다.

docker save -o hello-world.tar hello-world

이 명령을 실행하면 ~/project 디렉토리에 hello-world.tar라는 파일이 생성됩니다. 이 파일에는 hello-world Docker 이미지가 포함되어 있습니다.

ls -lh 명령을 사용하여 파일이 생성되었는지 확인하고 크기를 확인할 수 있습니다.

ls -lh hello-world.tar

파일 크기를 보여주는 다음과 유사한 출력을 볼 수 있습니다.

-rw-r--r-- 1 labex labex ... hello-world.tar

이제 이 tar 파일을 다른 머신으로 전송하고 docker load 명령을 사용하여 로드할 수 있습니다.

여러 이미지를 tar 아카이브로 저장

이전 단계에서는 단일 Docker 이미지를 저장하는 방법을 배웠습니다. 이 단계에서는 여러 Docker 이미지를 단일 tar 아카이브 파일로 저장하는 방법을 배우게 됩니다. 이는 배포 또는 백업을 위해 여러 이미지를 함께 묶어야 할 때 편리합니다.

먼저, 저장할 이미지를 두 개 이상 갖기 위해 다른 Docker 이미지를 가져와 보겠습니다. 가벼운 Linux 배포판인 alpine 이미지를 가져오겠습니다.

docker pull alpine

alpine 이미지가 풀링되고 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다.

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

이제 hello-worldalpine 이미지를 모두 로컬로 가지고 있습니다. 로컬 이미지를 나열하여 이를 확인할 수 있습니다.

docker images

출력에는 hello-worldalpine이 모두 목록에 표시되어야 합니다.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    ...            ...            ...
alpine        latest    ...            ...            ...

여러 이미지를 단일 tar 아카이브에 저장하려면 docker save 명령에서 출력 파일 이름 뒤에 이미지 이름을 나열하기만 하면 됩니다. 구문은 docker save -o <output_file.tar> <image1_name> <image2_name> ...입니다.

hello-worldalpine 이미지를 모두 ~/project 디렉토리에 있는 images.tar라는 파일에 저장합니다.

docker save -o images.tar hello-world alpine

이 명령을 실행하면 ~/project 디렉토리에 images.tar라는 파일이 생성됩니다. 이 파일에는 hello-worldalpine Docker 이미지가 모두 포함되어 있습니다.

ls -lh 명령을 사용하여 파일이 생성되었는지 확인하고 크기를 확인할 수 있습니다. 크기는 두 개의 이미지를 포함하고 있기 때문에 이전 단계의 hello-world.tar 파일보다 큽니다.

ls -lh images.tar

다음과 유사한 출력을 볼 수 있습니다.

-rw-r--r-- 1 labex labex ... images.tar

아카이브에 두 이미지가 모두 포함되어 있는지 확인하려면 tar -tf 명령을 사용하여 tar 파일의 내용을 나열할 수 있습니다.

tar -tf images.tar

출력에는 매니페스트 및 레이어 데이터를 포함하여 두 이미지와 관련된 파일이 표시되어야 합니다. hello-world/alpine/과 같은 항목이 표시되어야 합니다.

...
hello-world/
hello-world/manifest.json
...
alpine/
alpine/manifest.json
...

이제 이 단일 tar 파일을 사용하여 docker load를 통해 다른 시스템에 두 이미지를 모두 로드할 수 있습니다.

이미지의 특정 플랫폼 변형 저장

이 단계에서는 Docker 이미지의 특정 플랫폼 변형을 저장하는 방법을 배우게 됩니다. Docker 이미지는 다양한 아키텍처 (예: amd64, arm64 등) 에 대해 빌드될 수 있습니다. 때로는 특정 플랫폼용으로 특별히 빌드된 이미지를 저장해야 할 수 있습니다.

기본적으로 docker pulldocker save는 현재 시스템의 아키텍처와 일치하는 이미지 변형에서 작동합니다. 그러나 --platform 플래그를 사용하여 다른 플랫폼을 지정할 수 있습니다.

다양한 플랫폼에 대한 변형이 있는 이미지를 가져와 보겠습니다. alpine 이미지가 좋은 예입니다. LabEx VM 이 amd64일 가능성이 높더라도 alpine 이미지의 arm64 변형을 명시적으로 가져오겠습니다.

docker pull --platform arm64 alpine

alpine 이미지의 arm64 변형이 풀링되고 있음을 나타내는 출력을 볼 수 있습니다.

arm64: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

이제 이 특정 arm64 변형의 alpine 이미지를 tar 아카이브에 저장해 보겠습니다. docker save 명령과 함께 다시 --platform 플래그를 사용합니다.

alpinearm64 변형을 ~/project 디렉토리에 있는 alpine_arm64.tar라는 파일에 저장합니다.

docker save --platform arm64 -o alpine_arm64.tar alpine

이 명령을 실행하면 ~/project 디렉토리에 alpine_arm64.tar라는 파일이 생성됩니다. 이 파일에는 alpine Docker 이미지의 arm64 변형이 포함되어 있습니다.

ls -lh 명령을 사용하여 파일이 생성되었는지 확인할 수 있습니다.

ls -lh alpine_arm64.tar

다음과 유사한 출력을 볼 수 있습니다.

-rw-r--r-- 1 labex labex ... alpine_arm64.tar

저장된 이미지가 실제로 arm64 변형인지 확인하려면 tar 파일의 내용을 검사할 수 있습니다. tar 내용에서 아키텍처를 직접 확인하는 것은 복잡하지만, 저장 작업 중에 --platform arm64를 사용했다는 사실은 저장된 이미지가 해당 플랫폼용임을 보장합니다.

이는 호스트의 아키텍처와 다른 플랫폼에 대한 이미지를 명시적으로 저장하는 방법을 보여줍니다.

이미지 저장 및 gzip 압축

이 마지막 단계에서는 Docker 이미지를 tar 아카이브에 저장하고 동시에 gzip 을 사용하여 압축하는 방법을 배우게 됩니다. 이는 저장된 이미지의 파일 크기를 줄여 저장 및 전송을 더 쉽게 만드는 일반적인 방법입니다.

docker save 명령 자체에는 내장된 압축 플래그가 없습니다. 그러나 docker save의 출력을 gzip과 같은 압축 유틸리티로 파이핑하여 압축을 수행할 수 있습니다.

이전 단계에서 가져왔어야 하는 alpine 이미지를 저장하고 gzip을 사용하여 압축합니다. 출력은 .tar.gz 확장자를 가진 파일로 리디렉션됩니다.

구문은 출력을 파이핑하는 방식으로, docker save <image_name> | gzip > <output_file.tar.gz>입니다.

alpine 이미지를 ~/project 디렉토리에 있는 alpine.tar.gz라는 gzipped tar 파일에 저장해 보겠습니다.

docker save alpine | gzip > alpine.tar.gz

이 명령은 alpine 이미지를 표준 출력에 저장하고, 해당 출력을 압축을 위해 gzip 명령으로 파이핑한 다음, 압축된 출력을 alpine.tar.gz 파일로 리디렉션합니다.

이 명령을 실행하면 ~/project 디렉토리에 alpine.tar.gz라는 파일이 생성됩니다.

ls -lh 명령을 사용하여 파일이 생성되었는지 확인하고 크기를 확인할 수 있습니다. 압축 효과를 확인하기 위해 압축되지 않은 alpine 이미지 크기 ( images.tar의 일부이거나 개별적으로 저장한 경우) 와 크기를 비교하십시오.

ls -lh alpine.tar.gz

다음과 유사한 출력을 볼 수 있습니다.

-rw-r--r-- 1 labex labex ... alpine.tar.gz

파일이 gzipped tar 아카이브인지 확인하려면 file 명령을 사용할 수 있습니다.

file alpine.tar.gz

출력은 gzip 압축 데이터 파일임을 나타내야 합니다.

alpine.tar.gz: gzip compressed data, ...

tar -tfz를 사용하여 압축된 아카이브의 내용을 나열할 수도 있습니다. z 플래그는 내용을 나열하기 전에 tar에게 gzip 을 사용하여 파일을 압축 해제하도록 지시합니다.

tar -tfz alpine.tar.gz

images.tar의 내용을 나열했을 때와 마찬가지로 아카이브 내에 alpine 이미지의 내용이 표시되어야 합니다.

...
alpine/
alpine/manifest.json
...

이 방법은 단일 명령으로 이미지를 저장하고 압축하는 데 효율적입니다.

요약

이 Lab 에서는 docker save 명령을 사용하여 Docker 이미지를 tar 아카이브로 내보내는 방법을 배웠습니다. 단일 이미지 (hello-world) 를 tar 파일에 성공적으로 저장하여 명령의 기본 사용법을 시연했습니다.

또한 이미지를 번들로 묶는 데 유용한 여러 이미지를 단일 아카이브에 저장하는 방법을 살펴보았습니다. 또한 이미지의 특정 플랫폼 변형을 저장하고 크기를 줄이기 위해 gzip 을 사용하여 출력 tar 파일을 압축하는 방법도 배웠습니다. 이러한 단계는 이미지 백업 및 전송을 위한 docker save의 기본적인 기능을 다루었습니다.