ฉันจะสำรองข้อมูล Docker-container ด้วย data-volume ได้อย่างไร


153

ฉันใช้ภาพนักเทียบท่านี้ word tutum / wordpress นี้เพื่อสาธิตเว็บไซต์ Wordpress เมื่อเร็ว ๆ นี้ฉันพบว่าภาพที่ใช้ไดรฟ์สำหรับข้อมูล MySQL

ดังนั้นปัญหาคือ: ถ้าฉันต้องการสำรองและกู้คืนคอนเทนเนอร์ฉันสามารถลองส่งรูปภาพจากนั้นจึงลบคอนเทนเนอร์และสร้างคอนเทนเนอร์ใหม่จากอิมเมจที่กำหนดไว้ แต่ถ้าฉันทำเช่นนั้นปริมาณจะถูกลบและข้อมูลทั้งหมดของฉันจะหายไป

ต้องมีวิธีง่ายๆในการสำรองข้อมูลคอนเทนเนอร์ของฉันรวมถึงข้อมูลปริมาณ แต่ฉันไม่สามารถค้นหาได้ทุกที่


ตรวจสอบสคริปต์นี้ผมเขียนที่สำรองทุกอย่างในโครงการนักเทียบท่ารวมทั้งชื่อและชื่อไดรฟ์, ภาพ, การตั้งค่า, บันทึก, ระบบแฟ้มรากภาชนะฐานข้อมูลและอื่น ๆ : docker-compose-backup.sh
Nick Sweeting

คำตอบ:


142

ถ้าฉันต้องการที่จะย้อนกลับภาชนะฉันสามารถพยายามที่จะกระทำภาพและจากนั้นลบภาชนะและสร้างภาชนะใหม่จากภาพมุ่งมั่น แต่ถ้าฉันทำเช่นนั้นปริมาณจะถูกลบและข้อมูลทั้งหมดของฉันจะหายไป

ตามที่อธิบายในคู่มือผู้ใช้นักเทียบท่าวอลุ่มข้อมูลมีไว้เพื่อเก็บข้อมูลภายนอกระบบไฟล์คอนเทนเนอร์ นอกจากนี้ยังช่วยให้การแบ่งปันข้อมูลระหว่างหลายคอนเทนเนอร์ง่ายขึ้น

ในขณะที่หางจะไม่ลบข้อมูลในปริมาณ (เว้นแต่คุณจะลบภาชนะที่เกี่ยวข้องกับdocker rm -v) ปริมาณที่ไม่ได้อ้างอิงจากภาชนะนักเทียบท่าใด ๆ จะเรียกว่าห้อยปริมาณ บรรดาปริมาณห้อยเป็นเรื่องยากที่จะกำจัดและยากที่จะเข้าถึง

ซึ่งหมายความว่าทันทีที่คอนเทนเนอร์สุดท้ายที่ใช้โวลุ่มถูกลบโวลุ่มข้อมูลจะกลายเป็นห้อยและเนื้อหาจะยากต่อการเข้าถึง

เพื่อป้องกันโวลุ่มที่ห้อยอยู่เคล็ดลับคือการสร้างคอนเทนเนอร์นักเทียบท่าเพิ่มเติมโดยใช้โวลุ่มข้อมูลที่คุณต้องการคงอยู่ เพื่อให้มีอย่างน้อยคอนเทนเนอร์นักเทียบท่าที่อ้างอิงระดับเสียง วิธีนี้คุณสามารถลบตัวเทียบท่าที่ใช้แอพ wordpress โดยไม่สูญเสียความสะดวกในการเข้าถึงเนื้อหาปริมาณข้อมูลนั้น

ตู้คอนเทนเนอร์ดังกล่าวเรียกว่าภาชนะบรรจุปริมาณข้อมูล

