Docker 이미지 백업과 복원 방법 정리: save, load, tar 파일로 이전하기

Docker 이미지 백업과 복원 방법을 docker save, docker load 명령어 중심으로 정리합니다. 운영 서버 이전, 폐쇄망 배포, 이미지 보관 시 사용하는 tar 백업 파일 생성과 복원 절차를 실무 예제로 설명합니다.

Docker 이미지 백업과 복원 방법 정리: save, load, tar 파일로 이전하기

Docker 이미지 백업/복원은 운영 서버 이전, 폐쇄망 배포, 이미지 보관, 장애 대응 환경 구축에서 자주 사용하는 작업입니다. 이 글에서는 docker save, docker load 명령어를 사용해 Docker 이미지를 tar 파일로 백업하고, 다른 서버에서 복원하는 방법을 실무 기준으로 정리합니다.

Docker 이미지 백업이 필요한 상황

Docker 이미지는 보통 Docker Hub, 사설 Registry, GitHub Container Registry 같은 저장소에서 pull 받아 사용합니다. 하지만 실무에서는 항상 Registry를 사용할 수 있는 것은 아닙니다.

예를 들어 다음과 같은 상황에서는 Docker 이미지 백업 파일이 필요합니다.

상황설명
서버 이전 기존 서버의 Docker 이미지를 새 서버로 옮겨야 하는 경우
폐쇄망 배포 인터넷이 안 되는 서버에 이미지를 배포해야 하는 경우
장애 대비 특정 버전의 이미지를 tar 파일로 보관해야 하는 경우
Registry 미사용 별도 Docker Registry 없이 이미지 파일만 전달해야 하는 경우
배포 이력 보관 운영에 사용한 이미지를 버전별로 보관해야 하는 경우

Docker 이미지는 컨테이너와 다릅니다. 이미지는 실행 전 패키지이고, 컨테이너는 이미지를 실행한 인스턴스입니다. 따라서 이미지 백업은 실행 중인 데이터나 볼륨 데이터까지 포함하지 않습니다.

현재 Docker 이미지 목록 확인

먼저 서버에 어떤 Docker 이미지가 있는지 확인합니다.

 
docker images
 

예시 결과입니다.

 
REPOSITORY          TAG       IMAGE ID       CREATED        SIZE
my-app              latest    a1b2c3d4e5f6   2 days ago     350MB
nginx               1.25      605c77e624dd   3 weeks ago    187MB
mysql               8.0       3218b38490ce   1 month ago    600MB
 

백업할 때는 REPOSITORY:TAG 형식으로 지정하는 것이 좋습니다.

예를 들어 my-app:latest 이미지를 백업하려면 다음처럼 사용합니다.

Docker 이미지 백업 방법

Docker 이미지를 tar 파일로 백업할 때는 docker save 명령어를 사용합니다.

 
docker save -o my-app-latest.tar my-app:latest
 

명령어 구조는 다음과 같습니다.

 
docker save -o [백업파일명.tar] [이미지명:태그]
 

예시입니다.

 
docker save -o nginx-1.25.tar nginx:1.25
 

백업 파일이 생성되었는지 확인합니다.

 
ls -lh
 

결과 예시입니다.

 
-rw------- 1 root root 187M May 21 10:30 nginx-1.25.tar
 

여러 Docker 이미지를 한 번에 백업하기

여러 이미지를 하나의 tar 파일로 묶어서 백업할 수도 있습니다.

 
docker save -o docker-images-backup.tar nginx:1.25 mysql:8.0 my-app:latest
 

이 방식은 특정 서비스에 필요한 이미지를 한 번에 옮길 때 편리합니다.

다만 이미지 용량이 클 경우 tar 파일 크기도 커지므로 서버 디스크 용량을 먼저 확인해야 합니다.

 
df -h
 

Docker 이미지 백업 파일 압축하기

Docker 이미지 tar 파일은 용량이 큰 경우가 많습니다. 서버 간 전송이 필요하다면 gzip으로 압축하는 것이 좋습니다.

 
gzip my-app-latest.tar
 

압축 후 파일명은 다음처럼 변경됩니다.

 
my-app-latest.tar.gz
 

압축된 파일을 복원할 때는 먼저 압축을 해제합니다.

 
gunzip my-app-latest.tar.gz
 

또는 압축 해제와 Docker 이미지 로드를 한 번에 처리할 수도 있습니다.

 
gunzip -c my-app-latest.tar.gz | docker load
 

Docker 이미지 복원 방법

