Как скопировать образы Docker с одного хоста на другой без использования репозитория

avatar
Larry Cai
29 мая 2014 в 13:57
867683
21
1809

Как перенести образ Docker с одного компьютера на другой без использования репозитория, частного или общедоступного?

Я создаю свой собственный образ в VirtualBox, и когда он закончен, я пытаюсь развернуть его на других машинах для реального использования.

Поскольку он основан на моем собственном образе (например, Red Hat Linux), его нельзя воссоздать из файла Docker. Мой файл докеров непросто перенести.

Могу ли я использовать простые команды? Или другое решение?

Источник
Mišo
2 сентября 2020 в 07:59
2

Отвечает ли это на ваш вопрос? Как сохранить все образы Docker и скопировать на другой компьютер

Ответы (21)

avatar
Daiwei
29 мая 2014 в 17:09
3019

Вам нужно будет сохранить образ 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
Andy
29 мая 2014 в 20:18
49

Это лучший ответ для изображений .

wisbucky
14 сентября 2017 в 21:03
53

Кроме того, в качестве ссылки на изображение лучше использовать repo:tag, чем image id. Если вы используете image id, загруженное изображение не сохранит тег (и вам придется сделать еще один шаг, чтобы пометить изображение).

Ulfhetnar
10 января 2018 в 07:37
1

Я использовал id изображения вместо name: tag. Теперь я сижу здесь, загружаю изображение и имею <none> для REPOSITORY и TAG. Как правильно вернуть имя и тег? @wisbucky

Junior Mayhé
15 августа 2018 в 13:07
4

Чтобы пометить, сначала идентифицируйте ИД ИЗОБРАЖЕНИЯ с помощью docker images, затем используйте docker tag DESIREDIMAGEID mycompany/myreponame. Если ваш идентификатор изображения 591de551d6e4, вы можете сократить идентификатор изображения: docker tag 59 mycompany/myreponame

duct_tape_coder
14 февраля 2019 в 16:12
0

@AndiJay Взгляните на Как копировать образы докеров с одного хоста на другой?

Ryan Walker
1 марта 2019 в 22:42
0

Убедитесь, что путь к файлу ведет к новому файлу, иначе он не сработает.

rb612
23 апреля 2019 в 01:05
0

Похоже, загрузка пути к файлу .tar, в который он был сохранен на удаленном сервере, не работает после использования docker-machine scp. Например, если вы используете docker-machine для копирования в new_machine:/home/example.tar, выполнение docker load -i new_machine:/home/example.tar или просто docker load -i /home/example.tar не сработает.

Vic Seedoubleyew
21 августа 2020 в 10:29
0

@ rb612, что для меня звучит вполне нормально: изображение нужно копировать на хост, а не внутри машины. Или я неправильно понял ваш комментарий?

serge
3 мая 2021 в 15:37
0

@jj_ ответ скорее ориентирован на Linux ... не так ли?

jj_
5 мая 2021 в 11:27
1

@serge совсем нет, у него даже есть пример, где используется путь к Windows ...

Roberto C. Rodriguez-Hidalgo
2 июня 2021 в 17:39
0

Я пробовал этот способ и могу сохранить изображение в tar-файле, но не могу перенести его на другую машину. В командной строке отображается unsupported os linux, когда я пытаюсь выполнить команду загрузки на новом компьютере.

avatar
Kaveh Naseri
16 апреля 2022 в 05:55
2

Лучший способ сохранить все изображения выглядит следующим образом:

docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allimages.tar

И для загрузки изображений:

docker load -i allimages.tar

Просто убедитесь, что вы используете эти команды в power shell, а не в cmd

avatar
Tarek Kalaji
31 марта 2022 в 07:13
0

Самый быстрый способ сохранить и загрузить образ Docker с помощью команды gzip:

docker save <image_id> | gzip image_file.tgz

Чтобы загрузить заархивированное изображение на другой сервер, немедленно используйте эту команду, оно будет распознано как заархивированное изображение:

docker load -i image_file.tgz

чтобы переименовать или повторно пометить изображение, используйте:

docker image tag <image_id> <image_path_name>:<version>

например:

docker image tag 4444444 your_docker_or_harbor_path/ubuntu:14.0
avatar
Yoshi
17 февраля 2022 в 14:11
1

Основываясь на ответе @kolypto, у меня это отлично сработало, но только с sudo для загрузки докера:

docker save <image> | bzip2 | pv | ssh user@host sudo docker load

или если у вас нет/не хотите устанавливать pv:

docker save <image> | bzip2 | ssh user@host sudo docker load

Не нужно архивировать вручную и т.п.

avatar
runxc1 Bret Ferrier
2 декабря 2021 в 16:58
0

Если вы работаете на компьютере с Windows и загружаете на компьютер с Linux такие команды, как

docker save <image> | ssh user@host docker load

не будет работать, если вы используете powershell, поскольку кажется, что он добавляет дополнительный символ к выходным данным. Однако если вы запустите команду с помощью cmd (командной строки), она будет работать. В качестве примечания вы также можете установить gzip с помощью Chocolatey, и из cmd также будет работать следующее:

docker save <image> | gzip | ssh user@host docker load
avatar
ofir_aghai
12 октября 2021 в 18:19
0

1. Извлечь образ или репозиторий из реестра.

docker pull [OPTIONS] NAME [: TAG | @DIGEST]

2. Сохраните его как файл .tar.

докер сохранить [ОПЦИИ] ИЗОБРАЖЕНИЕ [ИЗОБРАЖЕНИЕ ...]

Например:

docker pull hello-world
docker save -o hello-world.tar hello-world
avatar
quine9997
12 июля 2021 в 00:42
4

НАСТОЯЩИЙ МИРОВОЙ ПРИМЕР

#host1
systemctl stop docker
systemctl start docker
docker commit -p 1d09068ef111 ubuntu001_bkp3
#create backup
docker save -o ubuntu001_bkp3.tar ubuntu001_bkp3

#upload ubuntu001_bkp3.tar to my online drive
aws s3 cp ubuntu001_bkp3.tar s3://mybucket001/


#host2
systemctl stop docker
systemctl start docker
cd /dir1

#download ubuntu001_bkp3.tar from my online drive
aws s3 cp s3://mybucket001/ubuntu001_bkp3.tar /dir1

#restore backup
cat ./ubuntu001_bkp3.tar  | docker load
docker run --name ubuntu001 -it ubuntu001_bkp3:latest bash
docker ps -a
docker attach ubuntu001




Will Huang
16 июля 2021 в 14:39
1

Почему вы останавливаете службу докеров, прежде чем что-то делать?

avatar
vitalets
3 июня 2020 в 15:13
51

Вы можете использовать однострочник с DOCKER_HOST переменной:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Francois
13 июля 2020 в 15:22
9

Это определенно та команда, которую я искал, я думаю, что этот ответ заслуживает большей любви

GrendleM
17 ноября 2020 в 22:57
3

предварительные требования: настройка учетных данных ssh на удаленном компьютере (ssh-copy-id) и локальный и удаленный пользователь должны быть в группе докеров (sudo usermod -aG docker $ USER)

Mouagip
10 ноября 2021 в 14:11
0

Есть ли здесь отличия (производительности) от ssh user@remotehost docker load?

avatar
Syed Faraz Umar
6 сентября 2019 в 11:35
1

Скрипт для выполнения функции сохранения и загрузки Docker (опробовано и протестировано):

Сохранить в 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"

Загрузка 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"
avatar
brthornbury
12 сентября 2018 в 05:20
20

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

Самая большая оговорка заключается в том, что вам нужно вручную добавить свой локальный хост в конфигурацию Docker insecure_registries. Запустите инструмент один раз, и он выдаст информативную ошибку:

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

Где мне установить флаг --insecure-registry в Mac OS?

Louis
29 июля 2019 в 13:58
1

Я отредактировал ваш ответ, чтобы было ясно, что рекомендуемая вами утилита была создана вами. См. Эту страницу, в частности: «Публикуйте хорошие, релевантные ответы, и если некоторые (но не все) будут посвящены вашему продукту или веб-сайту, это нормально. Тем не менее, вы должны раскрывать свою принадлежность к своим ответам».

nmgeek
4 марта 2021 в 00:09
0

Это многообещающая утилита. Предлагают ли какие-либо другие ответы решение, которое копирует только обновленные слои? Но мне пришлось проработать а) без поддержки py3, б) должен быть указан файл идентификации ssh, хотя мой находится в местоположении по умолчанию, и в) порт 5000 уже используется на моих серверах, и нет возможности изменить его на другой порт. .

brthornbury
5 марта 2021 в 22:15
0