ต้องมีวิธีการง่ายๆในการสำรองข้อมูลคอนเทนเนอร์ของฉันรวมถึงข้อมูลปริมาณ แต่ฉันไม่สามารถค้นหาได้ทุกที่

ภาพนักเทียบท่าสำรอง

ในการสำรองอิมเมจสำหรับนักเทียบท่าใช้คำสั่งdocker saveที่จะสร้างไฟล์เก็บถาวร tar ที่สามารถใช้ในภายหลังเพื่อสร้างอิมเมจ docker ใหม่ด้วยคำสั่งdocker load

ภาชนะบรรจุนักเทียบท่าสำรอง

คุณสามารถสำรองคอนเทนเนอร์นักเทียบท่าด้วยวิธีที่ต่างกัน

  • โดยการยอมรับอิมเมจนักเทียบท่าใหม่ตามสถานะปัจจุบันของคอนเทนเนอร์นักเทียบท่าโดยใช้คำสั่งนักเทียบท่า
  • โดยการส่งออกระบบไฟล์คอนเทนเนอร์ docker เป็นไฟล์เก็บถาวร tar โดยใช้คำสั่งส่งออก docker คุณสามารถสร้างอิมเมจนักเทียบท่าใหม่ในภายหลังได้จากไฟล์เก็บถาวร tar นั้นด้วยคำสั่งนำเข้านักเทียบท่า

โปรดระวังว่าคำสั่งเหล่านั้นจะสำรองข้อมูลระบบไฟล์ที่เก็บเลเยอร์ของนักเทียบท่าเท่านั้น ไม่รวมนี้ไดรฟ์ข้อมูล

สำรองข้อมูลนักเทียบท่าปริมาณ

หากต้องการข้อมูลปริมาณสำรองที่คุณสามารถเรียกใช้ภาชนะใหม่โดยใช้ปริมาณตามที่คุณต้องการสำรองข้อมูลและดำเนินการคำสั่ง tar ในการผลิตที่เก็บของเนื้อหาปริมาณตามที่อธิบายไว้ในคู่มือผู้ใช้นักเทียบท่า

ในกรณีเฉพาะของคุณปริมาณข้อมูลที่ใช้ในการจัดเก็บข้อมูลสำหรับเซิร์ฟเวอร์ MySQL ดังนั้นหากคุณต้องการส่งออกไฟล์เก็บถาวร tar สำหรับหนังสือเล่มนี้คุณจะต้องหยุดเซิร์ฟเวอร์ MySQL ก่อน ในการทำเช่นนั้นคุณจะต้องหยุดคอนเทนเนอร์ wordpress

สำรองข้อมูล MySQL

อีกวิธีหนึ่งคือเชื่อมต่อกับเซิร์ฟเวอร์ MySQL จากระยะไกลเพื่อสร้างฐานข้อมูลด้วยคำสั่งmysqldump อย่างไรก็ตามเพื่อให้การทำงานเซิร์ฟเวอร์ MySQL ของคุณต้องได้รับการกำหนดค่าให้ยอมรับการเชื่อมต่อระยะไกลและมีผู้ใช้ที่ได้รับอนุญาตให้เชื่อมต่อจากระยะไกล กรณีนี้อาจไม่เกิดขึ้นกับรูปภาพ wordpress docker ที่คุณใช้


แก้ไข

นักเทียบท่าเพิ่งเปิดตัวปลั๊กอินโวลุ่มนักเทียบท่าซึ่งอนุญาตให้มอบหมายการจัดการโวลุ่มไปยังปลั๊กอินที่นำมาใช้โดยผู้ขาย

docker runคำสั่งมีพฤติกรรมใหม่สำหรับ-vตัวเลือก ตอนนี้มันเป็นไปได้ที่จะผ่านมันชื่อไดรฟ์ ปริมาตรที่สร้างในลักษณะนั้นจะถูกตั้งชื่อและอ้างอิงได้ง่ายในภายหลังช่วยบรรเทาปัญหาเกี่ยวกับปริมาณที่ห้อยอยู่

