[backup] Docker 컨테이너를 데이터 볼륨으로 어떻게 백업 할 수 있습니까?

이 Docker 이미지 tutum / wordpress 를 사용하여 WordPress 웹 사이트를 보여주었습니다. 최근 이미지가 MySQL 데이터의 볼륨을 사용한다는 것을 알았습니다.

그래서 문제는 이것입니다 : 컨테이너를 백업하고 복원하려면 이미지를 커밋하려고 시도한 다음 나중에 컨테이너를 삭제하고 커밋 된 이미지에서 새 컨테이너를 만들 수 있습니다. 그러나 그렇게하면 볼륨이 삭제되고 모든 데이터가 사라집니다.

컨테이너와 볼륨 데이터를 백업하는 간단한 방법이 있어야하지만 어디서나 찾을 수는 없습니다.



답변

컨테이너를 되돌리려면 이미지를 커밋 한 다음 나중에 컨테이너를 삭제하고 커밋 된 이미지에서 새 컨테이너를 만들 수 있습니다. 그러나 그렇게하면 볼륨이 삭제되고 모든 데이터가 사라집니다.

도커 사용 설명서에서 설명하는 것처럼 데이터 볼륨 은 컨테이너 파일 시스템 외부에서 데이터를 유지하기위한 것입니다. 또한 여러 컨테이너간에 데이터를 쉽게 공유 할 수 있습니다.

Docker는 볼륨에서 데이터를 삭제하지 않지만 (와 관련된 컨테이너를 삭제하지 않는 한 docker rm -v) 도커 컨테이너가 참조하지 않는 볼륨을 댕글 링 볼륨 이라고 합니다. 이러한 매달린 볼륨 은 제거하기가 어렵고 액세스하기가 어렵습니다.

즉, 볼륨을 사용하는 마지막 컨테이너가 삭제 되 자마자 데이터 볼륨이 늘어지고 컨텐츠를 액세스하기가 어렵습니다.

이러한 댕글 링 볼륨을 방지하기 위해 트릭은 유지하려는 데이터 볼륨을 사용하여 추가 도커 컨테이너를 만드는 것입니다. 볼륨을 참조하는 도커 컨테이너가 항상 있어야합니다. 이렇게하면 해당 데이터 볼륨 내용에 대한 액세스 용이성을 잃지 않고 wordpress 앱을 실행하는 도커 컨테이너를 삭제할 수 있습니다.

이러한 컨테이너를 데이터 볼륨 컨테이너 라고 합니다 .

컨테이너와 볼륨 데이터를 백업하는 간단한 방법이 있어야하지만 어디서나 찾을 수는 없습니다.

백업 도커 이미지

도커 이미지를 백업하려면 docker save 명령을 사용하여 나중에 docker load 명령 으로 새 docker 이미지를 만드는 데 사용할 수있는 tar 아카이브를 생성합니다 .

백업 도커 컨테이너

다른 방법으로 도커 컨테이너를 백업 할 수 있습니다

  • docker commit 명령을 사용하여 docker 컨테이너 현재 상태를 기반으로 새 docker 이미지를 커밋
  • docker export 명령을 사용하여 docker container 파일 시스템을 tar 아카이브로 내 보냅니다 . 나중에 docker import 명령을 사용하여 해당 tar 아카이브에서 새 docker 이미지를 만들 수 있습니다 .

이러한 명령은 docker container 계층 파일 시스템 만 백업합니다. 데이터 볼륨은 제외됩니다 .

백업 도커 데이터 볼륨

데이터 볼륨을 백업하려면 백업하려는 볼륨을 사용하고 tar 명령을 실행하여 도커 사용 설명서에 설명 된대로 볼륨 내용의 아카이브를 생성하는 새 컨테이너를 실행할 수 있습니다 .

특별한 경우 데이터 볼륨은 MySQL 서버의 데이터를 저장하는 데 사용됩니다. 따라서이 볼륨에 대한 tar 아카이브를 내보내려면 먼저 MySQL 서버를 중지해야합니다. 그렇게하려면 워드 프레스 컨테이너를 중지해야합니다.

MySQL 데이터 백업

다른 방법은 mysqldump 명령으로 데이터베이스 덤프를 생성하기 위해 MySQL 서버에 원격으로 연결하는 것 입니다. 그러나 이것이 작동하려면 MySQL 서버가 원격 연결을 허용하고 원격으로 연결할 수있는 사용자를 갖도록 구성되어야합니다. 사용중인 워드 프레스 도커 이미지의 경우에는 그렇지 않을 수 있습니다.


