रिपॉजिटरी का उपयोग किए बिना एक होस्ट से दूसरे होस्ट में डॉकरों की छवियों को कैसे कॉपी करें


1372

मैं रिपॉजिटरी का उपयोग किए बिना एक मशीन से दूसरे में एक डॉकर छवि को कैसे स्थानांतरित करूं, कोई बात नहीं निजी या सार्वजनिक?

मैं VirtualBox में अपनी खुद की छवि बनाता हूं, और जब यह पूरा हो जाता है तो मैं वास्तविक उपयोग के लिए अन्य मशीनों को तैनात करने का प्रयास करता हूं।

चूंकि यह मेरी खुद की छवि (रेड हैट लिनक्स की तरह) पर आधारित है, इसलिए इसे डॉकरफाइल से दोबारा नहीं बनाया जा सकता है। मेरा dockerfile आसानी से पोर्टेबल नहीं है।

क्या मेरे द्वारा उपयोग किए जाने वाले सरल आदेश हैं? या दूसरा उपाय?

जवाबों:


2301

आपको डॉक की छवि को टार फाइल के रूप में सहेजना होगा:

docker save -o <path for generated tar file> <image name>

फिर अपनी छवि को एक नए सिस्टम में नियमित फाइल ट्रांसफर टूल जैसे कि cp, scpया rsync(बड़ी फ़ाइलों के लिए पसंदीदा) के साथ कॉपी करें । उसके बाद आपको इमेज को Docker में लोड करना होगा:

docker load -i <path to image tar file>

PS: आपको sudoसभी कमांड की आवश्यकता हो सकती है ।

संपादित करें: आपको उदाहरण के लिए -o के साथ फ़ाइल नाम (सिर्फ निर्देशिका नहीं) जोड़ना चाहिए:

docker save -o c:/myfile.tar centos:16

27
यह छवियों के लिए बेहतर उत्तर है ।
एंडी

26
इसके अलावा, repo:tagछवि संदर्भ के बजाय उपयोग करना बेहतर है image id। यदि आप उपयोग करते हैं image id, तो लोड की गई छवि टैग को बनाए नहीं रखेगी (और आपको छवि को टैग करने के लिए एक और कदम करना होगा)।
समझदार

1
मैंने नाम के बजाय छवि आईडी का उपयोग किया: टैग अब मैं यहां बैठा हूं, छवि लोड की है और REPOSITORY और TAG के लिए एक <none> है। नाम और टैग को वापस लाने का सही तरीका क्या है? @wisbucky
Ulfhetnar

3
टैग करने के लिए, पहले IMAGE ID का उपयोग करके पहचान करें docker images, फिर उपयोग करें docker tag DESIREDIMAGEID mycompany/myreponame। यदि आपकी छवि आईडी 591de551d6e4 है, तो आप छवि आईडी संक्षिप्त कर सकते हैं:docker tag 59 mycompany/myreponame
जूनियर मेहे


582

SSH के माध्यम से डॉक की छवि को स्थानांतरित करना, सामग्री को मक्खी पर छोड़ना:

docker save <image> | bzip2 | \
     ssh user@host 'bunzip2 | docker load'

pvहस्तांतरण कैसे हो रहा है, यह देखने के लिए पाइप के बीच में रखना भी एक अच्छा विचार है :

docker save <image> | bzip2 | pv | \
     ssh user@host 'bunzip2 | docker load'

(के बारे में अधिक जानकारी pv: होम पेज , मैन पेज )।


19
Docker- मशीन का उपयोग करते समय, आप docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) loadमशीन mach1 और mach2 के बीच छवियों को कॉपी करने के लिए कर सकते हैं ।
मटलेहमान

5
@manojisions eval $(docker-machine env dev)एक एकल docker होस्ट के साथ सामान्य संचार के लिए अच्छा है, लेकिन दो मशीनों के बीच प्रतिलिपि नहीं है, क्योंकि इसमें दो अलग-अलग docker होस्ट / docker मशीन शामिल हैं।
मैटेलमैन

14
उल्टा करने के लिए (स्थानीय के लिए दूरस्थ):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner

2
क्या ऐसा करने का कोई तरीका है जब doator को लक्ष्य मशीन पर sudo की आवश्यकता होती है? मैंने कोशिश की (संपीड़न के बिना) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load। "-T" स्विच के बिना, sudo शिकायत करता है sudo: क्षमा करें, आपके पास sudo चलाने के लिए एक tty होना चाहिए ; एक "-t" के साथ यह एक ही संदेश है क्योंकि ssh का कहना है कि स्यूडो-टर्मिनल आवंटित नहीं किया जाएगा क्योंकि स्टडिन एक टर्मिनल नहीं है। और अंत में, दो "-t" के साथ, मुझे अपने टर्मिनल पर टार फ़ाइल (यानी छवि) की सामग्री मिलती है। कोई विचार?
भूख

1
@JosefStark को मुझे "डिफॉल्ट्स: <टारगेट यूजरनेम>! आवश्यकता" जोड़ने की जरूरत थी, जब सूडो से "सॉरी" संदेश को रोकने के लिए सूडर्स फाइल को एडिट करना। मुझे नहीं पता कि इससे कितना फर्क पड़ता है, लेकिन मैंने उपयोगकर्ता @ होस्ट के बाद सब कुछ उद्धरणों में भी डाल दिया है (इसलिए "[...] | ssh उपयोगकर्ता @ मेजबान 'bunzip2 | sudo docker load'")।
VirtualWolf

99

किसी भी फ़ाइल पथ या साझा किए गए NFS स्थान पर छवि को सहेजने के लिए निम्न उदाहरण देखें।

कर छवि आईडी प्राप्त करें:

sudo docker images

मान लें कि आपके पास आईडी "मैट्रिक्स-डेटा" के साथ एक छवि है।

आईडी के साथ छवि सहेजें:

sudo docker save -o /home/matrix/matrix-data.tar matrix-data

पथ से छवि को किसी भी होस्ट पर कॉपी करें। अब अपने स्थानीय डॉकर इंस्टॉलेशन का उपयोग करके आयात करें:

sudo docker load -i <path to copied image file>

34

पहले डॉकटर छवि को ज़िप फ़ाइल में सहेजें:

docker save <docker image name> | gzip > <docker image name>.tar.gz

फिर निर्यात की गई छवि को नीचे कमांड का उपयोग करके डोकर पर लोड करें:

zcat <docker image name>.tar.gz | docker load

11
लोडिंग के लिए, docker load < my-image.tar.gzपर्याप्त है। छवि स्वचालित रूप से gzip, bzip2 और xz के लिए विघटित हो जाती है।
फ्लक्स

32

Daud

docker images

मेजबान पर छवियों की एक सूची देखने के लिए। मान लीजिए कि आपके पास awesomesauce नामक एक छवि है । अपने टर्मिनल में, cdउस डायरेक्टरी में जहाँ आप इमेज को एक्सपोर्ट करना चाहते हैं। अब चलाएं:

docker save awesomesauce:latest > awesomesauce.tar

एक थम्ब ड्राइव या जो कुछ भी करने के लिए टार फ़ाइल की प्रतिलिपि बनाएँ, और फिर इसे नए होस्ट कंप्यूटर पर कॉपी करें।

अब नए मेजबान से:

docker load < awesomesauce.tar

अब जाइए एक कॉफी और पढ़िए हैकर न्यूज ...


4
यहां ध्यान देने योग्य बात यह है कि यह केवल तभी काम करेगा जब सेव और लोड एक ही ओएस पर निष्पादित हो। का प्रयोग करें docker save [image] -o file.tarऔर docker load -i file.tarइस से बचने के लिए!
एंड्रियास फोर्सलोव

docker save [image] -o file.tarयह भी बेतहाशा तेज प्रतीत होता है
ti7

19

एक कंटेनर के फाइल सिस्टम के एक चपटा निर्यात के लिए, उपयोग करें;

docker export CONTAINER_ID > my_container.tar

cat my_container.tar | docker import -कहा छवि आयात करने के लिए उपयोग करें ।


9
cat my_container.tar | docker import - my_container:newअगर यह स्थानीय रूप से सीएमडी मदद के अनुसार आयात किया जाएगा
लैरी कै

7
यह एक छवि को तैनात करने की तुलना में एक चल रहे कंटेनर का बैकअप लेने के लिए अधिक है।
कौशा

15