Docker 이미지 복원은 docker load 명령어를 사용합니다.

 
docker load -i my-app-latest.tar
 

명령어 구조는 다음과 같습니다.

 
docker load -i [백업파일명.tar]
 

복원이 완료되면 다음과 같은 메시지가 출력됩니다.

 
Loaded image: my-app:latest
 

복원된 이미지 목록을 확인합니다.

 
docker images
 

다른 서버로 Docker 이미지 옮기기

Docker 이미지 백업 파일을 다른 서버로 옮길 때는 scp를 많이 사용합니다.

 
scp my-app-latest.tar user@192.168.0.20:/home/user/
 

새 서버에 접속합니다.

 
ssh user@192.168.0.20
 

Docker 이미지를 복원합니다.

 
docker load -i /home/user/my-app-latest.tar
 

복원 후 컨테이너를 실행합니다.

 
docker run -d --name my-app -p 8080:8080 my-app:latest
 

Docker 이미지 백업과 컨테이너 백업의 차이

Docker 이미지 백업과 컨테이너 백업은 목적이 다릅니다.

구분명령어포함 내용
이미지 백업 docker save 이미지 레이어, 태그 정보
이미지 복원 docker load 이미지 재등록
컨테이너 파일시스템 백업 docker export 컨테이너 파일시스템
컨테이너 복원 docker import 이미지로 가져오기

일반적으로 운영 배포용 이미지를 옮길 때는 docker save와 docker load를 사용합니다.

반면 실행 중인 컨테이너 내부의 변경 사항을 파일시스템 기준으로 저장하려면 docker export를 사용합니다. 하지만 이 방식은 이미지 히스토리나 메타데이터가 유지되지 않기 때문에 일반적인 이미지 백업에는 권장되지 않습니다.

Docker save와 export 차이

많이 헷갈리는 부분이 docker save와 docker export입니다.

 
docker save -o image.tar my-app:latest
 

docker save는 Docker 이미지를 백업합니다.

 
docker export -o container.tar my-container
 

docker export는 컨테이너의 파일시스템을 백업합니다.

정리하면 다음과 같습니다.

명령어대상주요 용도
docker save 이미지 이미지 백업, 서버 이전, 폐쇄망 배포
docker load 이미지 tar 파일 이미지 복원
docker export 컨테이너 컨테이너 파일시스템 추출
docker import export tar 파일 새 이미지 생성

운영 배포 이미지 백업 목적이라면 대부분 docker save를 사용하면 됩니다.

Docker 이미지 백업 자동화 스크립트 예제

운영 서버에서는 매번 명령어를 직접 입력하기보다 날짜별로 백업 파일을 생성하는 스크립트를 만들어두면 편리합니다.

 
#!/bin/bash

IMAGE_NAME="my-app"
IMAGE_TAG="latest"
BACKUP_DIR="/backup/docker-images"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

docker save -o "$BACKUP_DIR/${IMAGE_NAME}_${IMAGE_TAG}_${DATE}.tar" "${IMAGE_NAME}:${IMAGE_TAG}"

gzip "$BACKUP_DIR/${IMAGE_NAME}_${IMAGE_TAG}_${DATE}.tar"

echo "Docker image backup completed:"
echo "$BACKUP_DIR/${IMAGE_NAME}_${IMAGE_TAG}_${DATE}.tar.gz"
 

파일명을 docker-image-backup.sh로 저장합니다.

 
vi docker-image-backup.sh
 

실행 권한을 부여합니다.

 
chmod +x docker-image-backup.sh
 

스크립트를 실행합니다.

 
./docker-image-backup.sh
 

Docker 이미지 복원 자동화 스크립트 예제

압축된 Docker 이미지 백업 파일을 복원하는 스크립트는 다음과 같이 작성할 수 있습니다.

 
#!/bin/bash

BACKUP_FILE="$1"

if [ -z "$BACKUP_FILE" ]; then
  echo "Usage: $0 [docker-image.tar.gz]"
  exit 1
fi

if [ ! -f "$BACKUP_FILE" ]; then
  echo "File not found: $BACKUP_FILE"
  exit 1
fi

gunzip -c "$BACKUP_FILE" | docker load

echo "Docker image restore completed."
docker images
 

실행 예시입니다.

 
chmod +x docker-image-restore.sh
./docker-image-restore.sh my-app_latest_20260521_103000.tar.gz
 

Docker Compose 환경에서 이미지 백업하기

Docker Compose를 사용하는 경우 먼저 어떤 이미지가 사용 중인지 확인해야 합니다.

 
docker compose images
 

