Cara menyalin gambar Docker dari satu host ke host lain tanpa menggunakan repositori

1375

Bagaimana cara mentransfer gambar Docker dari satu mesin ke mesin lain tanpa menggunakan repositori, tidak masalah pribadi atau publik?

Saya membuat gambar saya sendiri di VirtualBox, dan ketika sudah selesai saya mencoba untuk menyebarkan ke mesin lain untuk memiliki penggunaan nyata.

Karena didasarkan pada gambar saya sendiri (seperti Red Hat Linux), itu tidak dapat dibuat kembali dari Dockerfile. Dockerfile saya tidak mudah dibawa-bawa.

Apakah ada perintah sederhana yang bisa saya gunakan? Atau solusi lain?

Larry Cai
sumber

Jawaban:

2312

Anda harus menyimpan gambar Docker sebagai file tar:

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

Kemudian salin gambar Anda ke sistem baru dengan alat transfer file biasa seperti cp, scpatau rsync(lebih disukai untuk file besar). Setelah itu Anda harus memuat gambar ke Docker:

docker load -i <path to image tar file>

PS: Anda mungkin perlu sudosemua perintah.

EDIT: Anda harus menambahkan nama file (bukan hanya direktori) dengan -o, misalnya:

docker save -o c:/myfile.tar centos:16
Daiwei
sumber
27
Ini jawaban yang lebih baik untuk gambar .
Andy
26
juga, lebih baik digunakan repo:tagsebagai referensi gambar daripada image id. Jika Anda menggunakan image id, gambar yang dimuat tidak akan mempertahankan tag (dan Anda harus melakukan langkah lain untuk memberi tag pada gambar).
wisbucky
1
Saya menggunakan id gambar alih-alih nama: tag Sekarang saya duduk di sini, memuat gambar dan memiliki <none> untuk REPOSITORY dan TAG. Apa cara yang benar untuk mengembalikan nama dan tag? @wisbucky
Ulfhetnar
3
Untuk menandai, identitas dulu ID IMAGE yang digunakan docker images, kemudian gunakan docker tag DESIREDIMAGEID mycompany/myreponame. Jika id gambar Anda adalah 591de551d6e4, Anda dapat menyingkat id gambar:docker tag 59 mycompany/myreponame
Junior Mayhé
582

Mentransfer gambar Docker melalui SSH, mem-bzipping konten dengan cepat:

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

Sebaiknya letakkan pvdi tengah pipa untuk melihat bagaimana transfer berlangsung:

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

(Info lebih lanjut tentang pv: halaman rumah , halaman manual ).

kolypto
sumber
19
Saat menggunakan mesin docker, Anda dapat melakukannya docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) loaduntuk menyalin gambar antara mesin mach1 dan mach2 .
matlehmann
5
@manojlds eval $(docker-machine env dev)baik untuk komunikasi umum dengan satu host buruh pelabuhan tetapi tidak untuk menyalin antara dua mesin, karena ini melibatkan dua host buruh pelabuhan / mesin buruh pelabuhan yang berbeda.
matlehmann
14
untuk melakukan ini secara terbalik (jauh ke lokal):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner
2
Apakah ada cara untuk melakukan ini ketika buruh pelabuhan membutuhkan sudo pada mesin target? Saya mencoba (tanpa kompresi) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. Tanpa tombol "-t", sudo mengeluh kepada sudo: maaf, Anda harus memiliki tty untuk menjalankan sudo ; dengan satu "-t" itu pesan yang sama karena ssh mengatakan Pseudo-terminal tidak akan dialokasikan karena stdin bukan terminal. dan akhirnya, dengan dua "-t", saya mendapatkan konten file tar (yaitu gambar) pada terminal saya. Ada ide?
kelaparan
1
@ JosefStark Saya perlu menambahkan "Defaults: <target username>! Requiredetty" saat mengedit file sudoers untuk menghentikan pesan "Sorry" dari sudo. Saya tidak tahu berapa banyak perbedaan yang dibuat tetapi saya juga menaruh semuanya setelah tanda kutip pengguna @ host (jadi "[...] | ssh user @ host 'bunzip2 | sudo docker load'").
VirtualWolf
99

Untuk menyimpan gambar ke jalur file apa pun atau tempat NFS bersama, lihat contoh berikut.

Dapatkan id gambar dengan melakukan:

sudo docker images

Katakanlah Anda memiliki gambar dengan id "matrix-data".

Simpan gambar dengan id:

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

Salin gambar dari jalur ke host mana pun. Sekarang impor ke instalasi Docker lokal Anda menggunakan:

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

Pertama-tama simpan gambar Docker ke file zip:

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

Kemudian muat gambar yang diekspor ke Docker menggunakan perintah di bawah ini:

zcat <docker image name>.tar.gz | docker load
Damodaran
sumber
11
Untuk memuat, docker load < my-image.tar.gzsudah cukup. Gambar akan didekompresi secara otomatis untuk gzip, bzip2, dan xz.
Fluks
32

Lari

docker images

untuk melihat daftar gambar pada host. Katakanlah Anda memiliki gambar yang disebut awesomesauce . Di terminal Anda, cdke direktori tempat Anda ingin mengekspor gambar. Sekarang jalankan:

docker save awesomesauce:latest > awesomesauce.tar

Salin file tar ke thumb drive atau apa pun, dan kemudian salin ke komputer host baru.

Sekarang dari host baru lakukan:

docker load < awesomesauce.tar

Sekarang pergi minum kopi dan membaca Berita Peretas ...

