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

问题描述 投票:962回答:14

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

我习惯在VirtualBox中播放和创建自己的图像,当它完成后,我尝试部署到其他机器以实现真正的用途。

由于它基于自己的映像(如Red Hat Linux),因此无法从Dockerfile重新创建它。

我可以使用简单的命令吗?或另一种解决方案

似乎保存/导出可以达到类似的目的,请参阅What is the difference between save and export in Docker?,我更喜欢save命令。

docker
14个回答
1677
投票

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

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

然后使用常规文件传输工具(如cpscp)将图像复制到新系统。之后,您将不得不将图像加载到Docker中:

docker load -i <path to image tar file>

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

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

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

7
投票

所有其他答案都非常有帮助。我刚刚经历了同样的问题,并找到了一个简单的方法与docker save <image> | (eval $(minikube docker-env) && docker load)

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

  1. 使用docker machine scp保存图像,如: docker save
  2. 使用docker save -o docker-images.tar app-web 复制图像 docker-machine scp

假设您的远程Docker机器是docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu ,您希望tar文件所在的目录是remote-machine

  1. 加载Docker镜像 /home/ubuntu

5
投票

docker-machine ssh remote-machine sudo docker load -i docker-images.tar 是一个仅适用于此场景的命令行实用程序。

它在服务器上设置临时私有Docker注册表,从您的localhost建立SSH隧道,推送您的图像,然后自行清理。

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

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

docker save

安装:

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

例:

pip install docker-push-ssh

最大的警告是你必须手动将本地主机添加到Docker的docker-push-ssh -i ~/my_ssh_key [email protected] my-docker-image配置中。运行一次该工具,它将为您提供信息错误:

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



1
投票

我想用标签移动所有图像。

$ 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[*]}")命令中,以便所有图像都在一个tar中。

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

docker save

tar xvf images.tar.gz -O | docker load -O选项将内容放在stdin上,可以被tar抓住。


-2
投票

这是您可以在两个远程寄存器/存储库之间移动Docker映像的方法。它适用于Docker 1.10.2版本,构建c3959b1。

docker load

如果要将映像迁移到AWS ECS / ECR服务,这是一种方便的方法。


474
投票

通过SSH传输Docker镜像,即时压缩内容:

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

pv放在管道中间以查看转移的进展情况也是一个好主意:

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

(有关pv的更多信息:home pageman page)。


80
投票

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

通过执行以下操作获取图片ID:

sudo docker images

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

使用id保存图像:

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

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

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

26
投票

首先将Docker镜像保存为zip文件:

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

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

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

22
投票

docker images

查看主机上的图像列表。假设您有一张名为awesomesauce的图片。在您的终端中,cd到您要将图像导出到的目录。现在运行:

docker save awesomesauce:latest > awesomesauce.tar

将tar文件复制到拇指驱动器或其他任何内容,然后将其复制到新的主机。

现在从新主机做:

docker load < awesomesauce.tar

现在去喝咖啡,阅读Hacker News ...


14
投票

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

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

当然你也可以在中间贴上qazxsw poi以获得进度指示器:

pv

您也可以省略其中一个docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load 子shell,以使用当前的默认docker-host。

docker-machine config

将图像从当前的docker-host复制到docker save <image> | docker $(docker-machine config <mach>) load

要么

mach

docker $(docker-machine config <mach>) save <image> | docker load 复制到当前的docker-host。


13
投票

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

mach

使用docker export CONTAINER_ID > my_container.tar导入所述图像。


9
投票

我假设您需要保存图像ID为7ebc8510bc2c的cat my_container.tar | docker import -

couchdb-cartridge

将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 7ebc8510bc2c 17 hours ago 1.102 GB ubuntu 14.04 53bf7a53e890 3 days ago 221.3 MB 来保存图像。

/media/sf_docker_vm/

使用环境中适用的任何方法将archiveName.tar文件复制到新的Docker实例,例如stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar FTP等。

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

docker load

最后,运行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


8
投票

要将映像从本地Docker安装传输到minikube VM:

detailed post
© www.soinside.com 2019 - 2024. All rights reserved.