แก้ไข 2

นักเทียบท่าแนะนำdocker volume pruneคำสั่งเพื่อลบโวลุ่มที่ห้อยอยู่ทั้งหมดอย่างง่ายดาย


34
จริงๆแล้วฉันสนใจที่จะสร้างภาชนะที่ฉันสามารถเคลื่อนย้ายได้ง่ายขึ้นฉันไม่เข้าใจจุดของภาชนะที่ไม่สามารถเคลื่อนย้ายได้
pguardiario

ในกรณีนี้คุณควรดูเครื่องมือที่ช่วยจัดการปริมาณข้อมูล Docker ให้กับคุณเช่นFlocker
Thomasleveil

9
นักเทียบท่าไม่ได้ลบโวลุ่มข้อมูลโดยอัตโนมัติ Data volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it “garbage collect” volumes that are no longer referenced by a container. ดังนั้นข้อมูลเท่านั้นที่บรรจุเป็นมรดก
Andrii Zarubin

2
mysqldumpคุณไม่จำเป็นต้องเชื่อมต่อระยะไกลสำหรับ docker cpเพียงแค่เปลือกลงในภาชนะที่ถ่ายโอนข้อมูลและคัดลอกมันออกด้วย
jiggunjer

@AndriiZarubin ใหม่: data only container obsolete?ไม่เลย ที่เก็บข้อมูลเท่านั้นช่วยให้คุณมีที่เก็บภาชนะdocker exec data-container tar -czf snapshot.tgz /dataแล้วdocker cp data-container:snapshot.tgz ./snapshot.tgzและที่คล้ายกัน หากคุณต้องการให้คอนเทนเนอร์มีอายุการใช้งานนานให้สร้างคำสั่งอย่างที่tail -f /dev/nullไม่เคยมีมาก่อนโดยใช้ทรัพยากรขั้นต่ำ
Jesse Chisholm

32

อัพเดท 2

สคริปต์ทุบตีการสำรองข้อมูลแบบดิบเดียว:

#!/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

สคริปต์การทุบตีคืนค่าดิบแบบเล่มเดียว:

#!/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 ซึ่งอยู่ในไดเรกทอรีเดียวกันกับสคริปต์สำรองและกู้คืนชื่อวอลุ่มจะเหมือนกันระหว่างคอนเทนเนอร์

UPDATE

สำหรับฉันแล้วดูเหมือนว่าการสำรองปริมาณจากภาชนะบรรจุไม่แตกต่างจากปริมาณสำรองจากบรรจุข้อมูล

ปริมาณไม่มีอะไรอื่นนอกจากเส้นทางเชื่อมโยงไปยังภาชนะเพื่อให้กระบวนการเดียวกัน

ฉันไม่ทราบว่าการสำรองข้อมูลนักเทียบท่าทำงานได้กับไดรฟ์ข้อมูลคอนเทนเนอร์เดียวกันหรือไม่ แต่คุณสามารถใช้:

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

หรือคุณสามารถทำตามวิธีการอย่างเป็นทางการ:

วิธีการโอนย้ายไดรฟ์ข้อมูลอย่างเดียวจากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่ง


ไม่ไม่ใช่สถานการณ์ "--volumes-from" แต่จะมีการกำหนดวอลุ่มไว้ใน dockerfile ซึ่งเป็นสาเหตุที่ทำให้ข้อมูลไม่คงอยู่ ถ้าคุณดูที่ dockerfile เพื่อหา tutum / lampคุณจะเห็นว่าฉันหมายถึงอะไร
pguardiario

คำตอบที่ฉันให้ไปแล้วนั้นดีสำหรับปริมาณใด ๆ เพราะปริมาตรเป็นปริมาตรและภาชนะเป็นภาชนะไม่มีความแตกต่างถ้าคุณใช้ภาชนะเป็นภาชนะข้อมูลจากมุมมองปริมาณ
tommasop

