숏컷 코드
# 이미지와 태그를 tar archive로 저장
docker image save -o my-app.tar myorg/my-app:1.2.3
# gzip 압축과 함께 저장
docker image save myorg/my-app:1.2.3 | gzip > my-app.tar.gz
# 다른 머신에서 이미지 복원
docker image load -i my-app.tar
gunzip -c my-app.tar.gz | docker image load
# 복원 확인
docker image ls myorg/my-app
docker run --rm myorg/my-app:1.2.3 --version| 목적 | 적합한 명령 |
|---|---|
| 이미지 레이어와 태그 보존 | docker image save |
| 저장한 이미지 다시 등록 | docker image load |
| 컨테이너 파일시스템만 내보내기 | docker export |
| 파일시스템 tar를 새 이미지로 만들기 | docker import |
| 운영 배포 기준 보존 | 레지스트리 push 또는 digest 기록 |
이미지 이동
save/load는 이미지 단위 이동이다
docker image save는 이미지의 레이어, 설정, 태그 정보를 tar archive로 묶습니다. 인터넷이 막힌 환경, 폐쇄망 전달, 레지스트리 접근이 어려운 임시 검증 환경에서 이미지를 파일로 넘길 때 사용할 수 있습니다. 반대편에서는 docker image load로 로컬 image store에 다시 등록합니다.
docker image save -o api-1.2.3.tar registry.example.com/api:1.2.3
scp api-1.2.3.tar deploy@server:/tmp/
ssh deploy@server "docker image load -i /tmp/api-1.2.3.tar"여러 태그를 한 archive에 담을 수도 있습니다. 같은 이미지에 1.2.3과 stable 태그를 모두 붙여 전달해야 한다면 둘 다 save 대상에 포함합니다.
docker image save -o api.tar \
registry.example.com/api:1.2.3 \
registry.example.com/api:stableexport/import는 컨테이너 파일시스템을 다룬다
docker export는 실행 중이거나 중지된 컨테이너의 파일시스템을 tar로 내보냅니다. 이미지의 레이어 히스토리, 태그, Dockerfile 단계, 기본 CMD 같은 이미지 설정을 보존하는 흐름이 아닙니다. docker import로 다시 이미지처럼 만들 수는 있지만, 정상적인 이미지 배포보다는 디버깅이나 파일시스템 스냅샷에 가깝습니다.
docker export old-container > rootfs.tar
docker import rootfs.tar my-debug-image:flat이미지를 다른 머신에 그대로 옮기는 목적이면 save/load가 맞습니다. 컨테이너 내부에서 수동으로 바꾼 파일 상태를 납작한 root filesystem으로 뽑아야 하는 특수 상황에서만 export/import를 검토합니다.
archive는 registry를 대체하기보다 보조 수단에 가깝다
이미지를 반복적으로 배포한다면 private registry가 더 추적하기 쉽습니다. 레지스트리는 push/pull 이력, 태그 정책, digest, 접근 권한을 관리할 수 있습니다. tar archive는 파일 전달이 단순하다는 장점이 있지만, 누가 어떤 digest의 이미지를 전달했는지 기록하지 않으면 재현성이 떨어집니다.
# archive 생성 전 digest 확인
docker image inspect myorg/my-app:1.2.3 --format '{{index .RepoDigests 0}}'
# load 후 같은 이미지인지 확인
docker image inspect myorg/my-app:1.2.3 --format '{{.Id}}'선택 기준
| 상황 | 선택 |
|---|---|
| 폐쇄망에 이미지를 한 번 전달 | docker image save + docker image load |
| 여러 서버에 반복 배포 | private registry 사용 |
| 레이어와 태그를 유지해야 함 | save/load |
| 컨테이너 내부 파일만 스냅샷으로 추출 | export/import |
| 배포 재현성을 검증해야 함 | digest 또는 image ID 기록 |
| archive 용량이 큼 | gzip, zstd 같은 압축 적용 |
이미지 archive를 만들 때는 태그 이름만 남기지 말고 archive 파일명, 원본 이미지 태그, digest 또는 image ID를 함께 기록하는 편이 안전합니다. 파일명이 latest.tar처럼 모호하면 나중에 어떤 내용인지 확인하기 어렵습니다.
주의할 점
docker export는 이미지 배포용 백업이 아닙니다. 레이어와 이미지 설정이 보존되지 않으므로,
정상적인 이미지 이동에는 docker image save와 docker image load를 사용하십시오.
실패 예시
- 운영 이미지를 export/import로 전달함
- ENTRYPOINT, CMD, ENV 같은 실행 설정이 기대와 다르게 사라짐
- 태그와 레이어 히스토리도 유지되지 않아 원본 이미지 추적이 어려워짐
대응
- 배포 이미지는 save/load 또는 registry push/pull로 전달
- 전달 전후 image ID, tag, digest를 기록
- 컨테이너 데이터는 image archive가 아니라 volume backup으로 별도 관리컨테이너의 writable layer에 쌓인 런타임 데이터와 volume 데이터는 이미지 archive로 해결할 문제가 아닙니다. DB 데이터, 업로드 파일, 캐시처럼 컨테이너 수명과 분리해야 하는 데이터는 volume 백업 흐름으로 관리해야 합니다.
참고 링크
2 sources