如何在不使用存储库的情况下将Docker映像从一台机器传输到另一台机器,无论是私有还是公共的?

我在VirtualBox中创建了自己的映像,完成后,我尝试部署到其他机器上以获得实际使用。

由于它基于我自己的镜像(如Red Hat Linux),因此无法从Dockerfile中重新创建。我的dockerfile不容易移植。

有没有简单的命令可以使用?还是另一种解决方案?


当前回答

执行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"

其他回答

要将映像保存到任何文件路径或共享NFS位置,请参阅以下示例。

通过执行以下操作获取图像id:

docker images

假设您有一个id为“矩阵数据”的图像。

使用id保存图像:

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

将图像从路径复制到任何主机。现在使用以下方法导入本地Docker安装:

docker load -i <path to copied image file>

您需要将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

1.从注册表中提取图像或存储库。

docker pull[选项]名称[:TAG|@DIGEST]

2.将其保存为.tar文件。

docker save[选项]图像[图像…]

例如:

docker pull hello-world
docker save -o hello-world.tar hello-world

我想移动所有带标签的图像。

```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
``` 

说明:

First OUT获取所有标记,但用新行分隔。第二个OUTPUT获取数组中的所有标记。第三个$(echo“${OUTPUT[*]}”)为单个docker save命令放置所有标记,以便所有图像都在一个tar中。

此外,这可以使用gzip压缩。在目标上运行:

tar xvf images.tar.gz -O | docker load

-tar的O选项将内容放在stdin上,docker加载可以获取这些内容。

dockerpushssh是我为这个场景创建的命令行实用程序。

它在服务器上建立一个临时的私有Docker注册表,从本地主机建立一个SSH隧道,推送映像,然后自行清理。

与docker save相比,这种方法的好处(在编写答案时,大多数答案都使用这种方法)是,只有新的层被推送到服务器,从而导致更快的上传。

通常,使用像dockerhub这样的中间注册表是不可取的,而且很麻烦。

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

安装:

pip install docker-push-ssh

例子:

docker推ssh-i~/my_shkeyusername@myserver.com我的码头工人形象

最大的警告是,您必须手动将本地主机添加到Docker的insecure_registrys配置中。运行该工具一次,它会给您一个信息性错误:

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

我应该在Mac OS上的何处设置“--不安全注册表”标志?