विभिन्न होस्ट के बीच डॉकटर कंटेनरों को कैसे स्थानांतरित करें?


98

मुझे एक होस्ट से दूसरे होस्ट में डॉकिंग कंटेनर को स्थानांतरित करने का तरीका नहीं मिल रहा है।

क्या कोई तरीका है जिससे मैं अपने कंटेनरों को रिपॉजिटरी में धकेल सकता हूँ जैसे हम छवियों के लिए करते हैं? वर्तमान में, मैं कंटेनरों के अंदर चल रहे एप्लिकेशन से जुड़े डेटा को संग्रहीत करने के लिए डेटा वॉल्यूम का उपयोग नहीं कर रहा हूं। इसलिए कुछ डेटा कंटेनर के अंदर रहते हैं, जिसे मैं सेटअप को फिर से डिज़ाइन करने से पहले जारी रखना चाहता हूं।



ध्यान दें कि आप निर्यात / आयात के बजाय सेव / लोड का उपयोग करना चाह सकते हैं, क्योंकि सेव मेटाडेटा और इतिहास को बचाता है।
बर्टाहॉलिक

यह @ aholt के जवाब के लिए एक टिप्पणी होनी चाहिए?
मार्टिन थॉम्पसन

docker saveछवियों को बचाने के लिए है, कंटेनर नहीं। docs.docker.com/engine/reference/commandline/save
stmllr

जवाबों:


57

आप एक होस्ट से दूसरे में एक रनिंग डॉकटर कंटेनर नहीं ले जा सकते।

आप अपने कंटेनर में छवि के साथ बदलाव कर सकते हैं docker commit, छवि को एक नए होस्ट पर ले जा सकते हैं, और उसके बाद एक नया कंटेनर शुरू कर सकते हैं docker run। यह आपके एप्लिकेशन द्वारा कंटेनर के अंदर बनाए गए किसी भी डेटा को संरक्षित करेगा।

Nb: यह उन डेटा को संरक्षित नहीं करता है जो वॉल्यूम के अंदर संग्रहीत है; आपको डेटा होस्ट को मैन्युअल रूप से नए होस्ट में ले जाने की आवश्यकता है।


@ लार्क्स कंटेनर को रोकने के लिए पहला कदम नहीं होगा, और फिर कमिट करें?
वल्ट्ट

@valentt दोनों संभव है, रनिंग और रुके हुए कंटेनर के लिए
crollywood

1
यह उत्तर वास्तव में आपके द्वारा उपयोग की जाने वाली आज्ञाओं की वास्तव में व्याख्या नहीं करता है, जो मेरे जैसे एक noob के लिए कठिन बनाता है
पॉल क्रूगर

यदि वे दोनों CRIU का समर्थन करते हैं, तो docker-checkpoint आपको मेजबानों के बीच एक "चल रहा" कंटेनर ले जाने में मदद कर सकता है।
dGRAMOP

2
1. कंटेनर बंद करो docker stop x; 2. उर परिवर्तन docker commit -p x x; 3. कंटेनर को बचाने के लिए छवि docker save -o x x; 4. x फ़ाइल को नए होस्ट पर ले जाएं और नए होस्ट में नई छवि लोड करें dokcer load -i x(यदि यू ने कंटेनर को -vविकल्प के साथ शुरू किया , तो आपको इन फ़ाइलों को नए होस्ट में भी ले जाना होगा); 5. इस इमेज को रन करेंdocker run (-v is required to mount these files if needed)
Lau Real

95

वैकल्पिक रूप से, यदि आप एक भंडार में धकेलना नहीं चाहते हैं:

  1. कंटेनर को तारकोल में निर्यात करें

    docker export <CONTAINER ID> > /home/export.tar
    
  2. अपने टारबॉल को नई मशीन पर ले जाएं

  3. इसे वापस आयात करें

    cat /home/export.tar | docker import - some-name:latest
    

8
इसके अलावा वॉल्यूम के अंदर संग्रहीत डेटा को संरक्षित नहीं करता है।
stmllr

1
यह कैसे काम करने वाला है? आयात के बाद मुझे नई छवि मिलती है, और फिर क्या? बस एक नया रन कमांड?
वेलेंटाइन

2
यह वास्तव में एक बहुत बुरा सुझाव है, खासकर डेटाबेस चलाने वाले कंटेनरों के लिए। मैंने इस सुझाव की कोशिश की और यह काम नहीं किया। पहले कंटेनर को रोकने के साथ यह काम कर सकता है?
वैलेंट

2
यह सुझाव केवल वास्तव में एक विकल्प के लिए था। यह आपकी स्थिति के लिए काम कर सकता है, यह नहीं हो सकता है। मेरे लिए, मैं उस समय डेटाबेस प्रतिकृति डॉकटर कंटेनरों की स्थापना कर रहा था, और निर्यात / आयात के लिए, डेटा को संरक्षित करने के बारे में परवाह नहीं करता था, क्योंकि मैं डेटाबेस डेटा का बैकअप नियमित रूप से एक अलग टारबॉल में चला रहा था। उसके लिए, यह पूरी तरह से काम करता है।
आहोल

32

