Як скопіювати зображення Docker з одного хоста на інший без використання сховища


1373

Як перенести зображення Docker з однієї машини на іншу без використання сховища, незалежно від приватного чи загальнодоступного?

Я створюю власний образ у VirtualBox, і коли він закінчується, я намагаюся розгорнути на інші машини, щоб реально використовувати.

Оскільки він базується на моєму власному образі (наприклад, Red Hat Linux), його не можна відтворити з Dockerfile. Мій dockerfile не легко переноситься.

Чи є прості команди, які я можу використовувати? Або інше рішення?

Відповіді:


2304

Вам потрібно буде зберегти зображення Docker як файл tar:

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, завантажене зображення не збереже тег (і вам доведеться зробити ще один крок для тегування зображення).
wisbucky

1
Я використовував ідентифікатор зображення замість імені: тег Тепер я сиджу тут, завантажую зображення та маю <none> для REPOSITORY та TAG. Який правильний спосіб повернути ім’я та тег назад? @wisbucky
Ulfhetnar

3
Щоб позначити тег, спочатку ідентифікуйте Ідентифікатор зображення docker images, потім використовуйте docker tag DESIREDIMAGEID mycompany/myreponame. Якщо ваш ідентифікатор зображення 591de551d6e4, ви можете скоротити ідентифікатор зображення:docker tag 59 mycompany/myreponame
Junior Mayhé


582

Передача зображення Docker через 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-machine config mach1) save <image> | docker $(docker-machine config mach2) loadкопіювання зображень між машинами mach1 та mach2 .
matlehmann

5
@manojlds eval $(docker-machine env dev)хороший для загальної комунікації з одним хостом докера, але не для копіювання між двома машинами, оскільки це включає два різних хокерських пристроїв / докерних машин.
matlehmann

14
зробити це в зворотному порядку (віддалено до локального):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner

2
Чи можливо це зробити, коли докер вимагає судо-машини на цільовій машині? Я спробував (без стиснення) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load. Без перемикача "-t", sudo скаржиться на sudo: вибачте, ви повинні мати tty, щоб запустити sudo ; з одним "-t" це те саме повідомлення, оскільки ssh каже, що Псевдотермінал не буде виділений, оскільки stdin не є терміналом. і нарешті, за допомогою двох "-t" s я отримую вміст файлу tar (тобто зображення) на своєму терміналі. Будь-які ідеї?
голодування

1
@JosefStark Мені потрібно було додати "За замовчуванням: <цільове ім'я користувача! Я не знаю, наскільки це різниця, але я також все після користувача @ хост розміщую в лапках (так "[...] | ssh user @ host 'bunzip2 | sudo docker load'").
VirtualWolf

99

Щоб зберегти зображення у будь-який шлях до файлу або до спільного місця до NFS, див. Наступний приклад.

Отримайте ідентифікатор зображення, виконавши:

sudo docker images

Скажімо, у вас є зображення з id "матриця-дані".

Збережіть зображення за допомогою id:

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

Скопіюйте зображення зі шляху до будь-якого хоста. Тепер імпортуйте у вашу локальну установку Docker, використовуючи:

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

34

Спочатку збережіть зображення Docker у поштовому файлі:

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

Потім завантажте експортоване зображення в Docker за допомогою команди нижче:

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

11
Для завантаження docker load < my-image.tar.gzдостатньо. Зображення автоматично декомпресується для gzip, bzip2 та xz.
Флюс

32

Біжи

docker images

щоб побачити список зображень на хості. Скажімо, у вас є зображення під назвою awesomesauce . У своєму терміналі cdдо каталогу, куди потрібно експортувати зображення. Тепер запустіть:

docker save awesomesauce:latest > awesomesauce.tar

Скопіюйте файл tar на привід великого пальця або інше, а потім скопіюйте його на новий хост-комп'ютер.

Тепер від нового хоста зробіть:

docker load < awesomesauce.tar

Тепер піди попити каву та почитати новини Hacker ...


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якщо імпортувати локально відповідно до cmd довідки
Ларрі Кай

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

Збережіть зображення archiveName у файл tar. Я буду використовувати /media/sf_docker_vm/для збереження зображення.

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

Скопіюйте файл archiveName.tar в свій новий екземпляр Докер , використовуючи будь-який метод , працює в середовищі, наприклад FTP, SCPі т.д.

Запустіть docker loadкоманду у вашому новому екземплярі Docker та вкажіть місце розташування файлу tar tar зображення.

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 на VM minikube:

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

10

docker-push-ssh це утиліта командного рядка, яку я створив саме для цього сценарію.

Він встановлює на сервері тимчасовий приватний реєстр Docker, встановлює тунель SSH з вашого локального господаря, виштовхує ваше зображення, а потім очищає після себе.

Перевага такого підходу docker save(на момент написання більшості відповідей використовує цей метод) полягає в тому, що на сервер висуваються лише нові шари, що призводить до МНОГО швидшого завантаження.

Часто використання проміжного реєстру, такого як dockerhub, є небажаним та громіздким.

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-register' на Mac OS?


1
Я відредагував вашу відповідь, щоб зрозуміти, що утиліта, яку ви рекомендуєте, створена вами. Дивіться цю сторінку , зокрема: "Опублікуйте хороші відповідні відповіді, і якщо деякі (але не всі) трапляються щодо вашого продукту чи веб-сайту, це нормально. Однак ви повинні розкрити свою приналежність у своїх відповідях."
Луї

8

Усі інші відповіді дуже корисні. Я просто пережив ту саму проблему і зрозумів простий шлях docker machine scp.

Починаючи з Docker Machine v0.3.0, було введено scp для копіювання файлів з однієї машини Docker на іншу. Це дуже зручно, якщо ви хочете скопіювати файл з локального комп'ютера на віддалений комп'ютер Docker, наприклад AWS EC2 або Digital Ocean, оскільки Docker Machine піклується про SSH-дані для вас.

  1. Збережіть зображення, використовуючи docker save:

    docker save -o docker-images.tar app-web
    
  2. Копіюйте зображення за допомогою scp докер-машини

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

Припустимо, що ваша віддалена машина Docker є, remote-machineа каталог, у якому ви хочете, щоб був файл tar /home/ubuntu.

  1. Завантажте зображення Docker

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

5
чому б не просто 'scp <source> <remote>'?
Тамас Кальман

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

-Oможливість tarрозмістити вміст на stdin, який може бути схоплено docker load.


2

Ви можете використовувати sshfs:

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

1

Сценарій для виконання функції збереження та завантаження Docker (випробуваний):

Зберегти докер:

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

0

Ви можете використовувати однолінійку зі DOCKER_HOSTзмінною:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.