Docker görüntüleri havuz kullanmadan bir ana bilgisayardan diğerine nasıl kopyalanır


1374

Özel veya herkese açık olursa olsun, bir Docker görüntüsünü depo kullanmadan bir makineden diğerine nasıl aktarabilirim?

VirtualBox'ta kendi resmimi oluşturuyorum ve bittiğinde gerçek kullanıma sahip olmak için diğer makinelere dağıtmaya çalışıyorum.

Kendi temel imajıma (Red Hat Linux gibi) dayandığından, bir Dockerfile dosyasından yeniden oluşturulamaz. Dockerfile dosyam kolayca taşınabilir değil.

Kullanabileceğim basit komutlar var mı? Yoksa başka bir çözüm mü?

Yanıtlar:


2307

Docker görüntüsünü tar dosyası olarak kaydetmeniz gerekir:

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

Ardından cp, scpveya gibi rsyncbüyük dosya aktarma araçlarıyla görüntünüzü yeni bir sisteme kopyalayın (büyük dosyalar için tercih edilir). Bundan sonra görüntüyü Docker'a yüklemeniz gerekecek:

docker load -i <path to image tar file>

Not: sudoTüm komutlara ihtiyacınız olabilir .

EDIT: -o ile dosya adı (yalnızca dizin değil) eklemeniz gerekir, örneğin:

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

27
Bu görüntüler için daha iyi bir yanıttır .
Andy

26
ayrıca, repo:taggörüntü referansı olarak kullanmak daha iyidir image id. Kullanırsanız image id, yüklenen resim etiketi tutmaz (ve resmi etiketlemek için başka bir adım atmanız gerekir).
wisbucky

1
İsim yerine resim kimliğini kullandım: tag Şimdi burada oturuyorum, resmi yükledim ve REPOSITORY ve TAG için bir <none> var. Adı ve etiketi geri getirmenin doğru yolu nedir? @wisbucky
Ulfhetnar

3
Etiketlemek için önce IMAGE ID'yi kullanarak kimlik verin docker images, ardından kullanın docker tag DESIREDIMAGEID mycompany/myreponame. Resim kimliğiniz 591de551d6e4 ise, resim kimliğini kısaltabilirsiniz:docker tag 59 mycompany/myreponame
Junior Mayhé


582

Docker görüntüsünü SSH aracılığıyla aktarma, içeriği anında açma:

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

pvAktarımın nasıl gittiğini görmek için borunun ortasına koymak da iyi bir fikirdir :

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

(Hakkında daha fazla bilgi pv: ana sayfa , man sayfası ).


19
Liman işçisi makinesini kullanırken, mach1 ve mach2docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) load makineleri arasında görüntü kopyalayabilirsiniz .
matlehmann

5
@manojlds eval $(docker-machine env dev), tek bir docker ana makinesi ile genel iletişim için iyidir, ancak iki farklı docker ana makinesi / docker makinesini içerdiğinden, iki makine arasında kopyalama yapmaz.
matlehmann

