Как скопировать образы 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.
-
Сохраняйте изображения с помощью docker save
.
docker save -o docker-images.tar app-web
-
Копирование изображений с использованием docker-machine scp
docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
Предположим, что ваш удаленный Docker-компьютер - это remote-machine
а каталог, в котором вы хотите установить tar файл, - это /home/ubuntu
.
-
Загрузите образ 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.