ปริมาณที่กำหนดไว้ใน dockerfile ถูกทำลายเมื่อคอนเทนเนอร์ถูกทำลาย ดังนั้นจึงไม่มีวิธีรับข้อมูลนั้นกลับเมื่อคุณย้ายคอนเทนเนอร์
pguardiario

คุณต้องดึงข้อมูลออกมาก่อนที่จะเคลื่อนย้ายคอนเทนเนอร์จากนั้นเปิดใช้งานคอนเทนเนอร์อีกครั้งและนำข้อมูลกลับมา
tommasop

1
ฉันได้รับข้อผิดพลาด: unknown shorthand flag: 'r' in -rm.มันควรจะเป็น--rmอย่างไร (เทียบท่ารุ่น 18.09.5, สร้าง e8ff056)
KUGA

22

ถ้าคุณจะต้องสำรองข้อมูลไดรฟ์ที่ติดตั้งอยู่คุณก็สามารถคัดลอกโฟลเดอร์จากคุณDockerhost

หมายเหตุ: หากคุณอยู่ในอูบุนตู , Dockerhostเป็นเครื่องของคุณ ถ้าคุณอยู่ในMac , Dockerhostเป็นเครื่องเสมือนของคุณ

บน Ubuntu

คุณสามารถค้นหาโฟลเดอร์ทั้งหมดที่มีโวลุ่มได้ที่นี่: /var/lib/docker/volumes/ดังนั้นคุณสามารถคัดลอกและเก็บถาวรได้ทุกที่ที่คุณต้องการ

บน MAC

มันไม่ง่ายอย่างกับ Ubuntu คุณต้องคัดลอกไฟล์จาก VM

นี่คือสคริปต์ของวิธีการคัดลอกโฟลเดอร์ทั้งหมดที่มีไดรฟ์ข้อมูลจากเครื่องเสมือน (ที่เซิร์ฟเวอร์ Docker กำลังทำงาน) ไปยังเครื่องท้องถิ่นของคุณ เราคิดว่าคุณนักเทียบท่าเครื่อง VM ชื่อเริ่มต้น

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

เราจำเป็นต้องปิดคอนเทนเนอร์เพื่อทำการสำรองข้อมูลโฟลเดอร์นั้น/var/lib/docker/volumesภายใต้ Ubuntu หรือไม่?
onknows

2
ไม่จำเป็นคุณสามารถคัดลอกโฟลเดอร์นั้นได้ทุกเมื่อที่ต้องการ
Andrii Dvoiak

4
ในทางเทคนิคแล้วคุณสามารถทำได้ แต่คุณประสบปัญหาข้อมูลเสียหายเนื่องจากการคัดลอกนั้นไม่ใช่แบบอะตอมมิกและอาจมีการเขียนไปที่โวลุ่มพร้อมกันฉันควรหยุดคอนเทนเนอร์ก่อน
Alessandro S.

13

data_volumeสมมติว่าชื่อไดรฟ์ของคุณ คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสำรองและเรียกคืนโวลุ่มไปยังและจากอิมเมจ docker ที่มีชื่อว่า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-

นี่เป็นการสำรองข้อมูลตามเวลาจริงหรือไม่
คังแอนดรู

2
เนื่องจากสามารถติดตั้งไดรฟ์ข้อมูลเดียวกันบนตัวเชื่อมต่อหลายตัวได้ใช่นี่เป็นการสำรองข้อมูลตามเวลาจริง เช่น. ปริมาณการติดตั้งบนภาชนะ Mysql สามารถสำรอง (สมมติว่าไม่มีข้อมูลเสียหาย) แต่สำหรับบริการที่ต้องหยุดเพราะกลัวว่าข้อมูลจะเสียหายไม่เป็นแบบเรียลไทม์
Sahil Ahuja

9

