docker desktop에서 사용하던 volumn 백업 및 새 PC에 옮기는 방법


가장 안전한 방법은 volume 내용을 tar로 묶어서 백업한 뒤, 새 Mac에서 복원하는 겁니다.
Mac + Docker Desktop에서는 Docker가 내부 Linux VM 안에서 volume을 관리하므로, Finder로 직접 volume 파일을 복사하려고 하기보다 Docker 컨테이너를 통해 백업/복원하는 방식이 가장 권장됩니다.

Mac에서 Docker volume을 다른 Mac으로 옮기려면, volume을 tar.gz로 백업해서 새 Mac에서 같은 이름의 volume에 복원하는 방식이 가장 안전합니다.
특히 DB volume은 컨테이너를 내린 뒤 백업하고, 가능하면 SQL dump도 함께 보관하는 걸 추천합니다.



권장 방법 1: tar 파일로 백업/복원

예를 들어 volume 이름이 mydata라고 하면:

1) 백업할 폴더 준비

mkdir -p ~/docker-volume-backups

2) volume 백업

docker run --rm \
  -v mydata:/volume \
  -v ~/docker-volume-backups:/backup \
  alpine \
  sh -c "cd /volume && tar czf /backup/mydata-backup.tar.gz ."

이 명령은:

  • mydata volume을 /volume에 붙이고
  • Mac 폴더 ~/docker-volume-backups/backup에 붙인 뒤
  • volume 전체를 mydata-backup.tar.gz로 저장합니다

백업 파일은 Mac에 실제로 생깁니다:

~/docker-volume-backups/mydata-backup.tar.gz

새 Mac에서 복원

1) 새 Mac으로 백업 파일 복사

예:

  • AirDrop
  • 외장디스크
  • iCloud Drive
  • rsync/scp

2) 새 Mac에서 volume 생성

docker volume create mydata

3) tar 파일 복원

docker run --rm \
  -v mydata:/volume \
  -v ~/docker-volume-backups:/backup \
  alpine \
  sh -c "cd /volume && tar xzf /backup/mydata-backup.tar.gz"

이제 mydata volume 안에 원래 데이터가 들어갑니다.


여러 volume 백업하기

현재 volume 목록 확인:

docker volume ls

예를 들어:

  • myapp_postgres_data
  • myapp_redis_data
  • myapp_uploads

각각 백업:

docker run --rm -v myapp_postgres_data:/volume -v ~/docker-volume-backups:/backup alpine sh -c "cd /volume && tar czf /backup/myapp_postgres_data.tar.gz ."

docker run --rm -v myapp_redis_data:/volume -v ~/docker-volume-backups:/backup alpine sh -c "cd /volume && tar czf /backup/myapp_redis_data.tar.gz ."

docker run --rm -v myapp_uploads:/volume -v ~/docker-volume-backups:/backup alpine sh -c "cd /volume && tar czf /backup/myapp_uploads.tar.gz ."

Compose 프로젝트라면 주의할 점

Docker Compose를 썼다면 volume 이름이 보통 다음처럼 생깁니다:

  • <project>_<volume>
  • 예: blog_pgdata, blog_node_modules

정확한 이름은:

docker volume ls

로 확인하세요.

또는 compose 설정 보기:

docker compose config

데이터 정합성 주의

특히 DB volume 백업 시에는 컨테이너가 계속 쓰고 있으면 백업 시점이 애매할 수 있습니다.
가장 안전한 방법은:

데이터베이스 컨테이너 중지 후 백업

docker compose down

또는 최소한 DB만 중지:

docker stop <db-container-name>

그 후 volume 백업.

왜 중요하나

PostgreSQL/MySQL 같은 DB는 실행 중에 파일이 계속 바뀌므로
그냥 파일 레벨 백업을 뜨면 일관성이 깨질 수 있습니다.


DB는 가능하면 논리 백업도 같이

DB라면 volume 백업도 좋지만, 더 안전하게는 DB dump도 같이 떠두는 게 좋습니다.

예: PostgreSQL

docker exec <postgres-container> pg_dumpall -U postgres > ~/docker-volume-backups/postgres-dump.sql

예: MySQL

docker exec <mysql-container> mysqldump -u root -p --all-databases > ~/docker-volume-backups/mysql-dump.sql

즉 추천은:

  • 앱 파일/업로드 데이터: volume tar 백업
  • DB 데이터: 가능하면 dump + volume backup 둘 다

전체 마이그레이션 추천 순서

기존 Mac

  1. volume 목록 확인

    docker volume ls
  2. 필요한 컨테이너 중지

    docker compose down
  3. 각 volume 백업

    docker run --rm \
      -v mydata:/volume \
      -v ~/docker-volume-backups:/backup \
      alpine sh -c "cd /volume && tar czf /backup/mydata-backup.tar.gz ."
  4. 가능하면 DB dump도 확인필요

  5. ~/docker-volume-backups 폴더를 새 Mac으로 이동


새 Mac

  1. Docker Desktop 설치

  2. 프로젝트 파일 복사

  3. 필요한 volume 생성

    docker volume create mydata
  4. volume 복원

    docker run --rm \
      -v mydata:/volume \
      -v ~/docker-volume-backups:/backup \
      alpine sh -c "cd /volume && tar xzf /backup/mydata-backup.tar.gz"
  5. 컨테이너 실행

    docker compose up -d

bind mount였다면 더 단순함

만약 데이터가 named volume이 아니라 bind mount였다면, 그냥 Mac 폴더 자체를 복사하면 됩니다.

예:

/Users/tobony/workspace/myapp/data

이런 건 그냥:

  • 외장 디스크
  • rsync
  • Git 제외 후 파일복사

로 옮기면 됩니다.

즉 마이그레이션 난이도는:

  • bind mount: 일반 파일 복사
  • named volume: tar 백업/복원 필요

volume 위치를 직접 찾는 방법은 비추천

Linux에서는 /var/lib/docker/volumes/... 식으로 다루는 경우가 있지만,
Mac + Docker Desktop에서는 내부 VM에 있으므로 직접 경로 복사 방식은 비추천입니다.

이유:

  • 접근이 번거로움
  • Docker Desktop 내부 구조 의존
  • 실수하기 쉬움
  • 버전 바뀌면 더 헷갈림

그래서 docker run -v volume:/volume ... tar ... 방식이 가장 안전합니다.


백업 검증도 해보는 게 좋음

백업 파일 내용 확인:

tar tzf ~/docker-volume-backups/mydata-backup.tar.gz | head

복원 후 테스트:

docker run --rm -it -v mydata:/volume alpine ls -la /volume

한 번에 스크립트로 하는 예시

백업

mkdir -p ~/docker-volume-backups

for vol in myapp_postgres_data myapp_uploads myapp_redis_data; do
  docker run --rm \
    -v ${vol}:/volume \
    -v ~/docker-volume-backups:/backup \
    alpine \
    sh -c "cd /volume && tar czf /backup/${vol}.tar.gz ."
done

복원

for vol in myapp_postgres_data myapp_uploads myapp_redis_data; do
  docker volume create ${vol}
  docker run --rm \
    -v ${vol}:/volume \
    -v ~/docker-volume-backups:/backup \
    alpine \
    sh -c "cd /volume && tar xzf /backup/${vol}.tar.gz"
done

댓글