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

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

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

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

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

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

16 ответов


вам нужно будет Сохранить Изображение Docker в виде файла tar:

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

затем скопируйте изображение в новую систему с помощью обычных инструментов передачи файлов, таких как cp или scp. После этого вам придется загрузить изображение в Docker:

docker load -i <path to image tar file>

PS: Вам может понадобиться sudo все команды.


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

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

Это также хорошая идея, чтобы поставить pv в середине трубы, чтобы увидеть, как перевод будет:

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

(подробнее о pv: Домашняя страница, man page).


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

получить идентификатор образ:

sudo docker images

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

Сохранить Изображение с id:

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

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

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

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

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

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

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

Run

docker images

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

docker save awesomesauce:latest > awesomesauce.tar

скопировать файл tar на флешку, а потом скопировать его на новый компьютер.

теперь от нового хозяина сделать:

docker load < awesomesauce.tar

теперь иди выпей кофе и почитай Хакер Новости...


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

docker export CONTAINER_ID > my_container.tar

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


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

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

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

вы также можете опустить один из docker-machine config sub-shells, чтобы использовать текущий docker-host по умолчанию.

docker save <image> | docker $(docker-machine config <mach>) load чтобы скопировать изображение из текущего docker-host в mach

или

docker $(docker-machine config <mach>) save <image> | docker load копировать из mach к текущему докеру-хосту.


Я предполагаю, что вам нужно сохранить 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, etc.

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

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

наконец, запустить чтобы проверить, что изображение теперь доступно.

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

пожалуйста подробный пост.


все остальные ответы очень полезны. Я просто прошел через ту же проблему и выяснил простой способ с docker machine scp.

так как Докер машина v0.3.0, scp был введен для копирования файлов с одной машины Docker на другую. Это очень удобно, если вы хотите скопировать файл с локального компьютера на удаленную машину Docker, такую как AWS EC2 или Digital Ocean, потому что машина Docker заботится о учетных данных SSH для вас.

  1. Сохранить Изображение используя docker save как:

    docker save -o docker-images.tar app-web
    
  2. копировать изображения с помощью докер-машина scp

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

предположим, что ваш удаленный Докер машина remote-machine и каталог, который вы хотите, чтобы файл tar был /home/ubuntu.

  1. загрузить изображение Docker

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

для передачи изображений из локальной установки Docker в мини-куб VM:

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

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

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

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

```
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

до tar кладет содержание на stdin которое можно схватить мимо docker load.


вот как вы можете перемещать изображения 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.


docker-push-ssh - это утилита командной строки для этого сценария.

он устанавливает временный частный реестр докеров на сервере, устанавливает SSH-туннель от вашего localhost, толкает ваш образ, а затем очищает после себя.

преимущество этого подхода над docker save (на момент написания большинства ответов используется этот метод) заключается в том, что только новые слои подталкиваются к серверу, что приводит к гораздо более быстрой загрузке.

Oftentimes используя промежуточные реестра dockerhub является нежелательным и обременительным.

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

установка:

pip install docker-push-ssh

пример:

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

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

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

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


прежде всего, Docker изображения (настройки изображения) доступны через концентратор изображений Docker (или использовать предыдущий метод для экспорта). Кстати, если вы ищете способ переместить или скопировать контейнер Docker (докер ps-a). Возможным решением является использование следующей команды:

docker container export [options] CONTAINER ID -o given-name.tar

например:

docker ps -a

Sample output

docker container export cf54f5423a66 -o cf54f5423a66.tar

делая это, вы можете сохранить изменения в следующем развертывание. Для получения дополнительной информации обратитесь к документация Docker


Я думаю, что лучшим вариантом было бы войти в Docker Hub и нажать изображение там.

первая часть вашего имени изображения (перед косой чертой) должна соответствовать вашему нику на Docker Hub, вторая часть-ваше желаемое имя приложения и чем тег (версия).

результат: brilliance643 / nagios: finalv

результат: вы сможете получить доступ к вашему имиджу, просто

$docker run -ti -d brilliance643/nagios:finalv

из любой части Вселенной.