Quick Flow
# 1. application write를 멈추거나 DB의 일관된 backup을 먼저 생성
docker compose stop db
# 2. volume을 read-only로 붙여 tar archive 생성
docker run --rm \
--mount type=volume,src=app_pgdata,dst=/data,readonly \
--mount type=bind,src="$PWD",dst=/backup \
alpine tar czf /backup/pgdata.tgz -C /data .
# 3. 새 volume에만 먼저 복원
docker volume create app_pgdata_restore
docker run --rm \
--mount type=volume,src=app_pgdata_restore,dst=/data \
--mount type=bind,src="$PWD",dst=/backup,readonly \
alpine tar xzf /backup/pgdata.tgz -C /data백업 file을 만든 것만으로 끝나지 않습니다. checksum 확인, 새 volume을 연결한 application 기동, 필요한 데이터 조회까지 통과해야 복구 가능한 backup입니다.
일관된 백업
named volume은 container를 삭제해도 남습니다. 그래서 DB 데이터, 업로드 파일, cache처럼 container lifecycle과 분리해야 하는 데이터를 보관할 수 있습니다. Compose를 쓰면 project name이 volume 이름 앞에 붙을 수 있으므로, backup 대상은 service 이름이 아니라 docker volume ls에서 확인한 실제 volume 이름입니다.
docker volume ls
docker volume inspect app_pgdata파일이 계속 바뀌는 상태에서 tar를 만들면 archive 안 파일의 시점이 서로 어긋날 수 있습니다. PostgreSQL, MySQL, SQLite처럼 자체 consistency 규칙이 있는 DB는 서비스를 멈추거나 DB의 logical backup·snapshot·replication 절차를 먼저 씁니다. volume tar는 그 절차의 대체가 아니라 image·환경과 분리된 file backup 용도로 봅니다.
# PostgreSQL 예: DB가 제공하는 logical backup은 별도 절차
docker compose exec -T db sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > app.sql새 volume 복구
기존 volume에 바로 덮어쓰면 실패했을 때 원본과 복구본을 함께 잃을 수 있습니다. 새 volume에 archive를 풀고, 임시 Compose override 또는 별도 container로 application을 기동해 schema·권한·실제 조회를 확인한 뒤에만 교체를 검토합니다.
# 복원 결과의 파일 목록과 소유권 확인
docker run --rm \
--mount type=volume,src=app_pgdata_restore,dst=/data,readonly \
alpine sh -c 'find /data -maxdepth 2 -ls | head -40'backup container가 root로 archive를 만들고 풀면 application container의 실행 UID/GID와 파일 ownership이 맞지 않을 수 있습니다. target application을 실제 사용자로 한 번 기동해 permission error를 확인합니다. rootless Docker, SELinux, network volume driver처럼 storage driver가 다르면 이 검증은 더 중요합니다.
보관과 복구 검증
archive가 복사 중 바뀌지 않았는지 checksum을 남기고, backup file은 volume과 같은 disk가 아닌 storage에 보관합니다. 아래 예시는 Linux의 sha256sum이며, macOS에서는 shasum -a 256을 사용합니다.
# 생성 측
sha256sum pgdata.tgz > pgdata.tgz.sha256
# 복원 전
sha256sum --check pgdata.tgz.sha256volume archive에는 Compose file, image, registry credentials, external object storage data가 들어 있지 않습니다. 복구 runbook에는 volume 이름, source image digest, application/DB version, 복원 명령, 데이터 검증 query, 원본 보존 기간을 함께 기록합니다.
실행 중인 DB volume을 단순 tar로 복사하면 일관성이 깨질 수 있습니다. 운영 DB는 pg_dump, mysqldump, storage snapshot, replication처럼 DB 또는 storage가 보장하는 backup 절차를 우선 검토하십시오.
참고 링크
2 sources