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

How to copy Docker images from one host to another without using a repository

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

我习惯于在virtualbox中播放和创建自己的映像,当它完成后,我会尝试部署到其他机器上以获得真正的使用。

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

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

保存/导出似乎可以达到类似的目的,看看Docker中的保存和导出有什么区别?我更喜欢用save命令来处理我的案件。


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

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

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

1
docker load -i <path to image tar file>

附:你可能需要所有的命令。

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

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


通过ssh传输docker映像,bzipping内容在运行中:

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

最好将pv放在管道的中间,以查看传输情况:

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

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


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

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

1
sudo docker images

假设你有一个ID为"矩阵数据"的图像。

用ID保存图像:

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

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

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

首先将Docker映像保存到zip文件:

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

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

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


1
docker images

查看主机上的图像列表。假设你有一个叫冬虫夏草酱的形象。在您的终端中,cd将图像导出到要将其导出到的目录。现在运行:

1
docker save awesomesauce:latest > awesomesauce.tar

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

现在从新主机开始:

1
docker load < awesomesauce.tar

现在去喝杯咖啡,阅读黑客新闻…


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

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

当然,你也可以把pv放在中间,得到进程指示:

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

您也可以省略其中一个子shell docker-machine config以使用当前默认的docker主机。

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

将图像从当前Docker主机复制到mach

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

mach复制到当前的docker主机。


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

docker export CONTAINER_ID > my_container.tar

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


我想您需要保存图像ID为7EBC8510BC2C的couchdb-cartridge

1
2
3
4
5
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/保存图像。

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

使用在您的环境中工作的任何方法(例如FTPscp等)将archivename.tar文件复制到新的docker实例。

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

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

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

1
2
3
4
5
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虚拟机:

1
docker save <image> | (eval $(minikube docker-env) && docker load)

所有其他答案都非常有用。我也遇到了同样的问题,并且找到了一个简单的方法来处理docker machine scp

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

  • 使用docker save保存图像,如:

    1
    docker save -o docker-images.tar app-web
  • 使用Docker机器SCP复制图像

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

  • 加载Docker映像

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

  • docker-push-ssh是一个命令行实用程序,仅用于此场景。

    它在服务器上建立了一个临时的私有Docker注册表,在本地主机上建立了一个ssh通道,推送您的映像,然后自己清理。

    docker save相比,这种方法的好处在于(在编写大多数答案时都使用这种方法),只有新的层被推到服务器上,从而加快了上传速度。

    通常使用中间注册表(如DockerHub)是不可取的,而且很麻烦。

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

    安装:

    1
    pip install docker-push-ssh

    例子:

    docker-push-ssh -i ~/my_ssh_key [email protected] my-docker-image

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

    1
    2
    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上的"--不安全注册表"标志?


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

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

    说明:

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

    此外,还可以使用gzip对其进行压缩。在目标上,运行:

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

    tar-O选项将内容放在stdin上,可由docker load获取。


    您可以使用sshfs

    1
    2
    $ sshfs user@ip:/<remote-path> <local-mount-path>
    $ docker save <image-id> > <local-mount-path>/myImage.tar

    这就是如何在两个远程寄存器/存储库之间移动Docker映像。它与Docker版本1.10.2、构建c3959b1一起工作。

    1
    2
    3
    docker pull source-registry.com/myProject/myImageName:1.0.0
    docker tag source-registry.com/myProject/myImageName:1.0.0 target-remote-registry.com/myProject/myImageName:1.0.0
    docker push target-remote-registry.com/myProject/myImageName:1.0.0

    如果您想将图像迁移到一个AWS ECS/ECR服务,这是一个方便的方法。