डेटा-केवल वॉल्यूम को एक होस्ट से दूसरे होस्ट में पोर्ट कैसे करें?


121

जैसा कि वॉल्यूम के साथ काम करने पर डॉकटर प्रलेखन में वर्णित है, तथाकथित डेटा-ओनली कंटेनरों की अवधारणा है , जो एक मात्रा प्रदान करते हैं जिसे कई अन्य कंटेनरों में रखा जा सकता है, भले ही डेटा-केवल कंटेनर वास्तव में चल रहा हो या नहीं।

असल में, यह बहुत अच्छा लगता है। लेकिन एक बात है जो मुझे समझ नहीं आ रही है।

ये वॉल्यूम (जो कि पोर्टेबिलिटी कारणों के लिए होस्ट पर एक फ़ोल्डर में स्पष्ट रूप से मैप नहीं करते हैं , जैसा कि प्रलेखन राज्यों में) होस्ट पर कुछ आंतरिक फ़ोल्डर में डॉकर द्वारा बनाए और प्रबंधित किए जाते हैं ( /var/docker/volumes/…)।

माना कि मैं इस तरह की मात्रा का उपयोग करता हूं, और फिर मुझे इसे एक होस्ट से दूसरे होस्ट में स्थानांतरित करने की आवश्यकता है - मैं वॉल्यूम कैसे पोर्ट करूं? AFAICS के पास एक विशिष्ट आईडी है - क्या मैं सिर्फ एक नए होस्ट में वॉल्यूम और उसके डेटा-केवल कंटेनर की प्रतिलिपि बनाकर जा सकता हूं? मुझे कैसे पता चलेगा कि किन फ़ाइलों को कॉपी करना है? या डॉकटर को कुछ समर्थन अंतर्निहित है जो मैंने अभी तक नहीं खोजा था?


12
आप डेटा कंटेनर निर्देशिका निर्यात कर सकते हैं: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzयह वॉल्यूम के कार्यान्वयन विवरण पर निर्भर नहीं करता है। और दूसरी मशीन पर टार के साथ डेटा आयात करें।
जिरी

1
वाह, यह बहुत बढ़िया है, धन्यवाद :-)))! यदि आप इस टिप्पणी को उत्तर के रूप में लिखते हैं, तो मैं इसे सहर्ष स्वीकार करूंगा!
गोलो रोडेन

जवाबों:


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: कंटेनर में वर्तमान निर्देशिका को बांधें; टार फाइल को लिखने के लिए
  • busybox: एक छोटी सरल छवि - त्वरित रखरखाव के लिए अच्छा है
  • tar cvf /backup/backup.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लिए डेटा-केवल कंटेनरों के लिए उपयोग करना बेहतर है, इसलिए उन्हें शुरू नहीं किया जाएगा। बंद में उदाहरण देखें। प्रलेखन: docs.docker.com/userguide/dockervolumes/…
फेलिकजेड

1
तो ... मैं बैकअप के लिए एक Postgres डेटाबेस कोशिश कर रहा हूँ, तो मैं क्या जगह लेंगे /dataसाथ /var/lib/postgresql/data, सही है?
425nesp

6
"बैकअप, पुनर्स्थापना, या डेटा वॉल्यूम को माइग्रेट करें" अनुभाग
डॉक

2
@Datz यह केवल एक कमांड है जिसे डेटा कंटेनर बनाने के लिए कहा जाता है यह कोई भी कमांड हो सकता है जो वास्तव में कुछ भी नहीं करता है। कंटेनर शुरू होता है और तुरंत बाहर निकल जाता है लेकिन इसका उपयोग डेटा को बनाए रखने के लिए किया जाता है।
तोमासोप

1
@rszalski यदि किसी कारण से, आपको कंटेनर को चालू रखने की आवश्यकता है (कहते हैं, आप docker execइसे करना चाहते हैं ), तो एक सरल कमांड है tail -f /dev/nullजो कभी भी बाहर नहीं निकलेगा, लेकिन न्यूनतम संसाधनों का उपयोग करता है। जब आपको अब इसे चलाने की आवश्यकता नहीं होती है, docker stop data-containerतो आपके लिए यह करना होगा। अन्य कंटेनरों के लिए वॉल्यूम बना रहता है।
जेसी चिशोल्म

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

