Intro

도커 컨테이너나 이미지를 파일로 추출해야 할 때가 있습니다. 예를 들어, 개발 환경에서 테스트를 마친 애플리케이션을 프로덕션 환경으로 이동시키거나, 특정 이미지를 백업하여 나중에 복원하고자 할 때, 또는 다른 팀원들과 동일한 환경을 공유하고자 할 때 등이 있을 수 있습니다. 도커는 이러한 상황에 컨테이너와 이미지를 손쉽게 파일로 추출하고 저장할 수 있게 해줍니다. 이번 포스에서는 도커 컨테이너 및 이미지를 파일로 추출하는 방법과 그 활용 방안에 대해 알아보겠습니다.

추출하기

도커 컨테이너 및 이미지를 파일로 추출하는 과정은 생각보다 간단합니다. docker exportdocker save 명령어를 통해 파일로 추출할 수 있는데요, 아래에서 이 두 가지 방법에 대해 자세히 살펴보겠습니다.

방법1 docker export - 컨테이너를 파일로 추출하기

먼저, 실행 중인 도커 컨테이너를 파일로 추출 하려면 docker export 명령어를 사용합니다. 이 명령어는 컨테이너의 파일 시스템을 tar 아카이브로 내보냅니다. 마운트된 디렉토리는 tar 파일에 저장되지 않습니다.

1
2
3
4
5
# 기본 사용법
docker container export [OPTIONS] CONTAINER

# Alias
docker export [OPTIONS CONTAINER]
옵션 설명
-o, –output 파일의 경로와 파일의 이름을 지정합니다.
1
2
3
4
5
# 예시 1
docker export red_panda > latest.tar

# 예시 2
docker export --output="latest.tar" red_panda

방법2 docker save - 도커 이미지를 파일로 추출하기

하나 이상의 도커 이미지를 tar 파일로 저장 하는 명령어입니다. 모든 레이어와 모든 메타데이터를 포함하여 파일로 저장됩니다.

1
2
3
4
5
# 기본 사용법
docker image save [OPTIONS] IMAGE [IMAGE...]

# Alias
docker save [OPTIONS] IMAGE [IMAGE...]
옵션 설명
-o, –output 파일의 경로와 파일의 이름을 지정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
# 예시
# (1) 
docker save busybox > busybox.tar
ls -sh busybox.tar
>> 2.7M busybox.tar
# (2) 
docker save --output busybox.tar busybox
ls -sh busybox.tar
>> 2.7M busybox.tar
# (3) 
docker save -o fedora-all.tar fedora
docker save -o fedora-latest.tar fedora:latest

복원하기

방법1 docker import

파일로 추출한 컨테이너는 docker import 명령어를 통해 도커 이미지로 복원할 수 있습니다.

1
2
3
4
5
# 기본 사용법
docker image import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

# Alias
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
옵션 설명
-c, –change 생성된 이미지에 Dockerfile 명령어를 추가합니다.
즉, 시작 CMD, 환경변수를 수정할 수 있습니다.
-m, –message 가져온 이미지에 대해 commit 메세지를 작성합니다.
-platform 서버가 다중 플랫폼 지원이 가능한 경우 플랫폼 설정
1
2
3
4
5
6
7
# 예시 1 : 로컬 파일에서 가져오기
docker import /path/to/exampleimage.tgz # 기본 import
docker import --message "New image" - exampleimagelocal:new # 메세지 추가

# 예시 2 : 원격 위치에서 가져오기
docker import https://example.com/exampleimage.tgz
cat exampleimage.tgz | docker import - exampleimagelocal:new

방법2 docker load - 도커 이미지 복원하기

tar 아카이브에서 도커 이미지나 저장소를 로드합니다.

1
2
3
4
5
# 기본 사용법
docker image load [OPTIONS]

# Alias
docker load [OPTIONS]
옵션 설명
-i, –input 복원할 이미지를 담은 tar 아카이브를 지정합니다.
-q, –quiet 출력을 하지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 예시 1

# (1) load 전 도커 이미지 확인
docker image ls
>> REPOSITORY   TAG   IMAGE ID   CREATED   SIZE

# (2) 도커 이미지를 load
docker load < busybox.tar.gz
>> Loaded image: busybox:latest

# (3) load 후 도커 이미지 확인
docker images
>> REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
>> busybox       latest    769b9341d937   7 weeks ago   2.489 MB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 예시 2

docker load --input fedora.tar
>> Loaded image: fedora:rawhide
>> Loaded image: fedora:20

docker images
>> REPOSITORY   TAG          IMAGE ID        CREATED         SIZE
>> busybox      latest       769b9341d937    7 weeks ago     2.489 MB
>> fedora       rawhide      0d20aec6529d    7 weeks ago     387 MB
>> fedora       20           58394af37342    7 weeks ago     385.5 MB
>> fedora       heisenbug    58394af37342    7 weeks ago     385.5 MB
>> fedora       latest       58394af37342    7 weeks ago     385.5 MB

save 와 export 의 차이점

구분 명령어 설명
추출 docker export 실행 중인 컨테이너의 파일 시스템을 파일로 추출.
컨테이너의 파일 시스템 스냅샷을 생성하며
컨테이너의 메타데이터나 history 포함하지 않음
복원 docker import docker export로 생성된 파일 시스템 스냅샷을 이미지로 load
컨테이너의 메타데이터나 역사(history)는 복원되지 않는다.
단순히 파일 시스템 상태만을 새로운 이미지로 생성
추출 docker save 도커 이미지를 파일로 추출하는 명령어
이미지의 모든 레이어와 메타데이터를 포함하여 tar 파일로 저장
이미지를 다른 시스템으로 전송하거나, 특정 버전을 보존할 때 사용
복원 docker load docker save로 생성된 이미지를 복원
이미지의 모든 레이어와 메타데이터를 포함하여 복원
주로 백업한 이미지를 복원, 다른 시스템으로 이미지 전송에 사용

save 명령어는 도커의 메타데이터를 저장하는데요, 아래 예시를 보면 쉽게 이해할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 도커 이미지 확인
docker images
>> REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
>> image        0.0.1     abcdefghijk    2 minutes ago   6.03GB

# 도커 이미지 저장
# 주의 : 이미지의 TAG는 0.0.1인데, 파일명은 0.0.2로 저장했음
docker save image:0.0.1 -o image:0.0.2.tar

# tar 파일 load
docker load -i image:0.0.2.tar

# 도커 이미지 확인
docker images
>> REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
>> image        0.0.1     abcdefghijk    2 minutes ago   6.03GB
>> <none>       <none>    abcdefghijk    20 minutes ago  6.03GB

tar 파일에 저장된 도커 이미지의 TAG는 0.0.1이기 때문에 파일명과 관계 없이 TAG가 0.0.1로 불러와집니다.

왜 tar 파일인가?

이미지를 tar 파일로 저장하는 이유는

(1) 유연하고 광범위하게 사용되는 아카이브 포맷이라는 점
(2) 압축으로 파일의 용량을 줄일 수 있다는 점
(3) 계층 구조를 보존한다는 점
(4) 생성과 추출이 간편하다는 점

에서 도커 이미지나 컨테이너를 파일로 저장할 때 적당한 파일 포맷입니다.

Reference

docker save : https://docs.docker.com/reference/cli/docker/image/save/
docker load : https://docs.docker.com/reference/cli/docker/image/load/
docker export : https://docs.docker.com/reference/cli/docker/container/export/
docker import : https://docs.docker.com/reference/cli/docker/image/import/
https://waspro.tistory.com/584
https://chatgpt.com/c/95e0f735-bf96-4810-b1d6-305bc7337094