आखिरकार बहुत भ्रमित करने वाले मैनुअल और भ्रमित करने वाले ट्यूटोरियल के बाद आखिरकार मेरे लिए क्या काम हुआ, क्योंकि डॉकर स्पष्ट रूप से मेरे लेखन के समय में फुलाया उम्मीदों की झलक है:

  1. संग्रह में docker छवि सहेजें:
    docker save image_name > image_name.tar
  2. दूसरी मशीन पर कॉपी करें
  3. उस अन्य डॉकटर मशीन पर, निम्नलिखित तरीके से डॉक लोड करें:
    cat image_name.tar | docker load

निर्यात और आयात, जैसा कि एक अन्य उत्तर में प्रस्तावित किया गया है, बंदरगाहों और चर का निर्यात नहीं करता है, जिसे चलाने के लिए आपके कंटेनर की आवश्यकता हो सकती है। और आप "कोई आदेश निर्दिष्ट नहीं" जैसे सामान के साथ समाप्त हो सकते हैं आदि ... जब आप इसे किसी अन्य मशीन पर लोड करने का प्रयास करते हैं।

इसलिए, सहेजें और निर्यात के बीच का अंतर यह है कि सेव कमांड पूरी छवि को इतिहास और मेटाडेटा से बचाता है, जबकि निर्यात कमांड केवल फ़ाइल संरचना (इतिहास या मेटाडेटा के बिना) निर्यात करता है।

यह कहने की आवश्यकता नहीं है कि, यदि आपके पास पहले से ही डॉकर्स हाइपर-विज़ोर पर लिए गए पोर्ट हैं, तो आप कुछ अन्य डॉकटर कंटेनर द्वारा आयात कर रहे हैं, तो आप संघर्ष में समाप्त हो जाएंगे, और आपको एक्सपोज़ किए गए पोर्ट्स को फिर से कॉन्फ़िगर करना होगा।


1
बेहद मददगार। "नो कमांड निर्दिष्ट" संदेश मुझे पागल कर रहा था।
रिंटौल

"नो कमांड निर्दिष्ट" संदेश मुझे भी पागल कर रहा था। मैं डॉकटर कमिट <कंटेनर-आईडी> स्टैकस्टॉर्म-लोकल: 2.9 का उपयोग करता हूं, और डॉक स्टैकस्टॉर्म-लोकल: 2.9 दूसरे होस्ट से खींचता हूं।
हुआ जांग

18

डॉकर प्रलेखन से:

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


क्लस्टर hq शटडाउन ... और BTW कंटेनर को स्थानांतरित करने के लिए कंटेनर को ZFS / किसी भी समर्थित स्टोरेज लून पर चलना चाहिए
asvignesh

6

इस स्क्रिप्ट का उपयोग करें: https://github.com/ricardobranco777/docker-volumes.sh

यह डेटा को वॉल्यूम में संरक्षित करता है।

उदाहरण का उपयोग:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar $USER@$HOST:

# On the other host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER

1
AWS लिनक्स (Centos) पर मेरे लिए काम नहीं किया। एंडी में मैंने वॉल्यूम टेक का पता लगाने के लिए डॉक इंस्पेक्ट का उपयोग करने का कम तकनीकी तरीका अपनाया, फिर उस ओवर को मैन्युअल रूप से कॉपी किया।
जेसनप्ल्यूटेक्स

@JasonPlutext SELinux से संबंधित शायद कुछ है? क्या आपके पास SELinux सक्षम है?
रिकार्डो ब्रांको

यह मिल गया: टार: प्रमुख नामों से अग्रणी `/ 'को
हटाने

@ हहजन यह एक विशिष्ट टार संदेश है। त्रुटि नहीं और चेतावनी भी नहीं।
रिकार्डो ब्रांको

1

मैंने इसके लिए कई उपाय आजमाए, और यह वही है जिसने मेरे लिए काम किया:

1. कंटेनर / सहेजें नई छवि के लिए कंटेनर:

  1. ++ प्रतिबद्ध कंटेनर:
    # डोकर रोक
    डोकर CONTAINER_NAME प्रतिबद्ध #
    IMAGE_NAME.tar IMAGE_NAME --output बचाने # डोकर: TAG


ps: "हमारे कंटेनर CONTAINER_NAME में '/ var / home' पर एक माउंटेड वॉल्यूम है (" आपको अपने कंटेनर का निरीक्षण उसके वॉल्यूम पथ को निर्दिष्ट करने के लिए करना होगा: # docker CONTAINER_NAME का निरीक्षण करें)

  1. ++ इसकी मात्रा को बचाएं: हम एक ubuntu छवि का उपयोग करने के लिए करेंगे।
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v $ {pwd} / backup: / backup ubuntu bash -c "cd / var / home && tar cvf /backup/volume_backup.tar।"

अब जब आप $ {pwd} / backup देखते हैं, तो आपको हमारी मात्रा टार प्रारूप के तहत मिल जाएगी।
अब तक, हमारे पास हमारे conatainer की छवि 'IMAGE_NAME.tar' और इसकी मात्रा 'volume_backup.tar' है।

अब आप नए होस्ट पर उसी पुराने कंटेनर को फिर से बना सकते हैं।

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