आपके उत्तर के लिए धन्यवाद। मैं डेटा कंटेनर को एक होस्ट से दूसरे होस्ट में कैसे स्थानांतरित कर सकता हूं?
दजंग गुयेन

1
@nXqd डेटा कंटेनर द्वारा बनाया गया है docker run -v /data-volume -name datacointainer busybox true- आप इसे कहीं भी चला सकते हैं। जब आप डेटा कंटेनर बनाते हैं, तो आप उत्तर में बताए अनुसार टार संग्रह को आयात कर सकते हैं।
गिरि

आपके उत्तर के लिए धन्यवाद। लेकिन मुझे एक और समस्या आई कि हमें ज़ोंबी कंटेनर को हटाने की आवश्यकता है जो बाद में बैकअप के लिए उपयोग किया जाता है। चूंकि यह आईडी वापस नहीं करता है। क्या आपके पास कोई अच्छा तरीका है: D
Dzung Nguyen

@nXqd ज़रूर - आपको --cidfile=id.txtरन पैरामीटर के रूप में उपयोग करना होगा। कंटेनर आईडी फ़ाइल में संग्रहीत किया जाएगा id.txt। मैंने जवाब अपडेट कर दिया है।
जिरी

9
आप docker run --rmइसके बजाय बस का उपयोग कर सकते हैं docker run --cidfile ... ; docker rm
फेलिक्स राबे

16

डॉकर डॉक्स से आधिकारिक उत्तर और यहां शीर्ष उत्तर का विस्तार करते हुए , आप अपने .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 , इसलिए आप डॉक मेजबानों के बीच सहेजे गए बैकअप फ़ाइल को स्थानांतरित कर सकते हैं।

वहाँ भी दो जोड़े बैकअप / पुनर्स्थापना उपनाम हैं। संपीड़न और डेबियन का उपयोग करना: जेसी और अन्य बिना किसी संपीड़न के लेकिन व्यस्त बॉक्स के साथ। यदि फ़ाइलों का बैकअप बड़ा है, तो संपीड़न का उपयोग करना अनुकूल है।


3

मैं आईबीएम से यहां एक और हालिया टूल जोड़ूंगा जो वास्तव में एक कंटेनर होस्ट से दूसरे में वॉल्यूम माइग्रेशन के लिए बना है। यह वर्तमान में एक चालू परियोजना है। तो, आपको भविष्य में अतिरिक्त सुविधाओं के साथ एक अलग संस्करण मिल सकता है।

कार्गो को न्यूनतम डाउनटाइम के साथ अपने डेटा के साथ एक मेजबान से दूसरे होस्ट में कंटेनरों को स्थानांतरित करने के लिए विकसित किया गया था। कार्गो स्रोत और लक्ष्य मेजबानों पर डेटा (मुख्य रूप से रूट फ़ाइल सिस्टम) के एकीकृत दृश्य बनाने के लिए यूनियन फाइल सिस्टम की डेटा फेडरेशन क्षमताओं का उपयोग करता है। यह कार्गो को लक्ष्य होस्ट पर लगभग तुरंत (मिलीसेकंड के भीतर) एक कंटेनर शुरू करने की अनुमति देता है क्योंकि स्रोत रूट फाइल सिस्टम से डेटा को मेजबानों को ऑन-डिमांड ( कॉपी-ऑन-राइट (COW) विभाजन का उपयोग करके ) या आलसी के रूप में कॉपी किया जाता है। पृष्ठभूमि में (rsync का उपयोग करके)

महत्वपूर्ण बिंदु हैं: - ए centralized सर्वर माइग्रेशन प्रक्रिया को संभालता है

परियोजना का लिंक यहां दिया गया है:

https://github.com/nadgowdas/cargo

3

यदि आपकी मशीनें अलग-अलग VPC में हैं या आप / से स्थानीय मशीन में कॉपी करना चाहते हैं (जैसे कि मेरे मामले में) तो आप मेरे द्वारा बनाए गए dvsync का उपयोग कर सकते हैं । यह मूल रूप से दो छोटे (दोनों ~ 25 एमबीrsync ) चित्रों में पैक एसएसएच से अधिक के साथ संयुक्त है । सबसे पहले, आप उस 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 

एक बार कॉपी करने के बाद, क्लाइंट बाहर निकल जाएगा। यह डॉकर सीएलआई, कम्पोज़, स्वार्म और कुबेरनेट्स के साथ भी काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.