도커 볼륨 백업 및 복원


23

Docker를 사용하여 CentOS 6.4 서버에 일부 서비스를 배포하고 있으며 생성 된 데이터를 올바르게 백업하는 방법을 알아 내려고 노력 중입니다.

예를 들어, 서비스 중 하나는 사용자가 파일을 업로드 할 수있는 웹 응용 프로그램입니다. 이 컨테이너의 경우 /files백업하려는 볼륨이 있습니다. 이 블로그 게시물볼륨에 대한 도커 설명서 에서 언급했듯이 호스트 마운트는 이식성이 떨어지기 때문에 다소 찌그러진 것처럼 보입니다 .

같은 블로그 게시물 에서 볼륨의 파일에 액세스하기 위해 호스트 마운트가 필요 하지 않다는 docker inspect것을 알고 있습니다. 파일 위치를 찾는 데 사용할 수 있습니다 .

그러나 여기 내 문제가 있습니다. 컨테이너와 관련 볼륨을 빌드하는 데 필요한 도커 파일 만 백업하는 것에 대해 생각하고있었습니다. 백업에서 모든 것을 복원해야 할 경우 어떤 볼륨 디렉토리가 어떤 컨테이너에 해당하는지 아는 방법은 무엇입니까? 컨테이너를 다시 빌드하면 ID와 볼륨 경로가 변경되므로 일치하는 추가 정보가 필요합니다. 실제로 모든 것을 복원하려면 백업해야 할 것이 있다면 무엇입니까?

답변:


24

네가 옳아. 자체적으로 볼륨이있는 여러 컨테이너를 가질 수 있으므로 어떤 볼륨이 어떤 컨테이너에 해당하는지 추적해야합니다. 이를 수행하는 방법은 설정에 따라 다릅니다. 데이터 컨테이너에 이름 -data를 사용하므로 이미지가 속한 컨테이너가 분명합니다. 그렇게하면 다음과 같이 백업 할 수 있습니다.

VOLUME=`docker inspect $NAME-data | jq '.[0].Volumes["/path/in/container"]'`
tar -C $VOLUME . -czvf $NAME.tar.gz

이제 이미지를 다시 작성하고 데이터 컨테이너를 다시 작성하면됩니다.

cat $NAME.tar.gz | docker run -name $NAME-data -v /path/in/container \
                              -i busybox tar -C /path/int/container -xzf -

따라서 백업해야합니다.

  • 도커 파일
  • 음량
  • 컨테이너의 볼륨 경로
  • 볼륨이 속한 컨테이너의 이름

업데이트 : 컨테이너 및 해당 볼륨 (컨테이너)을 백업하는 도구를 만들었습니다 : https://github.com/discordianfish/docker-backup 및 백업을 생성하고 푸시 할 수있는 백업 이미지 s3 : https://github.com/discordianfish/docker-lloyd


고맙습니다. 데이터에 별도의 컨테이너를 사용하면 확실한 이점이 있습니까?
fcoelho

이것은 다시 설정에 달려 있습니다. 'volumes-from'을 사용하여 쉽게 참조 할 수 있고 모든 내부를 추상화 할 수 있기 때문에 데이터 컨테이너를 사용하는 것이 좋습니다. 경로와 탑재 지점을 고려하지 않고 컨테이너에서 다른 컨테이너로 볼륨을 연결하기 만하면됩니다.
Johannes '물고기'Ziemke

이 오류 옵션이 잘못되었습니다-z. busybox의 기본 tar는 이것을 지원하지 않는 것 같습니다.
Dzung Nguyen

6
jq는 매우 멋지지만 의존성을 도입하는 것이 아니라 docker inspect템플릿에서 내장 된을 사용하지 않는 이유는 무엇입니까 VOLUME=$( docker inspect -f '{{index .Volumes "/path/in/container"}}' "${NAME}-data" )? 또한 사람들이 적극적으로 사용하는 동안 (예 : 데이터베이스) 파일을 백업하지 않을 것을 상기시키는 것이 현명 할 것입니다.
mc0e

2
도커 1.8의 형식이 변경되었습니다 - Volumes사라하고있다 Mounts다른 구조로 대신. 우리는 range우리가 관심이있는 마운트 포인트를 찾기 위해 약간의 작업을 더해야합니다 .VOLUME=$(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/path/in/container" }}{{ .Source }}{{ end }}{{ end }}' "${NAME}-data")
Jarek Przygódzki

5

최신 Docker (에서 테스트 1.9.1, build 9894698)에서 cp명령을 사용할 수 있습니다 .

컨테이너에서 호스트로 디렉토리를 복사하는 방법의 예는 다음과 같습니다.

docker cp wordpress:/var/www/html backups/wordpress.`date +"%Y%m%d"`/

컨테이너에서 tar파일 로 디렉토리를 복사하는 방법의 예는 다음과 같습니다 .

docker cp wordpress:/var/www/html - > backups/wordpress.`date +"%Y%m%d"`.tar

컨테이너에서 tar.gz파일 로 디렉토리를 복사하는 방법에 대한 마지막 예는 다음과 같습니다.

docker cp wordpress:/var/www/html - | gzip > backups/wordpress.`date +"%Y%m%d"`.tar.gz

2
docker cp네트워크를 통해 모든 것을 보냅니다. Docker 볼륨이 이미 btrfs 볼륨 인 경우 특히 피하고 싶은 것입니다.
Jarek Przygódzki

2
백업 및 복원에 대한 질문 입니다. 이 답변의 복원 예제는 docker cp좋을 것입니다.
MadMike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.