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

Lar*_*Cai 1181 docker

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

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

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

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

看来save/export可以达到类似的目的,看看Docker中保存和导出有什么区别?,我更喜欢save我的情况下的命令.

Dai*_*wei 2008

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

docker save -o <path for generated tar file> <image name>
Run Code Online (Sandbox Code Playgroud)

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

docker load -i <path to image tar file>
Run Code Online (Sandbox Code Playgroud)

PS:您可能需要rsync所有命令.

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

docker save -o c:/myfile.tar centos:16
Run Code Online (Sandbox Code Playgroud)

  • 这是*图像*的更好答案. (21认同)
  • 另外,最好使用`repo:tag`作为图像参考而不是`image id`.如果使用`image id`,加载的图像将不会保留标记(您必须执行另一步标记图像). (16认同)
  • 要进行标记,请首先使用“ docker images”标识IMAGE ID,然后使用“ docker tag DESIREDIMAGEID mycompany / myreponame”。如果您的映像ID为591de551d6e4,则可以缩写映像ID:`docker tag 59 mycompany / myreponame`。 (3认同)
  • 我使用了图像 id 而不是 name:tag 现在我坐在这里,加载图像并有一个用于存储库和标签的 &lt;none&gt; 。恢复名称和标签的正确方法是什么?@wisbucky (2认同)
  • @serge 一点也不,它甚至有一个使用 Windows 路径的示例...... (2认同)

kol*_*pto 536

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

docker save <image> | bzip2 | \
     ssh user@host 'bunzip2 | docker load'
Run Code Online (Sandbox Code Playgroud)

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

docker save <image> | bzip2 | pv | \
     ssh user@host 'bunzip2 | docker load'
Run Code Online (Sandbox Code Playgroud)

