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


121

ตามที่อธิบายไว้ในเอกสาร Docker เกี่ยวกับการทำงานกับไดรฟ์ข้อมูลมีแนวคิดของสิ่งที่เรียกว่าคอนเทนเนอร์ข้อมูลเท่านั้นซึ่งจัดเตรียมไดรฟ์ข้อมูลที่สามารถต่อเข้ากับคอนเทนเนอร์อื่น ๆ ได้ไม่ว่าคอนเทนเนอร์ข้อมูลอย่างเดียวจะทำงานจริงหรือไม่ก็ตาม

โดยทั่วไปสิ่งนี้ฟังดูน่ากลัว แต่มีสิ่งหนึ่งที่ฉันไม่เข้าใจ

ไดรฟ์ข้อมูลเหล่านี้ (ซึ่งไม่ได้แมปกับโฟลเดอร์บนโฮสต์อย่างชัดเจนด้วยเหตุผลด้านความสามารถในการพกพาเนื่องจากสถานะเอกสารประกอบ) ถูกสร้างและจัดการโดย Docker ในโฟลเดอร์ภายในบางโฟลเดอร์บนโฮสต์ ( /var/docker/volumes/…)

สมมติว่าฉันใช้โวลุ่มดังกล่าวแล้วฉันต้องย้ายจากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่ง - ฉันจะโอนโวลุ่มได้อย่างไร AFAICS มี ID เฉพาะ - ฉันสามารถไปและคัดลอกโวลุ่มและคอนเทนเนอร์ตามข้อมูลเท่านั้นไปยังโฮสต์ใหม่ได้หรือไม่ ฉันจะค้นหาไฟล์ที่จะคัดลอกได้อย่างไร หรือมีการสนับสนุนในตัวสำหรับ Docker ที่ฉันยังไม่ค้นพบหรือไม่?


12
คุณสามารถเอ็กซ์พอร์ตไดเร็กทอรีคอนเทนเนอร์ข้อมูล: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzสิ่งนี้ไม่ได้ขึ้นอยู่กับรายละเอียดการนำไปใช้งานของไดรฟ์ข้อมูล และนำเข้าข้อมูลด้วยน้ำมันดินบนเครื่องที่สอง.
Jiri

1
ว้าวสุดยอดมากขอบคุณ :-)))! หากคุณเขียนความคิดเห็นนี้เป็นคำตอบฉันยินดีรับฟัง!
Golo Roden

คำตอบ:


136

คำตอบอย่างเป็นทางการมีอยู่ในส่วน"สำรองคืนค่าหรือย้ายปริมาณข้อมูล" :

สำรอง:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: ถอดภาชนะออกเมื่อออก
  • --volumes-from DATA: แนบกับไดรฟ์ข้อมูลที่ใช้ร่วมกันโดยคอนเทนเนอร์ DATA
  • -v $(pwd):/backup: ผูกติดตั้งไดเร็กทอรีปัจจุบันลงในคอนเทนเนอร์ เพื่อเขียนไฟล์ tar เป็น
  • busybox: ภาพขนาดเล็กที่เรียบง่าย - เหมาะสำหรับการบำรุงรักษาอย่างรวดเร็ว
  • tar cvf /backup/backup.tar /data: สร้างไฟล์ tar ที่ไม่มีการบีบอัดของไฟล์ทั้งหมดในไดเร็กทอรี / data

เรียกคืน:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

3
ตอนนี้ควรใช้docker createสำหรับคอนเทนเนอร์ข้อมูลเท่านั้นจึงจะไม่เริ่มทำงาน ดูตัวอย่างในการปิด documentation: docs.docker.com/userguide/dockervolumes/…
FelikZ

1
ถ้าฉันพยายามสำรองฐานข้อมูล Postgres ฉันจะแทนที่/dataด้วย/var/lib/postgresql/dataอะไรถูกต้อง?
425nesp