Neil Girardi
sumber
4
Yang perlu diperhatikan di sini adalah ini hanya akan berfungsi jika simpan dan muat dijalankan pada OS yang sama. Gunakan docker save [image] -o file.tardan docker load -i file.taruntuk menghindari ini!
Andreas Forslöw
docker save [image] -o file.tarjuga tampak lebih cepat
ti7
19

Untuk ekspor sistem file kontainer yang rata, gunakan;

docker export CONTAINER_ID > my_container.tar

Gunakan cat my_container.tar | docker import -untuk mengimpor gambar tersebut.

Panagiotis Moustafellos
sumber
9
itu akan terjadi cat my_container.tar | docker import - my_container:newjika mengimpor secara lokal sesuai dengan bantuan cmd
Larry Cai
7
Ini lebih untuk membuat cadangan wadah yang sedang berjalan daripada untuk menyebarkan gambar.
Kousha
15

Saat menggunakan mesin buruh pelabuhan, Anda dapat menyalin gambar antar mesin mach1dan mach2dengan:

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

Dan tentu saja Anda juga bisa tetap pvdi tengah untuk mendapatkan indikator proses:

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

Anda juga dapat menghilangkan salah satu docker-machine configsub-shell, untuk menggunakan host docker default Anda saat ini.

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

untuk menyalin gambar dari host docker saat ini ke mach

atau

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

untuk menyalin dari machke host buruh pelabuhan saat ini.

matlehmann
sumber
10

Saya berasumsi Anda harus menyimpan couchdb-cartridgeyang memiliki id gambar 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

Simpan gambar archiveName ke file tar. Saya akan menggunakan /media/sf_docker_vm/untuk menyimpan gambar.

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

Salin file archiveName.tar untuk contoh Docker baru Anda menggunakan metode apapun karya di lingkungan Anda, misalnya FTP, SCP, dll

Jalankan docker loadperintah pada instance Docker baru Anda dan tentukan lokasi file tar gambar.

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

Akhirnya, jalankan docker imagesperintah untuk memeriksa bahwa gambar sekarang tersedia.

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

Silakan temukan pos terperinci ini .

tk_
sumber
10

Untuk mentransfer gambar dari instalasi Docker lokal Anda ke minikube VM:

docker save <image> | (eval $(minikube docker-env) && docker load)
Bryan Larsen
sumber
10

docker-push-ssh adalah utilitas baris perintah yang saya buat hanya untuk skenario ini.

Ini membuat registri Docker pribadi sementara di server, membuat terowongan SSH dari localhost Anda, mendorong gambar Anda, lalu membersihkannya sendiri.

Manfaat dari pendekatan ini berakhir docker save(pada saat penulisan sebagian besar jawaban menggunakan metode ini) adalah bahwa hanya lapisan baru yang didorong ke server, menghasilkan unggahan yang jauh lebih cepat.

Seringkali menggunakan registry perantara seperti dockerhub tidak diinginkan, dan rumit.

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

Install:

pip install docker-push-ssh

Contoh:

docker-push-ssh -i ~/my_ssh_key [email protected] my-docker-image

Peringatan terbesar adalah bahwa Anda harus secara manual menambahkan localhost Anda ke insecure_registrieskonfigurasi Docker . Jalankan alat ini sekali dan itu akan memberi Anda kesalahan informatif:

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

Di mana saya harus mengatur flag '--insecure-registry' pada Mac OS?

brthornbury
sumber
1
Saya mengedit jawaban Anda untuk menjelaskan bahwa utilitas yang Anda rekomendasikan dibuat oleh Anda. Lihat halaman ini , khususnya: "Kirimkan jawaban yang baik dan relevan, dan jika beberapa (tetapi tidak semua) kebetulan mengenai produk atau situs web Anda, tidak apa-apa. Namun, Anda harus mengungkapkan afiliasi Anda dalam jawaban Anda."
Louis
8

Semua jawaban lain sangat membantu. Saya baru saja melalui masalah yang sama dan mencari cara mudah dengannya docker machine scp.

Sejak Docker Machine v0.3.0, scp diperkenalkan untuk menyalin file dari satu mesin Docker ke yang lain. Ini sangat nyaman jika Anda ingin menyalin file dari komputer lokal Anda ke mesin Docker jarak jauh seperti AWS EC2 atau Digital Ocean karena Mesin Docker mengurus kredensial SSH untuk Anda.

  1. Menyimpan gambar Anda menggunakan docker saveseperti:

    docker save -o docker-images.tar app-web
    
  2. Salin gambar menggunakan docker-machine scp

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

Asumsikan mesin Docker jarak jauh Anda adalah remote-machinedan direktori yang Anda inginkan adalah file tar /home/ubuntu.

  1. Muat gambar Docker

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    
Peng
sumber
5
mengapa tidak hanya 'scp <source> <remote>'?
Tamas Kalman
3

Saya ingin memindahkan semua gambar dengan tag.

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

Penjelasan:

Pertama OUTmendapatkan semua tag tetapi dipisahkan dengan baris baru. Kedua OUTPUTmendapatkan semua tag dalam array. Ketiga $(echo "${OUTPUT[*]}")menempatkan semua tag untuk satu docker saveperintah sehingga semua gambar berada dalam satu tar.

Selain itu, ini dapat dizip menggunakan gzip. Sesuai target, jalankan:

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

-Opilihan untuk tarmeletakkan konten di stdin yang bisa diambil docker load.

Vikram
sumber
2

Anda dapat menggunakan sshfs:

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

Skrip untuk menjalankan fungsi penyimpanan dan muat Docker (dicoba dan diuji):

Docker Simpan:

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

Beban Docker:

#!/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"
Syed Faraz Umar
sumber
0

Anda bisa menggunakan satu-baris dengan DOCKER_HOSTvariabel:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
vitalet
sumber