(更多信息pv:主页,手册页).

  • 使用docker-machine时,可以执行`docker $(docker-machine config mach1)save <image> | docker $(docker-machine config mach2)load`在机器之间复制图像*mach1*和*mach2*. (19认同)
  • 反向执行此操作(远程到本地):`ssh target_server'docker save image:latest | bzip2'| pv | bunzip2 | 码头工人负载` (13认同)
  • @manojlds`eval $(docker-machine env dev)`适用于与单个docker主机的一般通信,但不能在两台机器之间进行复制,因为这涉及两个不同的docker主机/ docker机器. (5认同)
  • 当docker在目标机器上需要sudo时,有没有办法做到这一点?我试过(没有压缩)`docker save my_img:v1 | ssh -t -t my_user @ my_machine sudo docker load`.如果没有"-t"开关,sudo会抱怨_sudo:对不起,你必须有一个tty来运行sudo_; 使用一个"-t"它是相同的消息,因为ssh说_Pseudo-terminal将不会被分配,因为stdin不是终端._最后,有两个"-t",我得到tar文件的内容(即在我的终端上.有任何想法吗? (2认同)
  • @JosefStark 我需要在编辑 sudoers 文件时添加“默认值:&lt;目标用户名&gt; !requiretty”以阻止来自 sudo 的“抱歉”消息。我不知道它有多大区别,但我也将 user@host 之后的所有内容都放在引号中(因此“[...] | ssh user@host 'bunzip2 | sudo docker load'”)。 (2认同)

Soh*_*han 87

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

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

sudo docker images
Run Code Online (Sandbox Code Playgroud)

假设您有一个id为"matrix-data"的图像.

使用id保存图像:

sudo docker save -o /home/matrix/matrix-data.tar matrix-data
Run Code Online (Sandbox Code Playgroud)

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

sudo docker load -i <path to copied image file>
Run Code Online (Sandbox Code Playgroud)


vit*_*ets 45

您可以使用带有DOCKER_HOST变量的单行:

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是我一直在寻找的命令,我认为这个答案值得更多的爱 (8认同)
  • 先决条件:远程(ssh-copy-id)上的 ssh 凭据设置以及本地和远程用户都需要位于 docker 组中(sudo usermod -aG docker $USER) (2认同)
  • 这里的“ssh user@remotehost docker load”有什么(性能)差异吗? (2认同)
  • @Mouagip我对两者进行了比较,这个(`DOCKER_HOST=ssh://user@remotehost docker load`)似乎比`ssh user@remotehost docker load`快一点。在我的设置中,与耗时约 1 分 50 秒的过程相比,差异约为 5-10 秒。(我多次对这两个选项进行计时) (2认同)

Tar*_*aji 40

通过gzip命令保存和加载docker镜像的最快方法:

docker save <image_id> | gzip > image_file.tgz
Run Code Online (Sandbox Code Playgroud)

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

docker load -i image_file.tgz
Run Code Online (Sandbox Code Playgroud)

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

docker image tag <image_id> <image_path_name>:<version>
Run Code Online (Sandbox Code Playgroud)

例如:

docker image tag 4444444 your_docker_or_harbor_path/ubuntu:14.0
Run Code Online (Sandbox Code Playgroud)


Dam*_*ran 29

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

docker save <docker image name> | gzip > <docker image name>.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

zcat <docker image name>.tar.gz | docker load
Run Code Online (Sandbox Code Playgroud)

  • 对于加载,`docker load <my-image.tar.gz`就足够了.图像会自动解压缩为gzip,bzip2和xz. (7认同)

Nei*_*rdi 25

docker images
Run Code Online (Sandbox Code Playgroud)

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

docker save awesomesauce:latest > awesomesauce.tar
Run Code Online (Sandbox Code Playgroud)

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

现在从新主机做:

docker load < awesomesauce.tar
Run Code Online (Sandbox Code Playgroud)

现在去喝咖啡看看黑客新闻 ...

  • 值得一提的是,只有在同一OS上执行保存和加载时,此方法才有效。使用docker save [image] -o file.tar和docker load -i file.tar可以避免这种情况! (3认同)
  • @AndreasForslöw 为什么使用管道意味着它只能在同一操作系统上运行? (2认同)

Kav*_*eri 17

保存所有图像的最佳方法是这样的:

docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allimages.tar
Run Code Online (Sandbox Code Playgroud)

上面的代码将保存所有图像allimages.tar加载图像,请转到保存图像的目录并运行以下命令:

docker load -i allimages.tar
Run Code Online (Sandbox Code Playgroud)

只需确保在PowerShell中而不是在命令提示符中使用此命令


Pan*_*los 15

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

docker export CONTAINER_ID > my_container.tar

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

  • 它应该是`cat my_container.tar | docker import - my_container:new`如果根据cmd帮助在本地导入 (9认同)
  • 这更像是备份正在运行的容器而不是部署映像. (7认同)

qui*_*997 15

真实世界的例子

#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




Run Code Online (Sandbox Code Playgroud)

  • 为什么在做任何事情之前要停止 docker 服务? (4认同)

mat*_*ann 14

使用docker-machine时,您可以mach1在机器mach2和机器之间复制图像pv.

当然,你也可以坚持docker-machine config到中间获得一个progess指标:

mach.

您也可以省略其中一个mach子shell,以使用当前的默认docker-host.

mach1 将图像从当前的docker-host复制到 mach2

要么

pvdocker-machine config当前的docker-host 复制到.


tk_*_*tk_ 9

我假设您需要保存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
Run Code Online (Sandbox Code Playgroud)

将archiveName映像保存到tar文件.我将用它/media/sf_docker_vm/来保存图像.

stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar
Run Code Online (Sandbox Code Playgroud)

复制使用archiveName.tar文件到您的新的码头工人实例任何方法工作在你的环境中,例如FTP,SCP等等.

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

stratos@Dev-PC:~$ docker load < /media/sf_docker_vm/archiveName.tar
Run Code Online (Sandbox Code Playgroud)

最后,运行该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
Run Code Online (Sandbox Code Playgroud)

请找到这个详细的帖子.


Bry*_*sen 9

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

docker save <image> | (eval $(minikube docker-env) && docker load)
Run Code Online (Sandbox Code Playgroud)


brt*_*ury 8

docker-push-ssh 是我为此场景创建的命令行实用程序。

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

这种方法的优势docker save(在编写大多数答案时都使用此方法)是,只有新的层被推送到服务器,从而可以更快地上传。

通常不希望使用诸如dockerhub之类的中间注册表,而且很麻烦。

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

安装:

pip install docker-push-ssh
Run Code Online (Sandbox Code Playgroud)

例:

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): /sf/ask/2296575081/
Run Code Online (Sandbox Code Playgroud)

我应该在Mac OS的哪里设置“ --insecure-registry”标志?


Pen*_*eng 7

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

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

  1. 使用以下方式保存图像docker save:

    docker save -o docker-images.tar app-web
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用docker-machine scp复制图像

    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    
    Run Code Online (Sandbox Code Playgroud)

假设您的远程Docker机器remote-machine和您希望tar文件所在的目录/home/ubuntu.

  1. 加载Docker镜像

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    
    Run Code Online (Sandbox Code Playgroud)

  • 为什么不只是'scp &lt;source&gt; &lt;remote&gt;'? (4认同)

run*_*ier 6

如果您在 Windows 计算机上工作并向 Linux 计算机上传命令,例如

docker save <image> | ssh user@host docker load
Run Code Online (Sandbox Code Playgroud)

如果您使用 powershell 将不起作用,因为它似乎会在输出中添加一个附加字符。如果您使用 cmd(命令提示符)运行该命令,它将起作用。附带说明一下,您还可以使用 Chocolatey 安装 gzip,并且以下操作也可以在 cmd 中运行。

docker save <image> | gzip | ssh user@host docker load
Run Code Online (Sandbox Code Playgroud)


Yos*_*shi 5

根据 @kolypto 的答案,这对我来说非常有用,但仅适用sudo于 docker load:

docker save <image> | bzip2 | pv | ssh user@host sudo docker load
Run Code Online (Sandbox Code Playgroud)

或者如果您没有/不想安装光伏:

docker save <image> | bzip2 | ssh user@host sudo docker load
Run Code Online (Sandbox Code Playgroud)

无需手动压缩或类似操作。


归档时间:

查看次数:

514643 次

最近记录:

5 年,12 月 前