Answers:
您将需要将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
repo:tag
用作图像参考,而不是image id
。如果使用image id
,则加载的图像将不会保留标签(您将不得不执行另一步骤来标记图像)。
docker images
,然后使用docker tag DESIREDIMAGEID mycompany/myreponame
。如果您的图像ID为591de551d6e4,则可以缩写该图像ID:docker tag 59 mycompany/myreponame
通过SSH传输Docker映像,并即时bzip内容:
docker save <image> | bzip2 | \
ssh user@host 'bunzip2 | docker load'
pv
将管道置于管道中间以查看传输过程也是一个好主意:
docker save <image> | bzip2 | pv | \
ssh user@host 'bunzip2 | docker load'
docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) load
在机器mach1和mach2之间复制映像。
eval $(docker-machine env dev)
适合与单个docker 主机进行常规通信,但不能在两台机器之间进行复制,因为这涉及两个不同的docker主机/ docker机器。
ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
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文件的内容(即图像)。有任何想法吗?
跑
docker images
查看主机上的图像列表。假设您有一个名为awesomesauce的图像。在终端中,cd
将图像导出到的目录。现在运行:
docker save awesomesauce:latest > awesomesauce.tar
将tar文件复制到拇指驱动器或其他驱动器,然后将其复制到新的主机。
现在,从新主机执行:
docker load < awesomesauce.tar
现在去喝咖啡,阅读黑客新闻 ...
docker save [image] -o file.tar
和docker load -i file.tar
避免这种情况!
docker save [image] -o file.tar
也似乎要快得多
要扁平导出容器的文件系统,请使用;
docker export CONTAINER_ID > my_container.tar
使用cat my_container.tar | docker import -
导入所述图像。
cat my_container.tar | docker import - my_container:new
根据cmd帮助在本地导入
当使用泊坞窗机,您可以复制机之间的图像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-host复制到 mach
要么
docker $(docker-machine config <mach>) save <image> | docker load
复制mach
到当前的docker-host。
我假设您需要保存couchdb-cartridge
的图像ID为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文件复制到新的码头工人的实例,例如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
请找到这个详细的帖子。
要将映像从本地Docker安装传输到minikube VM:
docker save <image> | (eval $(minikube docker-env) && docker load)
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
最大的警告是您必须手动将localhost添加到Docker的insecure_registries
配置中。运行该工具一次,它将给您一个提示错误:
Error Pushing Image: Ensure localhost:5000 is added to your insecure registries.
More Details (OS X): /programming/32808215/where-to-set-the-insecure-registry-flag-on-mac-os
所有其他答案都非常有帮助。我只是遇到了同样的问题,并想出了一个简单的方法docker machine scp
。
自Docker Machine v0.3.0起,引入了scp将文件从一台Docker计算机复制到另一台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
我想移动所有带有标签的图像。
```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
```
说明:
首先OUT
获取所有标签,但用新行分隔。Second OUTPUT
获取数组中的所有标签。第三,$(echo "${OUTPUT[*]}")
将所有标记放在一个docker save
命令中,以便所有图像都在单个tar中。
此外,可以使用gzip将其压缩。按目标运行:
tar xvf images.tar.gz -O | docker load
-O
选项tar
将内容放在stdin上,可以被docker load
。
用于执行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"