도커 컨테이너를 데이터 볼륨으로 백업하려면 어떻게 해야 합니까?
저는 워드프레스 웹사이트를 시연하기 위해 이 도커 이미지 튜텀/워드프레스를 사용해 왔습니다.최근에 이미지가 MySQL 데이터에 볼륨을 사용한다는 것을 알게 되었습니다.
그래서 문제는 다음과 같습니다.컨테이너를 백업 및 복원하려는 경우 이미지를 커밋한 다음 나중에 컨테이너를 삭제하고 커밋된 이미지에서 새 컨테이너를 생성할 수 있습니다.하지만 그렇게 하면 볼륨이 삭제되고 데이터가 모두 사라집니다.
컨테이너와 볼륨 데이터를 백업할 수 있는 간단한 방법이 있을 텐데 찾을 수가 없습니다.
컨테이너를 되돌리려는 경우 이미지를 커밋한 다음 나중에 컨테이너를 삭제하고 커밋된 이미지에서 새 컨테이너를 생성할 수 있습니다.하지만 그렇게 하면 볼륨이 삭제되고 데이터가 모두 사라집니다.
도커 사용자 가이드에서 설명하는 것처럼 데이터 볼륨은 컨테이너 파일 시스템 외부에서 데이터를 유지합니다.이렇게 하면 여러 컨테이너 간에 데이터를 쉽게 공유할 수 있습니다.
볼륨의 한 Docker는 를 삭제하지 (Docker와 된 컨테이너를 한).docker rm -v
), 도커 컨테이너에서 참조하지 않는 볼륨을 dangling 볼륨이라고 합니다.이러한 대롱대롱한 볼륨은 제거하기도 어렵고 액세스하기도 어렵습니다.
즉, 볼륨을 사용하는 마지막 컨테이너가 삭제되는 즉시 데이터 볼륨이 늘어지고 컨텐츠에 액세스하기가 어려워집니다.
이러한 중단된 볼륨을 방지하기 위해 유지하려는 데이터 볼륨을 사용하여 추가적인 도커 컨테이너를 생성하여 볼륨을 참조하는 도커 컨테이너가 항상 적어도 있어야 합니다.이렇게 하면 해당 데이터 볼륨 콘텐츠에 대한 액세스 편의성을 잃지 않고 워드프레스 앱을 실행하는 도커 컨테이너를 삭제할 수 있습니다.
컨테이너와 볼륨 데이터를 백업할 수 있는 간단한 방법이 있을 텐데 어디에서도 찾을 수 없습니다.
도커 이미지 백업
도커 이미지를 백업하려면 나중에 도커 로드 명령을 사용하여 새 도커 이미지를 만드는 데 사용할 수 있는 tar 아카이브를 생성하는 도커 저장 명령을 사용합니다.
백업 도커 컨테이너
다른 방법으로 도커 컨테이너를 백업할 수 있습니다.
- 도커 커밋 명령을 사용하여 도커 컨테이너의 현재 상태를 기반으로 새 도커 이미지를 커밋합니다.
- docker export 명령을 사용하여 docker 컨테이너 파일 시스템을 tar 아카이브로 내보냅니다.나중에 docker import 명령을 사용하여 해당 tar 아카이브에서 새 도커 이미지를 생성할 수 있습니다.
이러한 명령은 도커 컨테이너 계층 파일 시스템만 백업합니다.여기에는 데이터 볼륨이 제외됩니다.
백업 도커 데이터 볼륨
데이터 볼륨을 백업하려면 백업할 볼륨을 사용하고 tar 명령을 실행하여 도커 사용자 안내서에 설명된 대로 볼륨 콘텐츠의 아카이브를 생성하는 새 컨테이너를 실행할 수 있습니다.
특정한 경우 데이터 볼륨은 MySQL 서버의 데이터를 저장하는 데 사용됩니다.따라서 이 볼륨에 대한 tar 보관 파일을 내보내려면 먼저 MySQL 서버를 중지해야 합니다.그렇게 하려면 프레스 컨테이너라는 단어를 중지해야 합니다.
MySQL 데이터 백업
또 다른 방법은 mysqldump 명령을 사용하여 MySQL 서버에 원격으로 연결하여 데이터베이스 덤프를 생성하는 것입니다.그러나 이것이 작동하려면 MySQL 서버가 원격 연결을 허용하도록 구성되어 있어야 하며 원격 연결이 허용되는 사용자도 있어야 합니다.사용 중인 프레스 도커 이미지는 그렇지 않을 수 있습니다.
편집
Docker는 최근 Docker 볼륨 플러그인을 도입하여 공급업체에서 구현한 플러그인에 볼륨 처리를 위임할 수 있습니다.
그docker run
명령에 옵션에 대한 새 동작이 있습니다.이제 볼륨 이름을 전달할 수 있습니다.이러한 방식으로 생성된 볼륨은 이름이 지정되고 나중에 참조하기 쉬우므로 볼륨에 대한 문제가 쉽게 해결됩니다.
편집 2
Docker는 매달린 모든 볼륨을 쉽게 삭제하는 명령을 도입했습니다.
업데이트 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_PATH=$2
usage() {
echo "Usage: $0 [container name] [volume path]"
exit 1
}
if [ -z $CONTAINER_NAME ]
then
echo "Error: missing container name parameter."
usage
fi
if [ -z $VOLUME_PATH ]
then
echo "Error: missing volume path parameter."
usage
fi
sudo docker run --rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_PATH
원시 단일 볼륨 복원 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이고, 백업 및 복원 스크립트와 동일한 디렉터리에 있으며, 볼륨 이름은 컨테이너 간에 동일합니다.
갱신하다
컨테이너에서 볼륨을 백업하는 것은 데이터 컨테이너에서 볼륨을 백업하는 것과 다르지 않습니다.
볼륨은 컨테이너에 연결된 경로에 불과하므로 프로세스는 동일합니다.
도커 백업이 동일한 컨테이너 볼륨에서도 작동하는지는 모르겠지만 다음을 사용할 수 있습니다.
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
또는 공식적인 방법을 따를 수 있습니다.
데이터 전용 볼륨을 한 호스트에서 다른 호스트로 포팅하는 방법은 무엇입니까?
프로젝트에서 도커 합성을 사용하는 경우 볼륨을 백업 및 복원하는 방법이 있습니다.
도커-docker.yml
으로 기적으추다니합을 합니다.db-backup
그리고.db-restore
도커-docker.yml 파일에 서비스를 제공하고 볼륨 이름에 맞게 조정합니다. 책의 은 내책이름은입니다.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/ 의 명령을 적용하여 이 접근 방식을 만들었습니다.
마운트된 볼륨만 백업해야 하는 경우 Docker 호스트에서 폴더를 복사하면 됩니다.
참고: Ubuntu에 있는 경우 Dockerhost가 로컬 컴퓨터입니다.Mac에 있는 경우 Dockerhost가 가상 시스템입니다.
Ubuntu에서
여기에서 수 ./var/lib/docker/volumes/
원하는 곳에 복사하고 보관할 수 있습니다.
MAC에서
Ubuntu처럼 쉽지는 않습니다.VM에서 파일을 복사해야 합니다.
다음은 볼륨이 있는 모든 폴더를 Docker 서버가 실행 중인 가상 시스템에서 로컬 시스템으로 복사하는 방법에 대한 스크립트입니다.도커 시스템 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)에서 Docker 호스트 시스템으로 저장된 모든 볼륨을 복사하는 방법에 대한 스크립트입니다.
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-
오래된 방법이라는 것은 알고 있지만, 데이터 컨테이너(백업)를 도커 허브로 밀어넣는 데는 제대로 문서화된 솔루션이 없다는 것을 알고 있습니다.저는 방금 https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub 에서 어떻게 그렇게 하는지에 대한 짧은 예를 발표했습니다.
결론은 다음과 같습니다.
도커 자습서에서는 데이터 볼륨을 로컬로 백업 및 복원할 수 있다고 제안합니다.이 기술을 사용하여 나중에 원하는 위치로 쉽게 복원할 수 있도록 도커 허브에 백업을 추가합니다.자, 이제 시작하겠습니다.다음 단계를 수행합니다.
데이터 컨테이너에서 백업으로 데이터 볼륨 백업
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}
데이터 컨테이너의 볼륨으로 what Ever 이미지 실행
docker run --volumes-from=data-container repo/whatEver
바로 그거야.
저는 이 작업에 대한 문서가 없다는 것에 놀랐습니다.누군가 이것이 도움이 되길 바랍니다.제가 이것에 대해 생각하는 데 시간이 좀 걸렸다는 것을 압니다.
다음 명령은 명명된 모든 데이터 볼륨이 마운트된 컨테이너에서 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
아카이브에 간단한 백업만 필요하다면, https://github.com/loomchild/volume-backup 의 작은 유틸리티를 사용해 볼 수 있습니다.
예
백업:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1
이 " 이이지볼보다니합관을"인 볼륨을 참조하십시오.some_volume
/tmp/archive1.tar.bz2
파일
복원:
docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1
이름이 지정된 볼륨을 지우고 복원합니다.some_volume
/tmp/archive1.tar.bz2
파일을 보관합니다.
추가 정보: https://medium.com/ @loomchild/backup-restore-domplier-name-domplier-350397b8e362
저는 데이터 및 mysql 컨테이너의 백업을 조정하고 시작하는 도구를 만들었습니다. 이를 도커 백업이라고 합니다.도커 허브에는 바로 사용할 수 있는 이미지도 있습니다.
그것은 주로 오케스트레이션이기 때문에 주로 바쉬어로 쓰여집니다.그것은 사용합니다.duplicity
실제백 수엔사 용 현재 및 Amazon 할 수 .현재 FTP(S) 및 Amazon S3에 백업할 수 있습니다.
구성은 매우 간단합니다. 백업할 항목과 위치를 설명하는 구성 파일을 YAML로 작성하면 됩니다!
데이터 컨테이너의 경우 컨테이너가 공유하는 볼륨을 자동으로 마운트하여 백업 및 처리합니다.mysql 컨테이너의 경우 연결하여 컨테이너와 함께 번들된 mysql 덤프를 실행하고 결과를 처리합니다.
최근 출시된 도커 엔진에 최신 버전이 아닌 도커-클라우드를 사용하고 애플리케이션 컨테이너에 백업 프로세스를 포함하지 않음으로써 도커 방식을 수용하기 위해 이 문서를 작성했습니다.
전체 백업을 수행하려면 몇 가지 단계를 수행해야 합니다.
- 컨테이너를 이미지에 커밋
- 이미지 저장
- 컨테이너에 볼륨 마운트 지점의 tar 파일을 만들어 컨테이너의 볼륨을 백업합니다.
- 데이터베이스 컨테이너에 대해서도 1-3단계를 반복합니다.
이미지에 대한 컨테이너의 도커 커밋만 수행하면 컨테이너에 연결된 볼륨은 포함되지 않습니다(참조: 도커 커밋 설명서).
"커밋 작업에는 컨테이너 내부에 마운트된 볼륨에 포함된 데이터가 포함되지 않습니다."
이미지를 사용하여 모든 볼륨을 백업할 수 있습니다.백업 및 복원을 지원하는 스크립트를 작성합니다.또한 모든 데이터를 로컬 디스크에 저장하기 위해 tar 파일 압축에 데이터를 저장합니다.이 스크립트를 사용하여 Postgres 및 Cassandra 볼륨 데이터베이스를 동일한 이미지에 저장합니다.예를 들어, 만약 우리가 Postgres에 대한 pg_data와 카산드라 데이터베이스에 대한 cassandra_data를 가지고 있다면, 우리는 다음 스크립트를 pg_data 인수와 카산드라에 대한 cassandra_data 인수로 두 번 호출할 수 있습니다.
백업 스크립트:
#! /bin/bash
GENERATE_IMAGE="data_image"
TEMPRORY_CONTAINER_NAME="data_container"
VOLUME_TO_BACKUP=${1}
RANDOM=$(head -200 /dev/urandom | cksum | cut -f1 -d " ")
if docker images | grep -q ${GENERATE_IMAGE}; then
docker run --rm --mount source=${VOLUME_TO_BACKUP},destination=/${VOLUME_TO_BACKUP} ${GENERATE_IMAGE} tar -c -f- ${VOLUME_TO_BACKUP} | docker run -i --name ${TEMPRORY_CONTAINER_NAME} ${GENERATE_IMAGE} tar -x -f-
else
docker run --rm --mount source=${VOLUME_TO_BACKUP},destination=/${VOLUME_TO_BACKUP} alpine tar -c -f- ${VOLUME_TO_BACKUP} | docker run -i --name ${TEMPRORY_CONTAINER_NAME} alpine tar -x -f-
fi
docker container commit ${TEMPRORY_CONTAINER_NAME} ${GENERATE_IMAGE}
docker rm ${TEMPRORY_CONTAINER_NAME}
if [ -f "$(pwd)/backup/${VOLUME_TO_BACKUP}.tar" ]; then
docker run --rm -v $(pwd)/backup:/backup ${GENERATE_IMAGE} tar cvf /backup/${VOLUME_TO_BACKUP}_${RANDOM}.tar /${VOLUME_TO_BACKUP}
else
docker run --rm -v $(pwd)/backup:/backup ${GENERATE_IMAGE} tar cvf /backup/${VOLUME_TO_BACKUP}.tar /${VOLUME_TO_BACKUP}
fi
예:
- ./백업.sh cassandra_data
- ./백업.shpg_data
스크립트 복원:
#! /bin/bash
GENERATE_IMAGE="data_image"
TEMPRORY_CONTAINER_NAME="data_container"
VOLUME_TO_RESTORE=${1}
docker run --rm ${GENERATE_IMAGE} tar -c -f- ${VOLUME_TO_RESTORE} | docker run -i --rm --mount source=${VOLUME_TO_RESTORE},destination=/${VOLUME_TO_RESTORE} alpine tar -x -f-
예:
- ./복원합니다.sh cassandra_data
- ./복원합니다.shpg_data
docker container run --rm --volumes-from your_db_container -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /your_named_volume
run
.
--rm
실행 컨테이너를 제거합니다.tar cvf /backup/backup.tar /dbdata
--volumes-from
볼륨을 합니다.your_named_volume
것입니다your_db_container
-v $(pwd):/backup
디렉터리합니다.$(pwd)
및 a ) 및a/backup
입니다.
tar cvf /backup/backup.tar /your_named_volume
파일을 .
원본: 볼륨 백업
문제:데이터 볼륨이 들어 있는 이미지 컨테이너를 백업하려는 경우 이 옵션은 즉시 백업할 수 없습니다. 볼륨 경로를 복사하고 도커 이미지를 백업하여 다시 로드한 후 둘 다 연결하는 간단한 방법입니다.그러나 이 솔루션은 서툴고 지속 가능하고 유지 가능하지 않은 것으로 보입니다. 매번 이러한 흐름을 만드는 cron 작업을 생성해야 합니다.
솔루션:Dockup - Docker 이미지를 사용하여 Docker 컨테이너 볼륨을 백업하고 s3(Docker + Backup = Dockup)에 업로드하면 Dockup은 AWS 자격 증명을 사용하여 환경 변수에 따라 이름이 지정된 새 버킷을 생성하고 구성된 볼륨을 가져오며 Tarballing, gzip, 타임 스탬프 및 S3 버킷에 업로드됩니다.
단계:
- 을 합니다.
docker-compose.yml
첨니다를 .env.txt
구성 파일, 데이터는 전용 보안 s3 버킷에 업로드되고 DRP 실행 시 다시 로드될 준비가 되어 있어야 합니다.실행할 구성 볼륨 경로를 확인하려면docker inspect <service-name>
볼륨을 찾습니다.
"볼륨": {"/etc/service-example": {}, "/service-example": {},
파일의 합니다.
env.txt
합니다.AWS_ACCESS_KEY_ID=<key_here> AWS_SECRET_ACCESS_KEY=<secret_here> AWS_DEFAULT_REGION=us-east-1 BACKUP_NAME=service-backup PATHS_TO_BACKUP=/etc/service-example /service-example S3_BUCKET_NAME=docker-backups.example.com RESTORE=false
도킹 컨테이너 실행
$ docker run --rm \ --env-file env.txt \ --volumes-from <service-name> \ --name dockup tutum/dockup:latest
- 그런 다음 s3 버킷에 관련 데이터가 포함되어 있는지 확인합니다.
이 Bash 스크립트를 사용하여 모든 볼륨을 백업했습니다.이 스크립트는 컨테이너 이름을 단일 인수로 사용하고 마운트된 모든 볼륨을 자동으로 찾습니다.
그런 다음 각 볼륨에 대해 하나의 tar 아카이브를 만듭니다.
#! /bin/bash
container=$1
dirname="backup-$container-$(date +"%FT%H%M%z")"
mkdir $dirname
cd $dirname
volume_paths=( $(docker inspect $container | jq '.[] | .Mounts[].Name, .Mounts[].Source') )
volume_count=$(( ${#volume_paths[@]} / 2 ))
for i in $(seq $volume_count); do
volume_name=${volume_paths[i-1]}
volume_name=$(echo $volume_name | tr -d '"')
volume_path=${volume_paths[(i-1)+volume_count]}
volume_path=$(echo $volume_path | tr -d '"')
echo "$volume_name : $volume_path"
# create an archive with volume name
tar -zcvf "$volume_name.tar" $volume_path
done
코드는 Github에서 사용할 수 있습니다.
저처럼 간단한 사례가 있다면 다음을 수행할 수 있습니다.
- 컨테이너의 기본 이미지를 확장하는 도커 파일 만들기
- 볼륨이 파일 시스템에 매핑되어 있으므로 다음을 사용하여 해당 파일/폴더를 이미지에 추가할 수 있습니다.
ADD folder destination
- 알았어!
들어 홈의 데이터가 하면, 를 들어 "" " " " " " " "에 있습니다./home/mydata
다음을 실행할 수 있습니다.
DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate
DOKERFILE이 다음과 같은 파일을 가리키는 위치:
FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <example@gmail.com>
WORKDIR /opt/data
ADD mydata .
나머지 항목은 기본 이미지에서 상속됩니다.이제 이미지를 도커 클라우드에 푸시할 수 있습니다. 그러면 사용자는 컨테이너에서 직접 데이터를 사용할 수 있습니다.
명령줄에서 난해한 연산자를 입력하는 것이 좋다면 이러한 수동 컨테이너 백업 기술이 좋습니다.컨테이너를 더 빠르고 효율적으로 백업할 수 있는 방법이 있습니다.여기에 지침을 작성했습니다. https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus
1단계: 모든 클라우드에 도커 호스트 추가 Morpheus 지원 사이트의 튜토리얼에서 설명한 대로 몇 초 만에 도커 호스트를 원하는 클라우드에 추가할 수 있습니다.먼저 기본 Morpheus 탐색 모음에서 Infrastructure(인프라)를 선택합니다.Infrastructure 창의 상단에서 Hosts를 선택하고 오른쪽 상단에 있는 "+Container Hosts" 버튼을 클릭합니다.
Morpheus를 통해 Docker 호스트를 클라우드에 백업하려면 Infrastructure 화면으로 이동하여 "+Container Hosts" 메뉴를 엽니다.
메뉴에서 컨테이너 호스트 유형을 선택하고 그룹을 선택한 다음 이름, 설명, 가시성, 클라우드 선택 및 태그 입력(옵션)의 5개 필드에 데이터를 입력합니다.다음을 클릭한 다음 서비스 계획을 선택하여 호스트 옵션을 구성합니다.볼륨, 메모리 및 CPU 수 필드는 선택한 계획에 사용자 지정 옵션이 사용하도록 설정된 경우에만 표시됩니다.
여기서 볼륨을 추가 및 크기 조정하고, 메모리 크기와 CPU 수를 설정하고, 네트워크를 선택할 수 있습니다.OS 사용자 이름과 암호, 도메인 이름 및 호스트 이름을 구성할 수도 있습니다. 기본적으로 이전에 입력한 컨테이너 이름입니다.다음을 누르고 자동화 워크플로우를 추가합니다(선택 사항).마지막으로 설정을 검토하고 완료를 클릭하여 저장합니다.
2단계: 공용 또는 개인 클라우드에 도커 레지스트리 통합 추가 Adam Hicks는 또 다른 Morpheus 자습서에서 개인 도커 레지스트리와 통합하는 방법을 설명합니다. (퍼블릭 도커 API를 사용하여 Morpheus를 사용하여 도커의 공용 허브로 이미지를 프로비저닝하는 데 추가 구성이 필요하지 않습니다.)
기본 탐색 모음의 관리 탭에서 통합을 선택한 다음 화면 오른쪽에 있는 "+새 통합" 버튼을 선택합니다.통합 창이 나타나면 유형 드롭다운 메뉴에서 도커 저장소를 선택하고 이름을 입력한 다음 개인 레지스트리 API 끝점을 추가합니다.사용 중인 레지스트리의 사용자 이름과 암호를 입력하고 변경 내용 저장 단추를 클릭합니다.
Morpheus "New Integration" 대화 상자를 통해 Docker 레지스트리를 프라이빗 클라우드와 통합합니다.
방금 생성한 통합을 프로비저닝하려면 [인스턴스 생성] 대화상자의 [유형]에서 [도커]를 선택하고 [구성] 탭의 [도커 레지스트리] 드롭다운 메뉴에서 레지스트리를 선택한 다음 다른 도커 컨테이너와 마찬가지로 프로비저닝을 계속합니다.
3단계: 백업 관리 Docker 호스트를 추가하고 레지스트리를 통합하면 프로비저닝한 각 인스턴스에 대해 백업이 자동으로 구성되고 수행됩니다.Morpheus 지원은 백업 보기, 인스턴스 백업 만들기 및 서버 백업 만들기에 대한 지침을 제공합니다.
저는 레스터틱을 사용하는 것을 제안합니다.로컬 파일 시스템, S3 호환 스토리지 서비스 또는 고정 REST 대상 서버와 같은 다양한 대상에 백업할 수 있는 간편한 백업 애플리케이션입니다.리스티커를 사용하면 cron 구문으로 예약할 수 있는 컨테이너가 이미 준비되어 있습니다. https://github.com/djmaze/resticker
레스틱과 그 사용법에 대해 더 알고 싶은 사람들을 위해, 저는 그 사용법에 대한 예를 포함한 그 주제에 대한 블로그 포스트 시리즈를 썼습니다: https://remo-hoeppli.medium.com/restic-backup-i-simple-and-beautiful-backups-bdbbc178669d
여기에 몇 가지 훌륭한 답이 있습니다.
이것이 제가 사용해 온 것입니다.그 질문이 오래된 것은 알지만 아마도 누군가에게 도움이 될 것입니다.
다음은 백업을 수행하는 명령입니다.
docker run --rm -v "$volume:/mnt/$volume" alpine $TAR_CMD > "$BACKUP_DIR/$timestamp-$volume.tar.bz2"
그러면 컨테이너에 /mnt로 마운트된 볼륨으로 알파인 이미지가 생성됩니다.컨테이너는 $TAR_CMD를 실행하여 stdout으로 출력하고 종료합니다.stdout은 tar.bz2 파일에 파이프로 연결됩니다.
아래의 bash 스크립트는 백업 디렉토리와 백업할 볼륨 이름(선택 사항)을 사용합니다.볼륨 이름이 제공되지 않으면 시스템이 아닌 모든 볼륨이 백업됩니다.
#!/bin/bash
# Get the backup directory as first argument
BACKUP_DIR="$1"
# Check if backup directory is provided
if [ -z "$BACKUP_DIR" ]; then
echo "Error: Please provide backup directory as first argument."
exit 1
fi
# Create the backup directory if it doesn't exist
if ! mkdir -p "$BACKUP_DIR"; then
echo "Error: Could not create backup directory."
exit 2
fi
# Command to create tar.bz2
TAR_CMD="tar -C /mnt -cj ."
# Get list of volumes to back up
if [ -z "$2" ]; then
# No volumes provided, back up all volumes
volumes=$(docker volume list -q | egrep -v '^.{64}$')
else
shift
volumes="$@"
fi
# Create one timestamp
timestamp=$(date +"%Y-%m-%d-%H-%M")
# Keep track of any errors that occur during backup process
ERRORS=()
# Create a backup for each volume
for volume in $volumes
do
# Create the backup file
verify_volume=$(docker volume inspect "$volume" 2>/dev/null | wc -l)
if [ "$verify_volume" -le 1 ]; then
echo "Error: volume $volume does not exist."
ERRORS+=("$volume")
elif ! docker run --rm -v "$volume:/mnt/$volume" alpine $TAR_CMD > "$BACKUP_DIR/$timestamp-$volume.tar.bz2"; then
echo "Error: Could not create backup for volume $volume."
ERRORS+=("$volume")
else
# Get the size of the backup file in human-readable format
size=$(du -h "$BACKUP_DIR/$timestamp-$volume.tar.bz2" | awk '{print $1}')
echo "Created backup for $volume: $size"
fi
done
# Check if any errors occurred and exit with non-zero status code if so
if [ ${#ERRORS} -ne 0 ]; then
echo "Errors occurred during backup process for volumes: ${ERRORS}"
exit 3
fi
이것은 볼륨 폴더 백업 방법입니다.
도커 레지스트리 인프라가 있는 경우 이 방법이 매우 유용합니다.
이렇게 하면 도커 레지스트리를 사용하여 zip 파일을 쉽게 이동할 수 있습니다.
#volume folder backup script. !/bin/bash
#common bash variables. set these variable before running scripts
REPO=harbor.otcysk.org:20443/levee
VFOLDER=/data/mariadb
TAG=mariadb1
#zip local folder for volume files
tar cvfz volume-backup.tar.gz $VFOLDER
#copy the zip file to volume-backup container.
#zip file must be in current folder.
docker run -d -v $(pwd):/temp --name volume-backup ubuntu \
bash -c "cd / && cp /temp/volume-backup.tar.gz ."
#commit for pushing into REPO
docker commit volume-backup $REPO/volume-backup:$TAG
#check gz files in this container
#docker run --rm -it --entrypoint bash --name check-volume-backup \
$REPO/volume-backup:$TAG
#push into REPO
docker push $REPO/volume-backup:$TAG
다른 서버에서
#pull the image in another server
docker pull $REPO/volume-backup:$TAG
#restore files in another server filesystem
docker run --rm -v $VFOLDER:$VFOLDER --name volume-backup $REPO/volume-backup:$TAG \
bash -c "cd / && tar xvfz volume-backup.tar.gz"
이 볼륨 폴더를 사용하여 이미지를 실행합니다.
하나의 실행 이미지와 하나의 볼륨 zip 파일을 모두 가진 이미지를 쉽게 만들 수 있습니다.
이유 크기,명령 등.
언급URL : https://stackoverflow.com/questions/26331651/how-can-i-backup-a-docker-container-with-its-data-volumes
'programing' 카테고리의 다른 글
이전에 Ajax 사용데이터를 수정하려면 전송 (0) | 2023.08.22 |
---|---|
jQuery .ajax() - POST 요청에 쿼리 매개 변수를 추가하시겠습니까? (0) | 2023.08.22 |
SQL에서 열 값의 발생 횟수를 효율적으로 계산하는 방법은 무엇입니까? (0) | 2023.08.22 |
스파이더 엔진에 의해 결과 행이 두 배로 증가합니다. (0) | 2023.08.22 |
VBA 클래스 모듈의 속성을 허용합니다. 여러 개의 인수를 가질 수 있습니까? (0) | 2023.08.17 |