ฉันรู้ว่ามันเก่า แต่ฉันรู้ว่ามันไม่มีทางออกที่ดีในการผลักดัน data container (เป็นแบ็คอัพ) ไปยัง huber dock ฉันเพิ่งเผยแพร่ตัวอย่างสั้น ๆ เกี่ยวกับวิธีการทำเช่นนั้น 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)

ตอนนี้เรามีรูปภาพชื่อ data-backup ใน repo ของเราซึ่งเป็นเพียงระบบไฟล์ที่มีไฟล์สำรองและโฟลเดอร์ ในการใช้ภาพนี้ (เรียกคืนจากการสำรองข้อมูล) เราดำเนินการดังต่อไปนี้:

เรียกใช้ data container ด้วยอิมเมจการสำรองข้อมูล

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

เรียกใช้ภาพ whatEver ของคุณด้วยโวลุ่มจาก data-conainter

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

แค่นั้นแหละ.

ฉันรู้สึกประหลาดใจที่ไม่มีเอกสารสำหรับการทำงานนี้ ฉันหวังว่าบางคนจะพบว่ามีประโยชน์ ฉันรู้ว่าฉันต้องใช้เวลาสักพักกว่าจะคิดเรื่องนี้


8

หากโครงการของคุณใช้นักเขียนที่เรียบเรียงนี่คือวิธีสำหรับการสำรองและกู้คืนโวลุ่มของคุณ

นักเทียบท่า-compose.yml

โดยทั่วไปคุณเพิ่มdb-backupและdb-restoreบริการไปยังไฟล์ docker-compose.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/เพื่อสร้างแนวทางนี้


5

คำสั่งต่อไปนี้จะเรียกใช้ 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

4

หากคุณต้องการสำรองข้อมูลอย่างง่ายไปยังที่เก็บถาวรคุณสามารถลองใช้ยูทิลิตี้ตัวน้อยของฉัน: 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เก็บไฟล์

Restore:

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-docker-named-volumes-350397b8e362


ฉันสร้างเครื่องมือที่คล้ายกันgithub.com/01e9/docker-backupมันสร้างคลังข้อมูลสำรองและเพิ่มไปยังไดเรกทอรีซิงค์ Resilio
Oleg

2

ผมได้สร้างเครื่องมือในการ Orchestrate และการเปิดตัวการสำรองข้อมูลและภาชนะบรรจุ MySQL เพียงแค่เรียกว่านักเทียบท่าสำรอง แม้จะมีภาพพร้อมต่อการใช้งานบนฮับนักเทียบท่า

มันเขียนเป็นภาษา Bash เป็นหลัก มันใช้duplicityสำหรับเอ็นจิ้นการสำรองข้อมูลจริง ขณะนี้คุณสามารถสำรองข้อมูลไปยัง FTP (S) และ Amazon S3

การกำหนดค่านั้นค่อนข้างง่าย: เขียนไฟล์กำหนดค่าใน YAML เพื่ออธิบายว่าต้องสำรองข้อมูลและที่ไหนและไปไหน!

สำหรับคอนเทนเนอร์ข้อมูลมันจะเมานต์โวลุ่มที่แชร์โดยคอนเทนเนอร์ของคุณโดยอัตโนมัติเพื่อสำรองและประมวลผล สำหรับคอนเทนเนอร์ของ mysql จะทำการเชื่อมโยงและดำเนินการ mysqldump ที่มาพร้อมกับคอนเทนเนอร์ของคุณและประมวลผลผลลัพธ์

ฉันเขียนเพราะฉันใช้ Docker-Cloud ซึ่งไม่ทันสมัยกับรุ่นล่าสุดของ docker-engine และเพราะฉันต้องการที่จะโอบกอดวิธี Docker โดยไม่รวมกระบวนการสำรองข้อมูลไว้ในคอนเทนเนอร์แอปพลิเคชันของฉัน


