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

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

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

Поскольку он основан на собственном образе (например, Red Hat Linux), он не может быть воссоздан из Dockerfile.

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

Кажется, что сохранение/экспорт может достичь аналогичной цели, см. В чем разница между сохранением и экспортом в Docker? , и я предпочитаю команду save для моего случая.

Ответ 1

Вам нужно сохранить образ 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

Ответ 2

Передача образа Docker через SSH, распаковка контента на лету:

docker save <image> | bzip2 | \
     ssh [email protected] 'bunzip2 | docker load'

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

docker save <image> | bzip2 | pv | \
     ssh [email protected] 'bunzip2 | docker load'

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

Ответ 3

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

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

sudo docker images

Скажем, у вас есть изображение с идентификатором "matrix-data".

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

Бежать

docker images

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

docker save awesomesauce:latest > awesomesauce.tar

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

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

docker load < awesomesauce.tar

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

Ответ 6

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

docker export CONTAINER_ID > my_container.tar

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

Ответ 7

При использовании docker-machine вы можете копировать изображения между машинами 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-host по умолчанию.

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

скопировать изображение с текущего Docker-хоста в mach

или же

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

скопировать с mach на текущий докер-хост.

Ответ 8

Я предполагаю, что вам нужно сохранить couchdb-cartridge с идентификатором изображения 7ebc8510bc2c:

[email protected]:~$ 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/ для сохранения изображения.

[email protected]:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

Скопируйте файл archiveName.tar в новый экземпляр Docker, используя любой метод, который работает в вашей среде, например FTP, SCP и т.д.

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

[email protected]:~$ docker load < /media/sf_docker_vm/archiveName.tar

Наконец, запустите команду docker images чтобы убедиться, что изображение теперь доступно.

[email protected]:~$ 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

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

Ответ 9

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

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

Ответ 10

Все остальные ответы очень полезны. Я только что преодолел ту же проблему и выяснил, как легко с 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
    

Ответ 11

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 [email protected] my-docker-image

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

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

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

Ответ 12

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

$ sshfs [email protected]:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar

Ответ 13

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

'''
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.

Ответ 14

Скрипт для выполнения функции сохранения и загрузки 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"

Ответ 15

Вот как вы можете перемещать образы Docker между двумя удаленными регистрами/репозиториями. Работает с Docker версии 1.10.2, сборка c3959b1.

docker pull source-registry.com/myProject/myImageName:1.0.0
docker tag source-registry.com/myProject/myImageName:1.0.0 target-remote-registry.com/myProject/myImageName:1.0.0
docker push target-remote-registry.com/myProject/myImageName:1.0.0

Это удобный метод, если вы хотите перенести изображения в сервис AWS ECS/ECR.