首页 文章

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

提问于
浏览
826

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

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

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

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

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

14 回答

  • 0

    docker-push-ssh 是仅适用于此方案的命令行实用程序 .

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

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

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

    https://github.com/coherenceapi/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
    

    Where should I set the '--insecure-registry' flag on Mac OS?

  • 1471

    你可以使用 sshfs

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

    我假设您需要保存 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
    

    将archiveName映像保存到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 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
    

    请找到detailed post .

  • 12

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

    通过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) .

  • 419

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

    docker export CONTAINER_ID > my_container.tar

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

  • 76

    使用docker-machine时,可以 docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load 在机器 mach1mach2 之间复制图像 .

    当然你也可以在中间贴上 pv 以获得一个progess指标:

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

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

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

    要么

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

  • 21

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

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

    • 使用 docker save 保存图像:
    docker save -o docker-images.tar app-web
    
    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    

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

    • 加载Docker镜像
    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    
  • 17

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

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

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

    OUT=$(docker images --format '{}:{}')
    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
    

    -O tar 的选项将内容放在stdin上,可以被 docker load 抓取 .

  • 7

    要将映像保存到任何文件路径或共享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>
    
  • 7

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

    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服务,这是一种方便的方法 .

  • 2

    第一将Docker镜像保存为zip文件:

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

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

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

    docker images
    

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

    docker save awesomesauce:latest > awesomesauce.tar
    

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

    现在从新主机做:

    docker load < awesomesauce.tar
    

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

相关问题