2

หากคุณต้องการสำรองข้อมูลทั้งหมดคุณจะต้องดำเนินการสองสามขั้นตอน:

  1. คอมมิทคอนเทนเนอร์กับรูปภาพ
  2. บันทึกภาพ
  3. สำรองข้อมูลปริมาณของภาชนะบรรจุโดยการสร้างไฟล์ tar ของจุดเชื่อมต่อของปริมาณในภาชนะ
  4. ทำซ้ำขั้นตอนที่ 1-3 สำหรับคอนเทนเนอร์ฐานข้อมูลเช่นกัน

โปรดทราบว่าการทำเพียงแค่นักเทียบท่ากระทำการของภาชนะที่มีต่อภาพไม่รวมถึงปริมาณที่แนบมากับภาชนะ (อ้างอิง: เอกสารประกอบการยอมรับ Docker )

" การดำเนินการส่งข้อมูลจะไม่รวมข้อมูลใด ๆ ที่มีอยู่ในไดรฟ์ข้อมูลที่ติดตั้งอยู่ภายในคอนเทนเนอร์ "


1

ถ้าคุณชอบป้อนตัวดำเนินการลับจากบรรทัดคำสั่งคุณจะรักเทคนิคการสำรองข้อมูลคอนเทนเนอร์ด้วยตนเองเหล่านี้ โปรดทราบว่ามีวิธีที่รวดเร็วและมีประสิทธิภาพมากขึ้นในการสำรองข้อมูลคอนเทนเนอร์ที่มีประสิทธิภาพ ฉันได้เขียนคำแนะนำไว้ที่นี่: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus

ขั้นตอนที่ 1: เพิ่ม Docker Host ให้กับ Cloud ใด ๆ ตามที่อธิบายไว้ในบทช่วยสอนบนเว็บไซต์สนับสนุน Morpheus คุณสามารถเพิ่มโฮสต์ Docker ให้กับคลาวด์ที่คุณเลือกในเวลาไม่กี่วินาที เริ่มต้นด้วยการเลือกโครงสร้างพื้นฐานบนแถบนำทางหลักของ Morpheus เลือกโฮสต์ที่ด้านบนของหน้าต่างโครงสร้างพื้นฐานและคลิกปุ่ม“ + โฮสต์โฮสต์” ที่ด้านบนขวา

ในการสำรองโฮสต์ Docker ไปยังคลาวด์ผ่าน Morpheus ให้นำทางไปยังหน้าจอโครงสร้างพื้นฐานและเปิดเมนู“ + โฮสต์โฮสต์”

เลือกประเภทโฮสต์คอนเทนเนอร์บนเมนูเลือกกลุ่มจากนั้นป้อนข้อมูลในห้าฟิลด์: ชื่อ, คำอธิบาย, การมองเห็น, เลือกคลาวด์และป้อนแท็ก (ตัวเลือก) คลิกถัดไปจากนั้นกำหนดค่าตัวเลือกโฮสต์โดยเลือกแผนบริการ โปรดทราบว่าฟิลด์จำนวนหน่วยความจำและ CPU จะปรากฏให้เห็นเฉพาะเมื่อแผนที่คุณเลือกเปิดใช้งานตัวเลือกที่กำหนดเอง

ที่นี่เป็นที่ที่คุณเพิ่มและปรับขนาดปริมาณตั้งขนาดหน่วยความจำและจำนวน CPU และเลือกเครือข่าย คุณยังสามารถกำหนดค่าชื่อผู้ใช้และรหัสผ่านระบบปฏิบัติการชื่อโดเมนและชื่อโฮสต์ซึ่งโดยค่าเริ่มต้นคือชื่อคอนเทนเนอร์ที่คุณป้อนก่อนหน้านี้ คลิกถัดไปจากนั้นเพิ่มเวิร์กโฟลว์การทำงานอัตโนมัติใด ๆ (ตัวเลือก) สุดท้ายตรวจสอบการตั้งค่าของคุณและคลิกเสร็จสิ้นเพื่อบันทึก

