Cách sao chép hình ảnh Docker từ máy chủ này sang máy chủ khác mà không cần sử dụng kho lưu trữ


1374

Làm cách nào để chuyển hình ảnh Docker từ máy này sang máy khác mà không cần sử dụng kho lưu trữ, bất kể là riêng tư hay công khai?

Tôi tạo hình ảnh của riêng mình trong VirtualBox và khi hoàn thành, tôi cố gắng triển khai sang các máy khác để có cách sử dụng thực sự.

Vì nó dựa trên hình ảnh dựa trên của riêng tôi (như Red Hat Linux), nên nó không thể được tạo lại từ Dockerfile. Dockerfile của tôi không dễ dàng di động.

Có những lệnh đơn giản tôi có thể sử dụng? Hay một giải pháp khác?

Câu trả lời:


2309

Bạn sẽ cần lưu hình ảnh Docker dưới dạng tệp tar:

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

Sau đó sao chép hình ảnh của bạn sang một hệ thống mới bằng các công cụ truyền tệp thông thường như cp, scphoặc rsync(ưu tiên cho các tệp lớn). Sau đó, bạn sẽ phải tải hình ảnh vào Docker:

docker load -i <path to image tar file>

PS: Bạn có thể cần sudotất cả các lệnh.

EDIT: Bạn nên thêm tên tệp (không chỉ thư mục) với -o, ví dụ:

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

27
Đây là câu trả lời tốt hơn cho hình ảnh .
Andy

26
Ngoài ra, tốt hơn là sử dụng repo:taglàm tài liệu tham khảo hình ảnh hơn là image id. Nếu bạn sử dụng image id, hình ảnh được tải sẽ không giữ lại thẻ (và bạn sẽ phải thực hiện một bước khác để gắn thẻ hình ảnh).
wvducky

1
Tôi đã sử dụng id hình ảnh thay vì tên: tag Bây giờ tôi đang ngồi đây, tải hình ảnh và có <none> cho REPOSITORY và TAG. Cách đúng để đưa tên và thẻ trở lại là gì? @wvducky
Ulfhetnar

3
Để gắn thẻ, trước tiên hãy xác định ID IMAGE bằng cách sử dụng docker images, sau đó sử dụng docker tag DESIREDIMAGEID mycompany/myreponame. Nếu id hình ảnh của bạn là 591de551d6e4, bạn có thể viết tắt id hình ảnh:docker tag 59 mycompany/myreponame
Junior Mayhé


582

Chuyển hình ảnh Docker qua SSH, chia sẻ nội dung một cách nhanh chóng:

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

Đó cũng là một ý tưởng tốt để đặt pvở giữa đường ống để xem quá trình chuyển tiền diễn ra như thế nào:

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

(Thông tin thêm về pv: trang chủ , trang nam ).


19
Khi sử dụng docker-machine, bạn có thể thực hiện docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) loadđể sao chép hình ảnh giữa các máy mach1mach2 .
matlehmann

5
@manojlds eval $(docker-machine env dev)tốt cho giao tiếp chung với một máy chủ docker duy nhất nhưng không sao chép giữa hai máy, vì điều này liên quan đến hai máy chủ docker / máy docker khác nhau.
matlehmann

14
để làm điều này ngược lại (từ xa đến địa phương):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner

2
Có cách nào để làm điều này khi docker yêu cầu sudo trên máy đích không? Tôi đã thử (không nén) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. Không có công tắc "-t", sudo phàn nàn sudo: xin lỗi, bạn phải có một tty để chạy sudo ; với một "-t" đó là cùng một thông điệp vì ssh nói Pseudo-terminal sẽ không được phân bổ vì stdin không phải là thiết bị đầu cuối. và cuối cùng, với hai "-t", tôi nhận được nội dung của tệp tar (tức là hình ảnh) trên thiết bị đầu cuối của mình. Có ý kiến ​​gì không?
đói

