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

时间:2014-05-29 13:57:19

标签: docker

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

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

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

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

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

17 个答案:

答案 0 :(得分:1727)

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

答案 1 :(得分:489)

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

答案 2 :(得分:81)

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

答案 3 :(得分:26)

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

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

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

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

答案 4 :(得分:22)

运行

docker images

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

docker save awesomesauce:latest > awesomesauce.tar

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

现在来自新主持人:

docker load < awesomesauce.tar

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

答案 5 :(得分:16)

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

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

答案 6 :(得分:14)

使用泊坞机时,您可以在机器mach1mach2之间复制图像:

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

当然,您也可以将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 load

mach复制到当前的docker-host。

答案 7 :(得分:14)

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

docker export CONTAINER_ID > my_container.tar

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

答案 8 :(得分:9)

我假设您需要保存图像ID为7ebc8510bc2c的couchdb-cartridge

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

答案 9 :(得分:8)

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

var source = require('./source');
var sinon = require('sinon');
var expect = require('chai').expect;

sinon.stub(source, 'myFunc').returns(true);
source.myFunc();
expect(sinon).to.be.true;

答案 10 :(得分: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
    
  2. 使用docker-machine scp

    复制图像
    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    
  3. 假设您的远程Docker计算机为remote-machine,并且您希望tar文件所在的目录为/home/ubuntu

    1. 加载Docker镜像

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

答案 11 :(得分:5)

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

最大的警告是,您必须手动将localhost添加到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?

答案 12 :(得分:1)

您可以使用sshfs

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

答案 13 :(得分:1)

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

```
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
-O

tar选项将内容放在stdin上,可以由docker load抓取。

答案 14 :(得分:1)

执行Docker保存和加载功能的脚本(经过测试):

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"

Docker负载:

#!/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"

答案 15 :(得分:0)

真实世界的例子

#host1
systemctl stop docker
systemctl start docker
docker commit -p 1d09068ef111 ubuntu001_bkp3
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


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




答案 16 :(得分:-2)

这是您可以在两个远程寄存器/存储库之间移动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服务,这是一种方便的方法。

相关问题