ขั้นตอนที่ 2: เพิ่มการรวม Docker Registry เข้ากับ Public หรือ Private Cloud Adam Hicks อธิบายในการสอน Morpheus อีกวิธีหนึ่งว่าการผสานรวมเข้ากับ Docker Registry ส่วนตัวนั้นง่ายเพียงใด (ไม่ต้องการการกำหนดค่าเพิ่มเติมเพื่อใช้ Morpheus เพื่อจัดเตรียมรูปภาพด้วยฮับสาธารณะของ Docker โดยใช้ Docker API สาธารณะ)

เลือกการรวมระบบภายใต้แท็บผู้ดูแลระบบของแถบการนำทางหลักจากนั้นเลือกปุ่ม“ + การรวมใหม่” ทางด้านขวาของหน้าจอ ในหน้าต่างการรวมที่ปรากฏขึ้นเลือก Docker Repository ในเมนูแบบเลื่อนลง Type ป้อนชื่อและเพิ่มปลายทาง API รีจิสตรีส่วนบุคคล ระบุชื่อผู้ใช้และรหัสผ่านสำหรับรีจิสทรีที่คุณใช้และคลิกปุ่มบันทึกการเปลี่ยนแปลง

รวม Docker Registry กับคลาวด์ส่วนตัวผ่านทางกล่องโต้ตอบ“ การรวมใหม่” ของ Morpheus

หากต้องการจัดเตรียมการรวมที่คุณเพิ่งสร้างขึ้นให้เลือกนักเทียบข้อมูลภายใต้พิมพ์ในกล่องโต้ตอบสร้างอินสแตนซ์เลือกรีจิสตรีในเมนูดร็อปดาวน์เมนูนักลงทะเบียนรีจิสทรีใต้แท็บกำหนดค่าแล้วดำเนินการจัดเตรียมตามที่คุณต้องการ

ขั้นตอนที่ 3: จัดการการสำรองข้อมูล เมื่อคุณเพิ่มโฮสต์ Docker และรวมรีจิสทรีแล้วการสำรองข้อมูลจะถูกกำหนดค่าและดำเนินการโดยอัตโนมัติสำหรับแต่ละอินสแตนซ์ที่คุณจัดเตรียม การสนับสนุน Morpheus จัดเตรียมคำแนะนำสำหรับการดูข้อมูลสำรองสร้างข้อมูลสำรองอินสแตนซ์และสร้างข้อมูลสำรองเซิร์ฟเวอร์


0

หากคุณมีกรณีง่าย ๆ เหมือนของฉันคุณสามารถทำสิ่งต่อไปนี้:

  1. สร้าง Dockerfile ที่ขยายอิมเมจพื้นฐานของคอนเทนเนอร์ของคุณ
  2. ฉันคิดว่าไดรฟ์ข้อมูลของคุณถูกแมปกับระบบไฟล์ของคุณดังนั้นคุณสามารถเพิ่มไฟล์ / โฟลเดอร์เหล่านั้นไปยังรูปภาพของคุณโดยใช้ ADD folder destination
  3. ทำ!

ตัวอย่างเช่นสมมติว่าคุณมีข้อมูลจากไดรฟ์ข้อมูลในไดเรกทอรีบ้านของคุณตัวอย่างเช่นที่/home/mydataคุณสามารถเรียกใช้ต่อไปนี้:

DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate

ที่ DOCKERFILE ของคุณชี้ไปที่ไฟล์เช่นนี้:

FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <example@gmail.com>

WORKDIR /opt/data
ADD mydata .

ส่วนที่เหลือของสิ่งที่ได้รับมาจากภาพฐาน ตอนนี้คุณสามารถผลักดันภาพนั้นไปยังนักเทียบท่าบนคลาวด์และผู้ใช้ของคุณจะมีข้อมูลที่สามารถใช้ได้โดยตรงบนคอนเทนเนอร์ของพวกเขา