@nmgeek Подумайте о том, чтобы сделать PR для утилиты на GitHub, чтобы другие могли извлечь выгоду из ваших изменений.

avatar
Vikram
6 августа 2018 в 21:01
3

Я хочу переместить все изображения с тегами.

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

Пояснение:

Первый OUT получает все теги, но разделенные новыми строками. Второй OUTPUT получает все теги в массиве. Третий $(echo "${OUTPUT[*]}") помещает все теги для одной команды docker save, так что все изображения находятся в одном tar.

Кроме того, его можно заархивировать с помощью gzip. На цели запустите:

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

-O опция для tar помещает содержимое на стандартный ввод, который может быть получен docker load.

avatar
Chu
4 мая 2018 в 03:41
2

Вы можете использовать sshfs:

$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar
avatar
Bryan Larsen
26 мая 2017 в 17:25
11

Чтобы перенести образы из локальной установки Docker в виртуальную машину minikube:

docker save <image> | (eval $(minikube docker-env) && docker load)
avatar
Neil Girardi
9 ноября 2016 в 20:28
42

Выполнить

docker images

, чтобы просмотреть список изображений на хосте. Допустим, у вас есть изображение с именем awesomesauce . В вашем терминале cd перейдите в каталог, в который вы хотите экспортировать изображение. Теперь запустите:

docker save awesomesauce:latest > awesomesauce.tar

Скопируйте файл tar на флэш-накопитель или что-нибудь еще, а затем скопируйте его на новый хост-компьютер.

Теперь с нового хоста делаем:

docker load < awesomesauce.tar

А теперь выпейте кофе и прочтите Hacker News ...

Andreas Forslöw
11 июня 2019 в 14:52
6

Здесь стоит отметить, что это будет работать, только если сохранение и загрузка выполняются в одной и той же ОС. Используйте docker save [image] -o file.tar и docker load -i file.tar, чтобы избежать этого!

ti7
25 февраля 2020 в 23:06
0

docker save [image] -o file.tar также кажется намного быстрее

Thorbjørn Ravn Andersen
25 мая 2021 в 07:05
1

@ AndreasForslöw Почему использование каналов означает, что это работает только в той же ОС?

avatar
matlehmann
14 октября 2016 в 09:53
17

При использовании докер-машины вы можете копировать образы между машинами 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 на текущий хост-докер.

avatar
Damodaran
27 сентября 2016 в 04:33
50

Сначала сохраните образ Docker в сжатый архив:

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

Затем загрузите экспортированный образ в Docker, используя следующую команду:

zcat <docker image name>.tar.gz | docker load
Flux
4 апреля 2018 в 02:41
22

Для загрузки достаточно docker load < my-image.tar.gz. Образ автоматически распаковывается для gzip, bzip2 и xz.

avatar
Peng
9 февраля 2016 в 03:21
9

Все остальные ответы очень полезны. Я просто столкнулся с той же проблемой и нашел простой способ с 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. Копирование образов с помощью docker-machine 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
    
Tamas Kalman
31 мая 2017 в 01:11
8

почему не просто scp <source> <remote>?

avatar
Sohan
4 ноября 2014 в 05:54
125

Чтобы сохранить изображение по любому пути к файлу или в общем месте NFS, см. Следующий пример.

Получите идентификатор изображения, выполнив:

docker images

Допустим, у вас есть изображение с идентификатором "матрица-данные".

Сохраните изображение с идентификатором:

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

Скопируйте образ с пути на любой хост. Теперь импортируйте в локальную установку Docker, используя:

docker load -i <path to copied image file>
avatar
kolypto
6 октября 2014 в 23:11
719

Передача образа Docker через SSH, сжатие содержимого на лету:

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

Обратите внимание, что docker load автоматически распаковывает изображения для вас. Он поддерживает gzip, bzip2 и xz.

Также неплохо поместить pv в середину трубы, чтобы увидеть, как идет передача:

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

(Подробнее о pv: домашняя страница, справочная страница).

Важное примечание от @Thomas Steinbach: при высокой пропускной способности bzip не сможет сжиматься достаточно быстро. Если вы можете загружать со скоростью 10 МБ / с и более, gzip / gunzip будет намного быстрее, чем bzip2.

Если вы подключены к 3G и у вас медленный Интернет, @jgmjgm предлагает использовать xz: он обеспечивает более высокую степень сжатия.

matlehmann
4 сентября 2015 в 12:57
21