편집하다

Docker는 최근 Docker 볼륨 플러그인 을 도입 하여 볼륨 처리를 공급 업체가 구현 한 플러그인으로 위임 할 수 있습니다.

docker run명령에는 -v옵션에 대한 새로운 동작이 있습니다. 이제 볼륨 이름 을 전달할 수 있습니다. 이러한 방식으로 생성 된 볼륨은 이름지정 되고 나중에 참조하기 쉽기 때문에 매달려있는 볼륨 문제를 완화합니다 .

편집 2

Docker는 docker volume prune모든 매달려있는 볼륨을 쉽게 삭제 하는 명령을 도입했습니다 .


답변

업데이트 2

원시 단일 볼륨 백업 bash 스크립트 :

#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_NAME=$2

usage() {
  echo "Usage: $0 [container name] [volume name]"
  exit 1
}

if [ -z $CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

if [ -z $VOLUME_NAME ]
then
  echo "Error: missing volume name parameter."
  usage
fi

sudo docker run --rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME

원시 단일 볼륨 복원 bash 스크립트 :

#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1

usage() {
  echo "Usage: $0 [container name]"
  exit 1
}

if [ -z $NEW_CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

sudo docker run --rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar

사용법은 다음과 같습니다.

$ volume_backup.sh old_container /srv/www
$ sudo docker stop old_container && sudo docker rm old_container
$ sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container

가정 : 백업 파일 이름은 backup.tar이며 백업 및 복원 스크립트와 동일한 디렉토리에 있으며 볼륨 이름은 컨테이너간에 동일합니다.

최신 정보

컨테이너에서 볼륨을 백업하는 것은 데이터 컨테이너에서 볼륨을 백업하는 것과 다르지 않습니다.

볼륨은 컨테이너에 연결된 경로 일 뿐이므로 프로세스는 동일합니다.

docker-backup이 동일한 컨테이너 볼륨에서도 작동하는지 모르겠지만 다음을 사용할 수 있습니다.

sudo docker run --rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

과:

sudo docker run --rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar

업데이트 종료

도커 볼륨 컨테이너를 백업하고 복원 할 수있는 유용한 도구가 있습니다.

https://github.com/discordianfish/docker-backup

컨테이너가 다음과 같은 일부 컨테이너 볼륨에 연결된 경우 :

$ docker run --volumes-from=my-data-container --name my-server ...

다음과 같이 모든 볼륨을 백업 할 수 있습니다.

$ docker-backup store my-server-backup.tar my-server

다음과 같이 복원하십시오.

$ docker-backup restore my-server-backup.tar

또는 공식적인 방법을 따를 수 있습니다.

한 호스트에서 다른 호스트로 데이터 전용 볼륨을 포팅하는 방법은 무엇입니까?


답변

마운트 된 볼륨 만 백업 해야하는 경우 Dockerhost 에서 폴더를 복사 하면 됩니다.

참고 : Ubuntu를 사용하는 경우 Dockerhost 가 로컬 시스템입니다. 당신은에있는 경우 , Dockerhost는 가상 머신이다.

우분투에서

여기에서 볼륨이있는 모든 폴더를 찾을 수 있습니다. 원하는 위치에 /var/lib/docker/volumes/복사하여 보관할 수 있습니다.

MAC에서

우분투만큼 쉽지 않습니다. VM에서 파일을 복사해야합니다.

다음은 볼륨이있는 모든 폴더를 가상 시스템 (Docker 서버가 실행중인)에서 로컬 시스템으로 복사하는 방법에 대한 스크립트입니다. 우리는 docker-machine VM이 default 라고 가정합니다 .

docker-machine ssh default sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes

docker-machine ssh default sudo chmod -R 777 /home/docker/volumes

docker-machine scp -R default:/home/docker/volumes ./backup_volumes

docker-machine ssh default sudo rm -r /home/docker/volumes

현재 디렉토리에 ./backup_volumes 폴더를 만들고 모든 볼륨을이 폴더에 복사합니다.

다음은 로컬 디렉토리 ( ./backup_volumes )에서 Dockerhost 시스템으로 저장된 모든 볼륨을 복사하는 방법에 대한 스크립트 입니다.

docker-machine scp -r ./backup_volumes default:/home/docker

docker-machine ssh default sudo mv -f /home/docker/backup_volumes /home/docker/volumes

docker-machine ssh default sudo chmod -R 777 /home/docker/volumes

docker-machine ssh default sudo cp -v -R /home/docker/volumes /var/lib/docker/

docker-machine ssh default sudo rm -r /home/docker/volumes

이제 다음 방법으로 작동하는지 확인할 수 있습니다.

docker volume ls


답변

볼륨 이름이이라고 가정 해 봅시다 data_volume. 다음 명령을 사용하여 이름이 지정된 도커 이미지와 볼륨을 백업 및 복원 할 수 있습니다 data_image.

백업하기 위해:

docker run --rm --mount source=data_volume,destination=/data alpine tar -c -f- data | docker run -i --name data_container alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container

복원하려면

docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data alpine tar -x -f-


답변

나는 이것이 오래되었다는 것을 알고 있지만 데이터 컨테이너 (백업)를 docker hub로 푸시하는 잘 문서화 된 솔루션이 없다는 것을 알고 있습니다. 방금 https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub 에서 방법에 대한 간단한 예를 게시했습니다.

결론은 다음과 같습니다

도커 자습서에서는 데이터 볼륨을 로컬로 백업 및 복원 할 수 있다고 제안합니다. 우리는이 기술을 사용하고 몇 줄을 더 추가하여 원하는 위치로 쉽게 복원 할 수 있도록 도커 허브에 백업을 푸시합니다. 이제 시작하겠습니다. 다음 단계를 따르십시오.

data-container-to-backup이라는 데이터 컨테이너에서 데이터 볼륨을 백업하십시오.

docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup

이 tar 파일을 새 컨테이너로 확장하여 이미지의 일부로 커밋 할 수 있습니다.

docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"

원하는 태그 ($ VERSION)로 이미지를 커밋하고 푸시

docker commit data-backup repo/data-backup:$VERSION
docker push repo/data-backup:$VERSION

마지막으로 정리하자

docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)

이제 우리는 repo에 백업 파일과 폴더가있는 파일 시스템 인 data-backup이라는 이미지를 가지고 있습니다. 이 이미지 (일명 백업에서 복원)를 사용하려면 다음을 수행하십시오.

데이터 백업 이미지로 데이터 컨테이너를 실행하십시오.

run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}

