如何在不使用存储库的情况下将Docker映像从一台主机复制到另一台主机

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

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

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

有没有我可以使用的简单命令?或者其他解决方案?

1072284 次浏览

对于容器文件系统的扁平化导出,请使用;

docker export CONTAINER_ID > my_container.tar

使用cat my_container.tar | docker import -导入所述图像。

您需要将Docker映像保存为tar文件:

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

然后使用常规文件传输工具(如cpscprsync(大文件首选))将您的映像复制到新系统。之后,您必须将映像加载到Docker中:

docker load -i <path to image tar file>

PS:您可能需要sudo所有命令。

编辑:您应该使用-o添加文件名(不仅仅是目录),例如:

docker save -o c:/myfile.tar centos:16

我假设你需要保存couchdb-cartridge,它的图像ID为7ebc8510bc2c:

stratos@Dev-PC:~$ docker imagesREPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZEcouchdb-cartridge                      latest              7ebc8510bc2c        17 hours ago        1.102 GB192.168.57.30:5042/couchdb-cartridge   latest              7ebc8510bc2c        17 hours ago        1.102 GBubuntu                                 14.04               53bf7a53e890        3 days ago          221.3 MB

将存档名称图像保存到tar文件中。我将使用/media/sf_docker_vm/来保存图像。

stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

使用环境中可用的任何方法将archiveName.tar文件复制到新的Docker实例,例如FTPSCP等。

在新的Docker实例上运行docker load命令并指定映像tar文件的位置。

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

最后,运行docker images命令检查图像现在是否可用。

stratos@Dev-PC:~$ docker imagesREPOSITORY                             TAG        IMAGE ID         CREATED             VIRTUAL SIZEcouchdb-cartridge                      latest     7ebc8510bc2c     17 hours ago        1.102 GB192.168.57.30:5042/couchdb-cartridge   latest     bc8510bc2c       17 hours ago        1.102 GBubuntu                                 14.04      4d2eab1c0b9a     3 days ago          221.3 MB

请找到这个详细的帖子

通过 SSH 传输 Docker 图像,动态压缩内容:

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

请注意,docker load自动为您解压缩图像。它支持 gzipbzip2xz

pv放在管道的中间也是一个好主意,可以看到传输的进展情况:

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

(更多关于 pv: 主页手册的信息)。

来自@Thomas Steinbach 的重要提示: 在高带宽下,bzip的压缩速度不够快。如果你可以上传10MB/s 或更多,gzip/gunzip会比 bzip2快得多。

如果你使用的是3 g 网络,而且你的网速很慢,那么 @ jgmjgm建议你可以使用 xz,因为它提供了更高的压缩比。

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

通过以下操作获得图像 ID:

docker images

假设您有一个 id 为“ Matrix-data”的图像。

用 id 保存图像:

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

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

docker load -i <path to copied image file>

其他的答案都很有帮助。我刚刚经历了同样的问题,并找到了一个简单的方法与 docker machine scp

自 Docker Machine v0.3.0以来,引入了 scp 将文件从一台 Docker 计算机复制到另一台计算机。如果您希望将文件从本地计算机复制到远程 Docker 计算机(如 AWS EC2或 Digital Ocean) ,这非常方便,因为 Docker 计算机将为您处理 SSH 凭据。

  1. 使用 docker save保存您的图像,如:

    docker save -o docker-images.tar app-web
    
  2. Copy images using docker-machine scp

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

Assume your remote Docker machine is remote-machine and the directory you want the tar file to be is /home/ubuntu.

  1. Load the Docker image

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

首先将 Docker 映像保存到一个压缩存档中:

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

然后使用以下命令将导出的图像加载到 Docker:

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

在使用 docker-machine 时,您可以使用以下方法在机器 mach1mach2之间复制图像:

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-host,您还可以省略一个 docker-machine config子 shell。

docker save <image> | docker $(docker-machine config <mach>) load

将图像从当前的 Docker-host 复制到 mach

或者

docker $(docker-machine config <mach>) save <image> | docker load

mach复制到当前的 Docker-host。

快跑

docker images

查看主机上的图像列表。假设您有一个名为 太棒了的图像。在终端中,将 cd导出到要将映像导出到的目录。快跑:

docker save awesomesauce:latest > awesomesauce.tar

将 tar 文件复制到 U 盘或其他什么上,然后将其复制到新的主机计算机上。

新主持人说:

docker load < awesomesauce.tar

现在去喝杯咖啡,读读 黑客新闻..。

要将本地 Docker 安装的映像传输到 minikube 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

选项 -Otar把内容放在标准进程,可以抓取的 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

最大的警告是必须手动将本地主机添加到 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

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

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

您可以使用带有 DOCKER_HOST变量的一行程序:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load

真实世界的例子

#host1
systemctl stop docker
systemctl start docker
docker commit -p 1d09068ef111 ubuntu001_bkp3
#create backup
docker save -o ubuntu001_bkp3.tar ubuntu001_bkp3


#upload ubuntu001_bkp3.tar to my online drive
aws s3 cp ubuntu001_bkp3.tar s3://mybucket001/




#host2
systemctl stop docker
systemctl start docker
cd /dir1


#download ubuntu001_bkp3.tar from my online drive
aws s3 cp s3://mybucket001/ubuntu001_bkp3.tar /dir1


#restore backup
cat ./ubuntu001_bkp3.tar  | docker load
docker run --name ubuntu001 -it ubuntu001_bkp3:latest bash
docker ps -a
docker attach ubuntu001








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

Docker pull [ OPTIONS ] NAME [ : TAG |@Digest ]

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

码头保存[选项]图像[图像... ]

例如:

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

如果您正在使用 Windows 计算机并将其上载到 Linux 计算机命令,例如

docker save <image> | ssh user@host docker load

如果您使用的是 powershell,那么它将不能工作,因为它似乎向输出添加了一个额外的字符。如果您使用 cmd (命令提示符)运行该命令,它将工作。另外,你也可以使用 Chocolatey 安装 gzip,以下内容也可以在 cmd 中使用。

docker save <image> | gzip | ssh user@host docker load

根据@kolypto 的回答,这个方法对我很有效,但只适用于码头装载的 sudo:

docker save <image> | bzip2 | pv | ssh user@host sudo docker load

或者如果你没有/不想安装 pv:

docker save <image> | bzip2 | ssh user@host sudo docker load

不需要手动拉链或类似。

通过 Gzip命令保存和加载 Docker 映像的最快方法:

docker save <image_id> | gzip > image_file.tgz

要在另一台服务器上加载压缩图像,请使用“立即”命令,它将被识别为压缩图像:

docker load -i image_file.tgz

重命名或重新标记图像使用:

docker image tag <image_id> <image_path_name>:<version>

例如:

docker image tag 4444444 your_docker_or_harbor_path/ubuntu:14.0

最好的方法 拯救所有的图像是这样的:

docker save $(docker images --format '\{\{.Repository}}:\{\{.Tag}}') -o allimages.tar

以上代码将保存所有的图像在 allimages.tar装弹的图像去的目录,您保存的图像和运行这个命令:

docker load -i allimages.tar

只要确保在 动力外壳中使用这些命令,而不是在 Cmd