volume Backup/Restore
Backup
백업 대상
- 백업 대상 컨테이너와 volume이 아래와 같을 경우 해당 volume에 대한 백업이 필요한 상황
- dbdata volume 생성 및 컨테이너에 dbdata 이름으로 디렉토리 생성하여 연결됨
- volume 이름을 지정하지 않았기 대문에 volume 조회 명령어를 통해 조회하면 임의의 해쉬 값으로 생성된 것을 확인 할수 있다.
$ docker run -v /dbdata --name dbstore ubuntu /bin/bash
백업 실행
- volume 사용을 못하도록 백업 대상 volume을 사용하는 컨테이너 중지
- 백업 실행용 임시 컨테이너를 생성 - 백업파일 생성(tar) 용도/ 사용 후 컨테이너 삭제
- volumes-from [컨테이너 이름/ID]
- 대상 컨테이너(dbstore)에서 사용하는 모든 volume을 마운트
- 해당 컨테이너에서 지정했던 디렉토리 이름도 똑같이 연결이 됨 /dbdata 이름으로 폴더가 연결됨
- -v $(pwd):/backup : 백업 파일을 저장하기 하기위해 명령어를 실행하는 현재 디렉토리를 컨테이너의 backup 디렉토리로 연결
- tar cvf - dbdata 디렉토리를 압축 후 스토리지로 연결한 폴더(backup)에 tar 생성
- --rm 옵션에 때문에 해당 컨테이너는 압축 후 삭제
- 호스트 머신의 아래 명령어를 실행한 디렉토리에 backup.tar 파일이 생성되어 있다.
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Restore
복원 대상
- 아래와 같이 생성한 컨테이너에 volume 복원을 할 경우
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
복원 실행
- 복원을 실행할 임시 컨테이너를 생성 - 백업 파일을 dbdata volume에 압축해제 하기위해
- --rm : 복원이 끝낙 자동 삭제
- --volumes-from dbstore2: 복원 대상 컨테이너를 지정 - dbstore2에서 사용하는 volume을 연결
. -v : 복원할 파일(backup.tar)의 위치를 bind mount를 이용하여 연결
- -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1" :
- 임시 컨테이너의 dbdata 폴더로 이동 후 backup폴더 위치에 있는 백업 파일 압축을 해제
- strip 1 : 압축 파일 이름으로 폴더를 생성후 압축을 실행하지 않고 지정된 폴더에 바로 압축을 해제 하기 위해 해당 옵션 사용
- strip 1 옵션이 없이 압축 해제 할 경우 /dbdata 폴더에 압축 파일이름으로 폴더가 생성되면서 압축이 해제됨
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
기타
- volumes-from 을 사용하지 않고 backup/restore 실행 할 경우
# volumeq 백업 대상 - tod
$ docker run -di -v todo:/tod -v todo2:/tod2 --name ubuntu ubuntu
# volume 백업 실행
$ docker run --rm -v todo:/tod -v $(pwd):/backup ubuntu tar cvf /backup/tod.tar /tod
# 복원 대상 컨테이너
docker run -di -v todo-new:/todo --name ubuntu-new ubuntu
# 백업 파일 todo-new volume에 압축 해제
docker run --rm -v todo-new:/todo -v $(pwd):/backup ubuntu bash -c "cd /todo && tar xvf /backup/tod.tar --strip 1"