Docker 환경을 운영하다 보면 백업의 필요성을 느끼게 됩니다. 서버 이전, 장애 복구, 개발 환경 공유 등 다양한 상황에서 Docker 백업은 필수입니다. 이 글에서는 Docker 백업의 4가지 핵심 항목을 정리합니다.
Docker 백업 4가지 항목
| # | 백업 대상 | 명령어/방법 | 중요도 |
|---|---|---|---|
| 1 | 이미지 | docker save/load | ★★★ |
| 2 | 컨테이너 | docker export/import | ★ |
| 3 | 볼륨 | tar 또는 백업 도구 | ★★★★★ |
| 4 | 설정 | docker-compose.yml, .env | ★★★★ |
실무 중요도 순서는 볼륨 > 설정 > 이미지 >>> 컨테이너 입니다.
1. 이미지 백업 (save/load)
Docker 이미지를 tar 파일로 저장하고 복원하는 방법입니다. 이미지의 모든 레이어와 히스토리가 보존됩니다.
이미지 저장
# 기본 사용법
docker save -o myimage.tar nginx:latest
# 리다이렉션 사용
docker save nginx:latest > nginx.tar
# 여러 이미지 한번에 저장
docker save -o all-images.tar nginx:latest redis:alpine postgres:16
# 압축해서 저장 (용량 절약)
docker save nginx:latest | gzip > nginx.tar.gz
이미지 복원
# 기본 사용법
docker load -i myimage.tar
# 리다이렉션 사용
docker load < nginx.tar
# 압축 파일에서 복원
gunzip -c nginx.tar.gz | docker load
사용 시나리오
- 프라이빗 레지스트리 없이 이미지 공유
- 오프라인 환경으로 이미지 이동
- 특정 버전 이미지 아카이빙
2. 컨테이너 백업 (export/import)
실행 중인 컨테이너의 파일시스템을 스냅샷으로 저장합니다. 레이어가 단일 레이어로 평탄화되고 메타데이터가 손실되므로 실무에서는 거의 사용하지 않습니다.
컨테이너 내보내기
# 기본 사용법
docker export container_name -o container.tar
# 리다이렉션 사용
docker export container_name > container.tar
컨테이너 가져오기
# 새 이미지로 가져오기
docker import container.tar myimage:tag
# 파이프 사용
cat container.tar | docker import - myimage:tag
save/load vs export/import 차이점
| 구분 | save/load | export/import |
|---|---|---|
| 대상 | 이미지 | 컨테이너 |
| 레이어 | 보존 ✅ | 단일 레이어로 평탄화 |
| 히스토리 | 보존 ✅ | 손실 ❌ |
| 메타데이터 | 보존 ✅ | 손실 ❌ |
| 용도 | 이미지 이동/백업 | 컨테이너 스냅샷 |
3. 볼륨 백업 (가장 중요!)
볼륨에는 데이터베이스, 설정 파일, 업로드된 파일 등 실제 데이터가 저장됩니다. Docker 백업에서 가장 중요한 항목입니다.
볼륨 백업
# busybox 컨테이너를 이용한 볼륨 백업
docker run --rm \
-v 볼륨명:/data \
-v $(pwd):/backup \
busybox tar cvf /backup/volume-backup.tar /data
볼륨 복원
# 백업 파일에서 볼륨 복원
docker run --rm \
-v 볼륨명:/data \
-v $(pwd):/backup \
busybox tar xvf /backup/volume-backup.tar -C /
실행 중인 컨테이너 볼륨 백업
# 컨테이너 일시 정지 후 백업 (데이터 정합성 보장)
docker pause container_name
docker run --rm \
--volumes-from container_name \
-v $(pwd):/backup \
busybox tar cvf /backup/volume-backup.tar /var/lib/mysql
docker unpause container_name
볼륨 백업 도구
수동 백업이 번거롭다면 다음 도구들을 활용할 수 있습니다.
- Duplicati: 암호화된 클라우드 백업
- Restic: 빠르고 안전한 백업, 중복 제거
- BorgBackup: 중복 제거, 압축, 암호화
- Volumerize: Docker 볼륨 전용 백업 도구
4. 설정 백업
Docker Compose 설정 파일과 환경 변수 파일을 백업합니다. 이 파일들만 있으면 언제든 동일한 환경을 재구성할 수 있습니다.
백업 대상 파일
project/
├── docker-compose.yml # 컨테이너 구성 정의
├── docker-compose.override.yml # 환경별 오버라이드 (선택)
├── .env # 환경 변수
└── config/ # 애플리케이션 설정 파일들
├── nginx.conf
└── my.cnf
설정 백업 스크립트 예시
#!/bin/bash
BACKUP_DIR="./backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 설정 파일 백업
cp docker-compose.yml $BACKUP_DIR/
cp .env $BACKUP_DIR/
cp -r config/ $BACKUP_DIR/
# 압축
tar czvf backup-$(date +%Y%m%d).tar.gz $BACKUP_DIR
전체 백업 스크립트 예시
4가지 항목을 모두 백업하는 스크립트입니다.
#!/bin/bash
set -e
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="./backup/$BACKUP_DATE"
mkdir -p $BACKUP_DIR
echo "=== Docker 전체 백업 시작 ==="
# 1. 설정 파일 백업
echo "[1/3] 설정 파일 백업..."
cp docker-compose.yml $BACKUP_DIR/
cp .env $BACKUP_DIR/ 2>/dev/null || true
cp -r config/ $BACKUP_DIR/ 2>/dev/null || true
# 2. 이미지 백업
echo "[2/3] 이미지 백업..."
IMAGES=$(docker compose images -q | sort -u)
if [ -n "$IMAGES" ]; then
docker save $IMAGES | gzip > $BACKUP_DIR/images.tar.gz
fi
# 3. 볼륨 백업
echo "[3/3] 볼륨 백업..."
VOLUMES=$(docker compose config --volumes)
for vol in $VOLUMES; do
docker run --rm \
-v ${vol}:/data \
-v $BACKUP_DIR:/backup \
busybox tar cvf /backup/volume-${vol}.tar /data
done
# 최종 압축
tar czvf backup-$BACKUP_DATE.tar.gz $BACKUP_DIR
rm -rf $BACKUP_DIR
echo "=== 백업 완료: backup-$BACKUP_DATE.tar.gz ==="
정리
Docker 백업은 4가지 항목으로 구성됩니다.
| 백업 대상 | 방법 | 포함 내용 |
|---|---|---|
| 이미지 | docker save/load | 레이어, 히스토리, 메타데이터 |
| 컨테이너 | docker export/import | 파일시스템 스냅샷 (거의 안 씀) |
| 볼륨 | tar 또는 백업 도구 | DB, 설정, 업로드 파일 등 실제 데이터 |
| 설정 | 파일 복사 | docker-compose.yml, .env, config |
실무에서는 볼륨과 설정만 잘 백업해두면 이미지는 레지스트리에서 다시 받을 수 있고, 컨테이너는 설정으로 재생성하면 됩니다. 정기적인 백업 스케줄을 설정하고, 복원 테스트도 주기적으로 수행하는 것을 권장합니다.