Как скопировать изображения 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 для вас.
-
Сохранить Изображение используя
docker save
как:docker save -o docker-images.tar app-web
-
копировать изображения с помощью докер-машина scp
docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
предположим, что ваш удаленный Докер машина remote-machine
и каталог, который вы хотите, чтобы файл tar был /home/ubuntu
.
-
загрузить изображение 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
docker container export cf54f5423a66 -o cf54f5423a66.tar
делая это, вы можете сохранить изменения в следующем развертывание. Для получения дополнительной информации обратитесь к документация Docker
Я думаю, что лучшим вариантом было бы войти в Docker Hub и нажать изображение там.
первая часть вашего имени изображения (перед косой чертой) должна соответствовать вашему нику на Docker Hub, вторая часть-ваше желаемое имя приложения и чем тег (версия).
результат: brilliance643 / nagios: finalv
результат: вы сможете получить доступ к вашему имиджу, просто
$docker run -ti -d brilliance643/nagios:finalv
из любой части Вселенной.