1
@JosefStark Tôi cần thêm "Mặc định: <tên người dùng đích>! Yêu cầu" khi chỉnh sửa tệp sudoers để dừng thông báo "Xin lỗi" từ sudo. Tôi không biết mức độ khác biệt của nó là bao nhiêu nhưng tôi cũng đặt mọi thứ sau dấu ngoặc kép của người dùng @ (vì vậy "[...] | ssh user @ host 'bunzip2 | sudo docker load'").
VirtualWolf

99

Để lưu hình ảnh vào bất kỳ đường dẫn tệp hoặc địa điểm NFS được chia sẻ, hãy xem ví dụ sau.

Lấy id hình ảnh bằng cách thực hiện:

sudo docker images

Giả sử bạn có một hình ảnh với id "ma trận-dữ liệu".

Lưu hình ảnh với id:

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

Sao chép hình ảnh từ đường dẫn đến bất kỳ máy chủ lưu trữ. Bây giờ nhập vào cài đặt Docker cục bộ của bạn bằng cách sử dụng:

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

34

Đầu tiên lưu hình ảnh Docker vào một tệp zip:

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

Sau đó tải hình ảnh đã xuất sang Docker bằng lệnh dưới đây:

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

11
Để tải, docker load < my-image.tar.gzlà đủ. Hình ảnh được giải nén tự động cho gzip, bzip2 và xz.
Flux

32

Chạy

docker images

để xem danh sách các hình ảnh trên máy chủ. Giả sử bạn có một hình ảnh gọi là awesomesauce . Trong thiết bị đầu cuối của bạn, cdđến thư mục mà bạn muốn xuất hình ảnh đến. Bây giờ chạy:

docker save awesomesauce:latest > awesomesauce.tar

Sao chép tệp tar vào ổ USB hoặc bất cứ thứ gì, sau đó sao chép nó vào máy tính chủ mới.

Bây giờ từ máy chủ mới làm:

docker load < awesomesauce.tar

Bây giờ đi uống cà phê và đọc Tin tức Hacker ...


4
Đáng lưu ý ở đây là điều này sẽ chỉ hoạt động nếu lưu và tải được thực thi trên cùng một hệ điều hành. Sử dụng docker save [image] -o file.tardocker load -i file.tarđể tránh điều này!
Andreas Forslöw

docker save [image] -o file.tarcũng có vẻ nhanh hơn rất nhiều
ti7

19

Để xuất khẩu phẳng của hệ thống tập tin chứa, hãy sử dụng;

docker export CONTAINER_ID > my_container.tar

Sử dụng cat my_container.tar | docker import -để nhập hình ảnh cho biết.


9
sẽ là cat my_container.tar | docker import - my_container:newnếu nhập nội địa theo trợ giúp của cmd
Larry Cai

7
Đây là nhiều hơn để sao lưu một container đang chạy hơn là để triển khai một hình ảnh.
Kousha

15

Khi sử dụng docker-machine, bạn có thể sao chép hình ảnh giữa các máy mach1mach2với:

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

Và tất nhiên bạn cũng có thể dán pvở giữa để có được một chỉ số progess:

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

Bạn cũng có thể bỏ qua một trong các docker-machine configshell phụ, để sử dụng máy chủ lưu trữ mặc định hiện tại của bạn.

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

để sao chép hình ảnh từ docker-host hiện tại vào mach

hoặc là

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

để sao chép từ machdocker-host hiện tại.


10

Tôi giả sử bạn cần lưu couchdb-cartridgetrong đó có id hình ảnh là 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

Lưu hình ảnh archiveName vào một tập tin tar. Tôi sẽ sử dụng /media/sf_docker_vm/để lưu hình ảnh.

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

Sao chép tập tin archiveName.tar để dụ Docker mới của bạn sử dụng bất cứ phương pháp công trình trong môi trường của bạn, ví dụ FTP, SCPvv

Chạy docker loadlệnh trên phiên bản Docker mới của bạn và chỉ định vị trí của tệp tar hình ảnh.

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