อะไรคือจุดสำคัญในการใช้วอลลุ่มถ้าคุณเพิ่งอบมันเข้าไปในภาพในที่สุด
jiggunjer

@jiggunjer มีปริมาณช่วยให้คุณสามารถแทนที่ข้อมูลในภาชนะ
Danielo515

ฉันสามารถแทนที่ข้อมูลโดยไม่ต้องใช้โวลุ่มเช่นdocker cpกัน
jiggunjer

0

ปัญหา : คุณต้องการสำรองข้อมูลคอนเทนเนอร์ของคุณด้วยโวลุ่มข้อมูลในตัวเลือก แต่ตัวเลือกนี้ไม่ได้ออกนอกกรอบวิธีการไปข้างหน้าและไม่สำคัญจะคัดลอกเส้นทางวอลุ่มและสำรองอิมเมจของนักเทียบท่า 'โหลดใหม่และเชื่อมโยง ทั้งสองรวมกัน. แต่วิธีนี้ดูเหมือนจะเงอะงะและไม่ยั่งยืนและบำรุงรักษา - คุณจะต้องสร้างงาน cron ที่จะทำให้การไหลนี้ในแต่ละครั้ง

วิธีแก้ปัญหา : การใช้Dockup - อิมเมจ Docker เพื่อสำรองข้อมูลไดรฟ์ข้อมูลคอนเทนเนอร์ Docker ของคุณและอัปโหลดไปยัง s3 (Docker + Backup = dockup) dockup จะใช้ข้อมูลรับรอง AWS ของคุณเพื่อสร้างที่เก็บข้อมูลใหม่ที่มีชื่อตามตัวแปรสภาพแวดล้อมรับไดรฟ์ข้อมูลที่กำหนดค่าและจะถูก tarballed, gzipped, การประทับเวลาและอัปโหลดไปยัง S3 bucket

ขั้นตอน :

  1. กำหนดค่าdocker-compose.ymlและแนบenv.txtไฟล์การกำหนดค่าไปยังข้อมูลควรอัปโหลดไปยังที่ฝากข้อมูล s3 ที่ปลอดภัยโดยเฉพาะและพร้อมที่จะโหลดใหม่ในการดำเนินการ DRP เพื่อตรวจสอบเส้นทางของไดรฟ์ข้อมูลที่จะกำหนดค่าการเรียกใช้docker inspect <service-name>และค้นหาไดรฟ์ :

"เล่ม": {"/ etc / service-example": {}, "/ service-example": {}},

  1. แก้ไขเนื้อหาของไฟล์กำหนดค่า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
    
  2. เรียกใช้คอนเทนเนอร์ dockup

$ docker run --rm \
--env-file env.txt \
--volumes-from <service-name> \
--name dockup tutum/dockup:latest
  1. หลังจากนั้นตรวจสอบถัง s3 ของคุณมีข้อมูลที่เกี่ยวข้อง

-1

นี่เป็นวิธีสำรองข้อมูลในโวลุ่ม
หากคุณมีนักเทียบท่ารีจิสทรี infra วิธีนี้มีประโยชน์มาก
สิ่งนี้ใช้นักเทียบท่ารีจิสตรีเพื่อย้ายไฟล์ซิปได้อย่างง่ายดาย

#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"

เรียกใช้รูปภาพของคุณซึ่งใช้โฟลเดอร์เสียงนี้
คุณสามารถสร้างภาพที่มีทั้งไฟล์ภาพเดียวและไฟล์เสียงหนึ่งไฟล์ได้อย่างง่ายดาย
แต่ฉันไม่แนะนำด้วยเหตุผลต่าง ๆ (ขนาดภาพคำสั่งรายการ, .. )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.