डॉकटर-मशीन का उपयोग करते समय, आप मशीनों के बीच mach1और mach2साथ में छवियों को कॉपी कर सकते हैं :

docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load

और निश्चित रूप से आप भी pvएक संकेतक संकेतक प्राप्त करने के लिए बीच में छड़ी कर सकते हैं :

docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load

आप docker-machine configअपने वर्तमान डिफ़ॉल्ट डॉक-होस्ट का उपयोग करने के लिए एक उप-गोले को छोड़ सकते हैं ।

docker save <image> | docker $(docker-machine config <mach>) load

वर्तमान डॉकटर-होस्ट से छवि की प्रतिलिपि बनाने के लिए mach

या

docker $(docker-machine config <mach>) save <image> | docker load

machवर्तमान डॉकटर-होस्ट से कॉपी करने के लिए।


10

मुझे लगता है कि आपको बचाने की आवश्यकता है couchdb-cartridgeजिसमें 7ebc8510bc2c की छवि आईडी है:

stratos@Dev-PC:~$ docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
couchdb-cartridge                      latest              7ebc8510bc2c        17 hours ago        1.102 GB
192.168.57.30:5042/couchdb-cartridge   latest              7ebc8510bc2c        17 hours ago        1.102 GB
ubuntu                                 14.04               53bf7a53e890        3 days ago          221.3 MB

एक टैर फाइल में आर्काइवनेम इमेज को सेव करें। मैं /media/sf_docker_vm/छवि को बचाने के लिए उपयोग करूंगा ।

stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

उदाहरण के लिए अपने वातावरण में जो कुछ भी विधि काम करता है का उपयोग कर अपने नए डोकर उदाहरण के लिए archiveName.tar फाइल कॉपी, FTP, SCP, आदि

docker loadअपने नए डॉकर उदाहरण पर कमांड चलाएँ और छवि टार फ़ाइल का स्थान निर्दिष्ट करें।

stratos@Dev-PC:~$ docker load < /media/sf_docker_vm/archiveName.tar

अंत में, docker imagesयह जांचने के लिए कमांड चलाएँ कि इमेज अब उपलब्ध है।

stratos@Dev-PC:~$ docker images
REPOSITORY                             TAG        IMAGE ID         CREATED             VIRTUAL SIZE
couchdb-cartridge                      latest     7ebc8510bc2c     17 hours ago        1.102 GB
192.168.57.30:5042/couchdb-cartridge   latest     bc8510bc2c       17 hours ago        1.102 GB
ubuntu                                 14.04      4d2eab1c0b9a     3 days ago          221.3 MB

कृपया इस विस्तृत पोस्ट को देखें


10

अपने स्थानीय डॉकर इंस्टॉलेशन से छवियों को मिनिक्यूब वीएम में स्थानांतरित करने के लिए:

docker save <image> | (eval $(minikube docker-env) && docker load)

10

docker-push-ssh एक कमांड लाइन उपयोगिता है जो मैंने इस परिदृश्य के लिए बनाई है।

यह सर्वर पर एक अस्थायी निजी डॉकर रजिस्ट्री स्थापित करता है, आपकी लोकलहोस्ट से एक एसएसएच सुरंग स्थापित करता है, आपकी छवि को धक्का देता है, फिर खुद के बाद साफ करता है।

इस दृष्टिकोण का लाभ खत्म हो गया docker save (ज्यादातर उत्तर लिखने के समय इस पद्धति का उपयोग कर रहे हैं) यह है कि केवल नई परतें सर्वर पर धकेल दी जाती हैं, जिसके परिणामस्वरूप एक बहुत तेज अपलोड होता है।

डॉकटर जैसे मध्यवर्ती रजिस्ट्री का उपयोग करने वाले अक्सर अनुचित हैं, और बोझिल हैं।

https://github.com/brthor/docker-push-ssh

इंस्टॉल:

pip install docker-push-ssh

उदाहरण:

docker-push-ssh -i ~/my_ssh_key username@myserver.com my-docker-image

सबसे बड़ी चेतावनी यह है कि आपको अपने लोकलहोस्ट को डॉकर के insecure_registriesकॉन्फ़िगरेशन में मैन्युअल रूप से जोड़ना होगा । उपकरण को एक बार चलाएं और यह आपको एक सूचनात्मक त्रुटि देगा:

Error Pushing Image: Ensure localhost:5000 is added to your insecure registries.
More Details (OS X): /programming/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

मुझे मैक ओएस पर '--insecure-रजिस्ट्री' ध्वज कहां सेट करना चाहिए?


1
मैंने आपके उत्तर को यह स्पष्ट करने के लिए संपादित किया कि आप जिस उपयोगिता की सिफारिश कर रहे हैं वह आपके द्वारा बनाई गई थी। यह पृष्ठ देखें , विशेष रूप से: "अच्छे, प्रासंगिक उत्तर पोस्ट करें, और यदि कुछ (लेकिन सभी नहीं) आपके उत्पाद या उसके बारे में हो, तो यह ठीक है। हालांकि, आपको अपने उत्तरों में अपनी संबद्धता का खुलासा करना होगा।"
लुई

8

अन्य सभी उत्तर बहुत मददगार हैं। मैं बस एक ही समस्या से गुज़रा और एक आसान तरीका समझ पाया docker machine scp

डॉकर मशीन v0.3.0 के बाद से, स्केप को एक डॉकर मशीन से दूसरे में फाइल कॉपी करने के लिए पेश किया गया था। यह बहुत सुविधाजनक है अगर आप अपने स्थानीय कंप्यूटर से किसी दूरस्थ डॉकटर मशीन जैसे AWS EC2 या डिजिटल महासागर में किसी फ़ाइल की प्रतिलिपि बनाना चाहते हैं क्योंकि Docker Machine आपके लिए SSH क्रेडेंशियल्स का ध्यान रख रही है।

  1. आप का उपयोग कर छवियों को बचाने की docker saveतरह:

    docker save -o docker-images.tar app-web
    
  2. डॉक-मशीन एससीपी का उपयोग करके छवियों को कॉपी करें

    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    

मान लें कि आपकी रिमोट डॉकर मशीन है remote-machineऔर जिस निर्देशिका को आप चाहते हैं वह टार फाइल है /home/ubuntu

  1. डॉकर छवि लोड करें

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    

5
सिर्फ 'scp <source> <रिमोट>' ही क्यों?
तमस कलामान

3

मैं सभी छवियों को टैग के साथ स्थानांतरित करना चाहता हूं।

```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
``` 

स्पष्टीकरण:

पहले OUTसभी टैग मिलते हैं लेकिन नई लाइनों के साथ अलग हो जाते हैं। दूसरे OUTPUTको एक सरणी में सभी टैग मिलते हैं। तीसरा $(echo "${OUTPUT[*]}")एकल के लिए सभी टैग लगाता हैdocker save कमांड के ताकि सभी चित्र एक ही टार में हों।

इसके अतिरिक्त, यह gzip का उपयोग करके ज़िप किया जा सकता है। निशाने पर, दौड़ें:

tar xvf images.tar.gz -O | docker load

-Otarस्टड पर सामग्री डालने का विकल्प, जिसे पकड़ा जा सकता है docker load


2

आप उपयोग कर सकते हैं sshfs:

$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar

1

डॉकर को बचाने और कार्य को लोड करने के लिए स्क्रिप्ट (कोशिश और परीक्षण):

डॉकर सेव:

#!/bin/bash

#files will be saved in the dir 'Docker_images'
mkdir Docker_images
cd Docker_images
directory=`pwd`
c=0
#save the image names in 'list.txt'
doc= docker images | awk '{print $1}' > list.txt
printf "START \n"
input="$directory/list.txt"
#Check and create the image tar for the docker images
while IFS= read -r line
do
     one=`echo $line | awk '{print $1}'`
     two=`echo $line | awk '{print $1}' | cut -c 1-3`
     if [ "$one" != "<none>" ]; then
             c=$((c+1))
             printf "\n $one \n $two \n"
             docker save -o $two$c'.tar' $one
             printf "Docker image number $c successfully converted:   $two$c \n \n"
     fi
done < "$input"

डॉकर लोड:

#!/bin/bash

cd Docker_images/
directory=`pwd`
ls | grep tar > files.txt
c=0
printf "START \n"
input="$directory/files.txt"
while IFS= read -r line
do
     c=$((c+1))
     printf "$c) $line \n"
     docker load -i $line
     printf "$c) Successfully created the Docker image $line  \n \n"
done < "$input"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.