14
bunun tersini yapmak için ( ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
uzakdan

2
Docker hedef makinede sudo gerektirdiğinde bunu yapmanın bir yolu var mı? Denedim (sıkıştırma olmadan) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. "-T" anahtarı olmadan, sudo sudo'dan şikayet eder : üzgünüm, sudo'yu çalıştırmak için bir tty'ye sahip olmalısınız ; bir "-t" ile aynı mesajdır, çünkü ssh, stdin bir terminal olmadığı için Pseudo-terminal'in ayrılmayacağını söylüyor . ve son olarak, iki "-t" ile, terminal dosyasında tar dosyasının (yani görüntü) içeriğini alıyorum. Herhangi bir fikir?
açlık

1
@JosefStark "Üzgünüm" iletisini sudo'dan durdurmak için sudoers dosyasını düzenlerken "Defaults: <target username>! Requiretty" eklemem gerekiyordu. Ne kadar bir fark olduğunu bilmiyorum ama aynı zamanda kullanıcı @ host sonra tırnak içinde her şeyi koymak (yani "[...] | ssh user @ host 'bunzip2 | sudo docker yük'").
VirtualWolf

99

Bir görüntüyü herhangi bir dosya yoluna veya paylaşılan NFS yerine kaydetmek için aşağıdaki örneğe bakın.

Yaparak resim kimliğini alın:

sudo docker images

"Matrix-data" kimliğine sahip bir resminiz olduğunu varsayalım.

Görüntüyü kimliğiyle kaydedin:

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

Görüntüyü yoldan herhangi bir ana bilgisayara kopyalayın. Şimdi aşağıdakileri kullanarak yerel Docker kurulumunuza aktarın:

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

34

Önce Docker görüntüsünü bir zip dosyasına kaydedin:

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

Ardından, aşağıdaki komutu kullanarak dışa aktarılan görüntüyü Docker'a yükleyin:

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

11
Yükleme docker load < my-image.tar.gziçin yeterlidir. Görüntü gzip, bzip2 ve xz için otomatik olarak açılır.
Flux

32

Çalıştırmak

docker images

ana bilgisayardaki görüntülerin listesini görmek için. Diyelim ki awesomesauce adlı bir resminiz var . Terminalinizde, cdgörüntüyü dışa aktarmak istediğiniz dizine. Şimdi çalıştırın:

docker save awesomesauce:latest > awesomesauce.tar

Katran dosyasını bir parmak sürücüye veya başka bir sürücüye kopyalayın ve ardından yeni ana bilgisayara kopyalayın.

Şimdi yeni ev sahibinden:

docker load < awesomesauce.tar

Şimdi bir kahve içip Hacker News'i okuyun ...


4
Burada belirtmek gerekir ki bu sadece kaydet ve yük aynı işletim sisteminde yürütüldüğünde çalışır. Bundan kaçınmak için docker save [image] -o file.tarve tuşlarını kullanın docker load -i file.tar!
Andreas Forslöw

docker save [image] -o file.tarAyrıca çılgınca daha hızlı görünüyor
ti7

19

Bir kabın dosya sisteminin düzleştirilmiş bir dışa aktarımı için;

docker export CONTAINER_ID > my_container.tar

cat my_container.tar | docker import -Söz konusu resmi içe aktarmak için kullanın .


9
o olacaktır cat my_container.tar | docker import - my_container:newithalat yerel yardım cmd göre eğer
Larry Cai

7
Bu, çalışan bir kapsayıcıyı yedeklemek için bir görüntüyü dağıtmaktan daha fazlasıdır.
Kousha

15

Liman işçisi makinesini kullanırken, makineler arasında mach1ve aşağıdakilerle görüntü kopyalayabilirsiniz mach2:

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

Ve elbette pvbir ilerleme göstergesi almak için ortaya yapışabilirsiniz:

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

docker-machine configGeçerli varsayılan docker-host'unuzu kullanmak için alt kabuklardan birini de atlayabilirsiniz .

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

mevcut docker ana bilgisayarından resmi kopyalamak için mach

veya

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

machmevcut docker ana bilgisayarına kopyalamak için.


10

couchdb-cartridge7ebc8510bc2c resim kimliğine sahip kaydetmeniz gerektiğini varsayalım :

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

ArchiveName görüntüsünü bir tar dosyasına kaydedin. Ben /media/sf_docker_vm/görüntüyü kaydetmek için kullanacağım .

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

Ortamınızda çalışan herhangi bir yöntemi kullanarak archiveName.tar dosyasını yeni Docker örneğinize kopyalayın, örneğin FTP,SCP vb

docker loadYeni Docker örneğinizde komutu çalıştırın ve görüntü tar dosyasının konumunu belirtin.

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

Son olarak, docker imagesgörüntünün artık kullanılabilir olup olmadığını kontrol etmek için komutu çalıştırın .

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

Lütfen bu detaylı gönderiyi bulun .


10

Görüntüleri yerel Docker kurulumunuzdan bir minikube VM'ye aktarmak için:

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

10

docker-push-ssh sadece bu senaryo için oluşturduğum bir komut satırı yardımcı programıdır.

Sunucuda geçici bir özel Docker kayıt defteri oluşturur, localhost'unuzdan bir SSH tüneli kurar, görüntünüzü zorlar, sonra kendiliğinden temizler.

Bu yaklaşımın faydası docker save yazarken çoğu yanıt bu yöntemi kullanıyor), sadece yeni katmanların sunucuya aktarılmasıdır, bu da ÇOK daha hızlı bir yükleme ile sonuçlanır.

Genellikle dockerhub gibi bir ara kayıt kullanmak istenmeyen bir durumdur.

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

Yüklemek:

pip install docker-push-ssh

Misal:

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

En büyük uyarı, localhost'unuzu Docker insecure_registriesyapılandırmasına manuel olarak eklemeniz gerektiğidir . Aracı bir kez çalıştırın ve size bilgilendirici bir hata verecektir:

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

Mac OS'de '--insecure-kayıt defteri' bayrağını nerede ayarlamalıyım?


1
Önerdiğiniz yardımcı programın sizin tarafınızdan oluşturulduğunu açıkça belirtmek için yanıtınızı düzenledim. Bu sayfaya özellikle bakın : "İyi, alakalı yanıtlar gönderin ve ürününüzle veya web sitenizle ilgili bazılarının (hepsi değilse de) olması sorun değil. Ancak, yanıtlarınızdaki bağlantıyı açıklamanız gerekir."
Louis

8

Diğer tüm cevaplar çok faydalıdır. Sadece aynı problemi yaşadım ve kolay bir yol buldum docker machine scp.

Docker Machine v0.3.0'dan beri, dosyaları bir Docker makinesinden diğerine kopyalamak için scp tanıtıldı. Yerel bilgisayarınızdan AWS EC2 veya Digital Ocean gibi uzak bir Docker makinesine bir dosya kopyalamak istiyorsanız bu çok kullanışlıdır, çünkü Docker Machine sizin için SSH kimlik bilgileriyle ilgilenir.

  1. docker saveGibi kullanarak görüntüleri kaydedin :

    docker save -o docker-images.tar app-web
    
  2. Docker-machine scp kullanarak görüntüleri kopyalama

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

Uzak Docker makinenizin remote-machineve tar dosyasının olmasını istediğiniz dizinin olduğunu varsayalım /home/ubuntu.

  1. Docker görüntüsünü yükleyin

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

5
neden sadece 'scp <source> <remote>' değil?
Tamas Kalman

3

Tüm resimleri etiketlerle taşımak istiyorum.

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

Açıklama:

Önce OUTyeni etiketlerle ayrılmış tüm etiketleri alır. İkincisi OUTPUTbir dizideki tüm etiketleri alır. Üçüncü olarak $(echo "${OUTPUT[*]}")tüm etiketleri tek bir sayfaya koyardocker save tek bir katran içinde olacak şekilde komut .

Ek olarak, bu gzip kullanılarak sıkıştırılabilir. Hedeften çalıştırın:

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

-Otartarafından yakalanabilen içeriği stdin üzerine koyma seçeneği docker load.


2

Şunları kullanabilirsiniz sshfs:

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

1

Docker kaydetme ve yükleme işlevini gerçekleştiren komut dosyası (denendi ve test edildi):

Docker Kaydet:

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

Docker Yükü:

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

0

DOCKER_HOSTDeğişkenli bir astar kullanabilirsiniz :

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.