6
ดูเหมือนว่าส่วน "สำรองข้อมูลคืนค่าหรือโยกย้ายปริมาณข้อมูล" จะถูกลบออกจากเอกสาร Docker :-(
SteveC

2
@Datz เป็นเพียงคำสั่งที่เรียกเพื่อสร้างที่เก็บข้อมูลซึ่งอาจเป็นคำสั่งใด ๆ ที่ไม่ได้ทำอะไรเลย คอนเทนเนอร์เริ่มต้นและออกทันที แต่จะใช้เพื่อคงอยู่ข้อมูล
tommasop

1
@rszalski หากด้วยเหตุผลบางประการคุณต้องให้คอนเทนเนอร์ทำงานต่อไป (พูดว่าคุณต้องการdocker execลงในนั้น) คำสั่งง่ายๆคือtail -f /dev/nullที่จะไม่มีวันออก แต่ใช้ทรัพยากรน้อยที่สุด เมื่อคุณไม่ต้องการให้มันทำงานอีกต่อไปdocker stop data-containerจะทำเพื่อคุณ ปริมาณยังคงอยู่สำหรับคอนเทนเนอร์อื่น ๆ
Jesse Chisholm

16

คุณสามารถส่งออกโวลุ่มไปยังน้ำมันดินและโอนไปยังเครื่องอื่นได้ และนำเข้าข้อมูลด้วยน้ำมันดินบนเครื่องที่สอง. สิ่งนี้ไม่ได้ขึ้นอยู่กับรายละเอียดการใช้งานของไดรฟ์ข้อมูล

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp

ขอบคุณสำหรับคำตอบ. ฉันจะย้ายที่เก็บข้อมูลจากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่งได้อย่างไร
Dzung Nguyen

1
@nXqd คอนเทนเนอร์ข้อมูลถูกสร้างขึ้นโดยdocker run -v /data-volume -name datacointainer busybox trueคุณสามารถเรียกใช้สิ่งนี้ได้ทุกที่ หลังจากสร้างที่เก็บข้อมูลแล้วคุณสามารถนำเข้าที่เก็บถาวร tar ได้ตามที่อธิบายไว้ในคำตอบ
Jiri

ขอบคุณสำหรับคำตอบ. แต่ฉันพบปัญหาอีกอย่างหนึ่งที่เราจำเป็นต้องลบคอนเทนเนอร์ซอมบี้ซึ่งใช้ในการสำรองข้อมูลในภายหลัง เนื่องจากไม่ส่งคืน id คุณมีวิธีใดที่ดี: D
Dzung Nguyen

@nXqd แน่นอน - คุณต้องใช้--cidfile=id.txtเป็นรันพารามิเตอร์ id.txtรหัสคอนเทนเนอร์จะถูกเก็บไว้ในแฟ้ม ฉันได้อัปเดตคำตอบแล้ว
Jiri

9
คุณสามารถใช้docker run --rmแทนdocker run --cidfile ... ; docker rm.
Felix Rabe

16

ขยายคำตอบอย่างเป็นทางการจากDocker docsและคำตอบยอดนิยมที่นี่คุณสามารถมีนามแฝงต่อไปนี้ใน. bashrc หรือ. zshrc ของคุณ

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

โปรดทราบว่าการสำรองข้อมูลจะถูกบันทึกลงใน/tmpดังนั้นคุณจึงสามารถย้ายไฟล์สำรองที่บันทึกไว้ระหว่างโฮสต์นักเทียบท่าได้

นอกจากนี้ยังมีนามแฝงสำรอง / กู้คืนสองคู่ หนึ่งโดยใช้การบีบอัดและเดเบียน: jessie และอื่น ๆ ที่ไม่มีการบีบอัด แต่มี busybox ชอบใช้การบีบอัดหากไฟล์ที่จะสำรองข้อมูลมีขนาดใหญ่


3

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

Cargoได้รับการพัฒนาเพื่อโยกย้ายตู้คอนเทนเนอร์จากโฮสต์หนึ่งไปยังอีกโฮสต์หนึ่งพร้อมกับข้อมูลโดยมีเวลาหยุดทำงานน้อยที่สุด Cargo ใช้ความสามารถในการรวมข้อมูลของระบบไฟล์แบบร่วมเพื่อสร้างมุมมองข้อมูลแบบรวม (ส่วนใหญ่เป็นระบบไฟล์รูท) ข้ามโฮสต์ต้นทางและปลายทาง สิ่งนี้ช่วยให้ Cargo สามารถเริ่มการทำงานของคอนเทนเนอร์ได้เกือบจะในทันที (ภายในมิลลิวินาที) บนโฮสต์เป้าหมายเนื่องจากข้อมูลจากระบบไฟล์รูทต้นทางจะถูกคัดลอกไปยังโฮสต์เป้าหมายไม่ว่าจะตามความต้องการ (โดยใช้พาร์ติชันcopy-on-write (COW) ) หรืออย่างเกียจคร้าน ในพื้นหลัง(ใช้ rsync)

ประเด็นสำคัญคือ - centralizedเซิร์ฟเวอร์จัดการกระบวนการย้ายข้อมูล

ลิงค์ไปยังโครงการมีให้ที่นี่:

https://github.com/nadgowdas/cargo

3

ในกรณีที่เครื่องของคุณอยู่ใน VPC ที่แตกต่างกันหรือคุณต้องการคัดลอกจาก / ไปยังเครื่องภายใน (เช่นในกรณีของฉัน) คุณสามารถใช้dvsync ที่ฉันสร้างขึ้น โดยทั่วไปแล้วngrokรวมกับrsyncSSH ที่บรรจุเป็นภาพขนาดเล็กสองภาพ (ทั้ง ~ 25MB) ขั้นแรกคุณเริ่มต้นdvsync-serverบนเครื่องที่คุณต้องการคัดลอกข้อมูล (คุณจะต้องใช้ข้อมูลNGROK_AUTHTOKENที่หาได้จากแดชบอร์ด ngrok ):

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

จากนั้นคุณสามารถเริ่มการทำงานdvsync-clientบนเครื่องที่คุณต้องการคัดลอกไฟล์โดยส่งผ่านDVSYNC_TOKENเซิร์ฟเวอร์ที่แสดง:

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client 

เมื่อเสร็จสิ้นการคัดลอกไคลเอนต์จะออก ซึ่งใช้ได้กับ Docker CLI, Compose, Swarm และ Kubernetes เช่นกัน

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