При использовании docker-machine вы можете выполнить docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) load для копирования образов между машинами mach1 и mach2 .

matlehmann
18 ноября 2015 в 15:47
5

@manojlds eval $(docker-machine env dev) хорош для общего обмена данными с одним хостом докеров, но не для копирования между двумя машинами, так как это касается двух разных хостов докеров / докеров.

ThorSummoner
1 февраля 2016 в 22:50
21

чтобы сделать это в обратном порядке (с удаленного на локальный): ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load

herbrandson
13 октября 2016 в 13:39
0

@matlehmann Не могли бы вы опубликовать это как отдельный ответ? Это именно то, что я искал

matlehmann
14 октября 2016 в 09:54
0

@herbrandson, посмотрите мой новый ответ - спасибо за вашу поддержку.

hunger
14 декабря 2016 в 10:02
2

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

VirtualWolf
15 июня 2017 в 10:12
1

@JosefStark Мне нужно было добавить «По умолчанию: <целевое имя пользователя>! Requiretty» при редактировании файла sudoers, чтобы остановить сообщение «Извините» от sudo. Я не знаю, насколько это важно, но я также помещаю все после user @ host в кавычки (так что «[...] | ssh user @ host 'bunzip2 | sudo docker load'»).

Thomas Steinbach
29 июня 2017 в 12:41
1

Классное комбо. Вот мой совет: gzip намного быстрее при высокой пропускной способности, чем bzip: docker save myimage | pv | ssh remoteserver 'docker load' 1,44GiB 0:02:31 [9,71MiB/s] docker save myimage | bzip2 | pv | ssh remoteserver 'bunzip2 | docker load' 613MiB 0:02:47 [3,67MiB/s] docker save myimage | gzip | pv | ssh remoteserver 'gunzip | docker load' 667MiB 0:01:34 [7,08MiB/s]

flungo
4 августа 2017 в 09:53
0

Если вы делаете это регулярно, я создал сценарий docker-send на основе этого ответа с поддержкой sudo. Возможно, в будущем я добавлю поддержку других форматов сжатия. gist.github.com/flungo/6b5f607db87c3c034609c8dbc5b40966

RobbyD
22 февраля 2019 в 09:21
1

@hunger немного опоздал на вечеринку, но для всех, кто хочет это сделать. Отредактируйте файл sudoers, чтобы разрешить использование sudo без ввода пароля. (Обязательно проверьте политики безопасности). Т.е. добавить: голод ВСЕ = (ВСЕ) NOPASSWD: ВСЕ

j2L4e
22 марта 2019 в 10:41
0

@RobbyD Вы можете предоставить доступ без пароля в более строгом режиме: ostechnix.com/…

jgmjgm
12 апреля 2019 в 13:05
1

xz, вероятно, лучше, чем bzip. gzip для переносимости, xz для наилучших результатов. xz level 1 работает примерно так же, как gzip level 9, но производит файлы значительно меньшего размера.

jgmjgm
12 апреля 2019 в 13:12
0

Фактически, вы почти наверняка можете указать ssh для сжатия данных, хотя, вероятно, это будет библиотека сжатия, оптимизированная для скорости.

Nick Zagkanas
28 сентября 2021 в 09:58
1

Вы сэкономили мне много времени !! Спасибо :)

avatar
tk_
29 сентября 2014 в 05:25
12

Я полагаю, вам нужно сохранить 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 в новый экземпляр Docker, используя любой метод, работающий в вашей среде, например FTP, SCP и т. Д.

Запустите команду docker load на своем новом экземпляре Docker и укажите расположение 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

Пожалуйста, найдите этот подробный пост.

avatar
Panagiotis Moustafellos
29 мая 2014 в 14:19
22

Для плоского экспорта файловой системы контейнера используйте;

docker export CONTAINER_ID > my_container.tar

Используйте cat my_container.tar | docker import - для импорта указанного изображения.

Larry Cai
30 мая 2014 в 07:51
9

он должен быть cat my_container.tar | docker import - my_container:new при локальном импорте согласно cmd help

Kousha
25 ноября 2014 в 03:49
7

Это больше для резервного копирования работающего контейнера, чем для развертывания образа.

user2201789
16 ноября 2021 в 12:29
0

Я пробовал сохранять докеры на машинах ubuntu, все образы докеров работали нормально. Затем я загружаю их в докер на машине Windows. Когда я запускаю или запускаю докеры, возникает много ошибок. Есть идеи, что не так?