데이터 conainter의 볼륨으로 whatEver 이미지를 실행하십시오.

docker run --volumes-from=data-container repo/whatEver

그게 다야.

이 작업에 대한 설명서가 없다는 것에 놀랐습니다. 누군가 도움이되기를 바랍니다. 나는 이것에 대해 생각하는 데 시간이 걸렸다는 것을 안다.


답변

프로젝트에서 docker-compose를 사용하는 경우 볼륨을 백업하고 복원하는 방법이 있습니다.

docker-compose.yml

기본적으로 docker-compose.yml 파일에 서비스를 추가 db-backup하고 db-restore볼륨 이름에 맞게 조정합니다. dbdata이 예에서는 제 볼륨의 이름이 지정 되었습니다.

version: "3"

services:
  db:
    image: percona:5.7
    volumes:
      - dbdata:/var/lib/mysql

  db-backup:
    image: alpine
    tty: false
    environment:
      - TARGET=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "tar -cjf /backup/$${TARGET}.tar.bz2 -C /volume ./"

  db-restore:
    image: alpine
    environment:
      - SOURCE=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/$${SOURCE}.tar.bz2"

부패를 피하십시오

데이터 일관성을 위해 백업 또는 복원하기 전에 DB 컨테이너를 중지하십시오.

docker-compose stop db

백업

기본 대상 ( backup/dbdata.tar.bz2) 으로 백업하려면

docker-compose run --rm db-backup

또는 대체 대상 이름을 지정하려면 다음을 수행하십시오.

docker-compose run --rm -e TARGET=mybackup db-backup

복원

에서 복원하려면 다음을 backup/dbdata.tar.bz2수행하십시오.

docker-compose run --rm db-restore

또는 다음을 사용하여 특정 파일에서 복원하십시오.

docker-compose run --rm -e SOURCE=mybackup db-restore

이 접근법을 만들기 위해 https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/의 명령을 조정했습니다 .


답변

다음 명령은 명명 된 모든 데이터 볼륨이 마운트 된 컨테이너에서 tar를 실행하고 출력을 파일로 리디렉션합니다.

docker run --rm `docker volume list -q | egrep -v '^.{64}$' | awk '{print "-v " $1 ":/mnt/" $1}'` alpine tar -C /mnt -cj . > data-volumes.tar.bz2

문제가 발생한 경우 결과 아카이브를 테스트하십시오.

tar -tjf data-volumes.tar.bz2