Cuối cùng, chạy docker imageslệnh để kiểm tra xem hình ảnh đã có sẵn chưa.

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

Hãy tìm bài viết chi tiết này .


10

Để chuyển hình ảnh từ bản cài đặt Docker cục bộ của bạn sang máy ảo minikube:

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

10

docker-push-ssh là một tiện ích dòng lệnh tôi đã tạo chỉ cho kịch bản này.

Nó thiết lập một sổ đăng ký Docker riêng tạm thời trên máy chủ, thiết lập một đường hầm SSH từ localhost của bạn, đẩy hình ảnh của bạn, sau đó tự dọn sạch.

Lợi ích của phương pháp này docker save(tại thời điểm viết hầu hết các câu trả lời đang sử dụng phương pháp này) là chỉ các lớp mới được đẩy lên máy chủ, dẫn đến tải lên nhanh hơn NHIỀU.

Thông thường sử dụng một đăng ký trung gian như dockerhub là không mong muốn và cồng kềnh.

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

Tải về:

pip install docker-push-ssh

Thí dụ:

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

Nhắc nhở lớn nhất là bạn phải thêm thủ công localhost của mình vào insecure_registriescấu hình của Docker . Chạy công cụ một lần và nó sẽ cung cấp cho bạn một lỗi thông tin:

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

Tôi nên đặt cờ '--insecure-registry' ở đâu trên Mac OS?


1
Tôi đã chỉnh sửa câu trả lời của bạn để làm rõ rằng tiện ích bạn đang giới thiệu là do bạn tạo ra. Xem trang này , đặc biệt: "Đăng câu trả lời tốt, có liên quan và nếu một số (nhưng không phải tất cả) xảy ra về sản phẩm hoặc trang web của bạn, điều đó không sao. Tuy nhiên, bạn phải tiết lộ liên kết của mình trong câu trả lời của mình."
Louis

8

Tất cả các câu trả lời khác rất hữu ích. Tôi chỉ trải qua cùng một vấn đề và tìm ra một cách dễ dàng với docker machine scp.

Kể từ Docker Machine v0.3.0, scp đã được giới thiệu để sao chép các tệp từ máy Docker này sang máy khác. Điều này rất thuận tiện nếu bạn muốn sao chép tệp từ máy tính cục bộ sang máy Docker từ xa như AWS EC2 hoặc Digital Ocean vì Docker Machine đang chăm sóc thông tin đăng nhập SSH cho bạn.

  1. Lưu hình ảnh của bạn bằng cách sử dụng docker savenhư:

    docker save -o docker-images.tar app-web
    
  2. Sao chép hình ảnh bằng cách sử dụng docker-machine scp

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

Giả sử máy Docker từ xa của bạn là remote-machinevà thư mục bạn muốn tệp tar là /home/ubuntu.

  1. Tải hình ảnh Docker

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

5
tại sao không chỉ là 'scp <source> <remote>'?
Tamas Kalman

3

Tôi muốn di chuyển tất cả các hình ảnh với các thẻ.

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

Giải trình:

Đầu tiên OUTđược tất cả các thẻ nhưng được phân tách bằng các dòng mới. Thứ hai OUTPUTnhận được tất cả các thẻ trong một mảng. Thứ ba $(echo "${OUTPUT[*]}")đặt tất cả các thẻ cho một docker savelệnh duy nhất sao cho tất cả các hình ảnh nằm trong một tar duy nhất.

Ngoài ra, điều này có thể được nén bằng gzip. Trên mục tiêu, chạy:

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

-Otùy chọn để tarđặt nội dung trên stdin có thể được lấy bởi docker load.


2

Bạn có thể sử dụng sshfs:

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

1

Script để thực hiện chức năng lưu và tải Docker (đã thử và kiểm tra):

Docker Lưu:

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

Tải 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"

0

Bạn có thể sử dụng một lớp lót với DOCKER_HOSTbiến:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.