또는 docker-compose.yml 파일에서 image 항목을 확인합니다.

 
services:
  app:
    image: my-app:latest
    ports:
      - "8080:8080"

  nginx:
    image: nginx:1.25
    ports:
      - "80:80"
 

위 구성이라면 다음처럼 백업할 수 있습니다.

 
docker save -o compose-images.tar my-app:latest nginx:1.25
 

복원 서버에서는 다음 명령어를 실행합니다.

 
docker load -i compose-images.tar
docker compose up -d
 

Docker 이미지 백업 시 주의할 점

Docker 이미지 백업을 할 때는 다음 내용을 확인해야 합니다.

첫째, Docker 이미지는 볼륨 데이터를 포함하지 않습니다. MySQL, PostgreSQL, Redis 같은 데이터 저장소를 컨테이너로 운영 중이라면 반드시 볼륨 백업을 별도로 해야 합니다.

예를 들어 MySQL 데이터를 Docker volume으로 사용 중이라면 이미지 백업만으로는 데이터가 복구되지 않습니다.

 
docker volume ls
 

둘째, 이미지 태그를 명확하게 관리해야 합니다. latest 태그만 사용하면 어떤 시점의 이미지인지 추적하기 어렵습니다.

운영에서는 다음처럼 버전 태그를 함께 사용하는 것이 좋습니다.

 
my-app:2026.05.21
my-app:v1.3.0
my-app:release-20260521
 

셋째, 백업 파일은 서버 외부에도 보관하는 것이 좋습니다. 같은 서버에만 백업 파일을 두면 디스크 장애가 발생했을 때 함께 손실될 수 있습니다.

자주 발생하는 오류

no space left on device

Docker 이미지를 백업하거나 복원할 때 디스크 공간이 부족하면 다음 오류가 발생할 수 있습니다.

 
no space left on device
 

디스크 용량을 확인합니다.

 
df -h
 

Docker가 사용하는 용량도 확인합니다.

 
docker system df
 

사용하지 않는 이미지와 컨테이너를 정리할 수 있습니다.

 
docker system prune -a
 

다만 이 명령어는 사용하지 않는 이미지까지 삭제할 수 있으므로 운영 서버에서는 신중하게 실행해야 합니다.

requested access to the resource is denied

이미지를 pull하거나 push할 때 발생하는 오류이지만, 백업/복원 후 Registry에 다시 올리는 과정에서도 자주 보입니다.

 
requested access to the resource is denied
 

이 경우 Docker Registry 로그인 여부와 이미지 태그를 확인해야 합니다.

 
docker login
docker tag my-app:latest registry.example.com/my-app:latest
docker push registry.example.com/my-app:latest
 

FAQ

Docker 이미지 백업 파일에 컨테이너 데이터도 포함되나요?

포함되지 않습니다. docker save는 Docker 이미지 백업 명령어입니다. 컨테이너 실행 중 생성된 데이터, Docker volume, 데이터베이스 파일은 별도로 백업해야 합니다.

Docker 이미지를 다른 서버로 옮기려면 Registry가 꼭 필요한가요?

아닙니다. docker save로 tar 파일을 만들고 scp, rsync, USB, 내부망 파일 서버 등을 통해 전달한 뒤 docker load로 복원할 수 있습니다.

docker save와 docker export 중 어떤 것을 써야 하나요?

이미지를 백업하고 다른 서버에서 동일하게 실행하려면 docker save를 사용합니다. 컨테이너 파일시스템 자체를 추출하려면 docker export를 사용합니다.

Docker 이미지 백업 파일은 압축해도 되나요?

가능합니다. gzip으로 압축해도 되고, 복원할 때는 gunzip -c backup.tar.gz | docker load 방식으로 바로 로드할 수 있습니다.

마무리

Docker 이미지 백업/복원은 docker save와 docker load만 정확히 이해하면 어렵지 않습니다. 운영 서버 이전, 폐쇄망 배포, 장애 대비 이미지 보관이 필요하다면 이미지를 tar 파일로 백업하고, 복원 서버에서 docker load로 다시 등록하면 됩니다.

다만 Docker 이미지 백업은 컨테이너 데이터나 볼륨 데이터를 포함하지 않으므로, 데이터베이스나 업로드 파일이 있는 서비스라면 볼륨 백업까지 함께 설계해야 합니다.

추천 태그

Docker,Docker 이미지 백업,Docker 이미지 복원,docker save,docker load,Docker tar 백업,Docker 서버 이전,Docker 폐쇄망 배포,Docker Compose,Docker 운영