如何在不使用存储库的情况下将Docker镜像从一台机器传输到另一台机器,无论是私有还是公共?
我习惯在VirtualBox中播放和创建自己的图像,当它完成后,我尝试部署到其他机器以实际使用 .
由于它基于自己的映像(如Red Hat Linux),因此无法从Dockerfile重新创建它 .
我可以使用简单的命令吗?或另一种解决方案
似乎保存/导出可以实现类似的目的,请参阅What is the difference between save and export in Docker?,我更喜欢 save
命令 .
14 回答
docker-push-ssh
是仅适用于此方案的命令行实用程序 .它在服务器上设置临时私有Docker注册表,从您的localhost Build SSH隧道,推送您的图像,然后自行清理 .
这种方法优于
docker save
(在撰写大多数答案时都使用此方法)的好处是只有新层被推送到服务器,从而可以更快地上传 .通常使用像dockerhub这样的中间注册表是不可取的,也很麻烦 .
https://github.com/coherenceapi/docker-push-ssh
安装:
例:
docker-push-ssh -i ~/my_ssh_key username@myserver.com my-docker-image
最大的警告是你必须手动将本地主机添加到Docker的
insecure_registries
配置中 . 运行一次该工具,它会给你一个信息错误:Where should I set the '--insecure-registry' flag on Mac OS?
你可以使用
sshfs
:我假设您需要保存
couchdb-cartridge
,其图像ID为7ebc8510bc2c:将archiveName映像保存到tar文件 . 我将使用
/media/sf_docker_vm/
来保存图像 .使用环境中的任何方法将archiveName.tar文件复制到新的Docker实例,例如
FTP
,SCP
等 .在新的Docker实例上运行
docker load
命令并指定映像tar文件的位置 .最后,运行
docker images
命令检查图像现在是否可用 .请找到detailed post .
您需要将Docker镜像保存为tar文件:
然后使用常规文件传输工具(如
cp
或scp
)将图像复制到新系统 . 之后,您必须将图像加载到Docker中:PS:您可能需要
sudo
所有命令 .编辑:您应该使用-o添加文件名(而不仅仅是目录),例如:
通过SSH传输Docker镜像,即时压缩内容:
将
pv
放在管道中间以查看传输的进展情况也是一个好主意:(有关
pv
的更多信息:home page,man page) .对于容器文件系统的扁平导出,请使用;
docker export CONTAINER_ID > my_container.tar
使用
cat my_container.tar | docker import -
导入所述图像 .使用docker-machine时,可以
docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load
在机器mach1
和mach2
之间复制图像 .当然你也可以在中间贴上
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 .所有其他答案都非常有用 . 我刚刚经历了同样的问题,并找到了一个简单的方法
docker machine scp
.自Docker Machine v0.3.0起,引入了scp将文件从一台Docker机器复制到另一台机器 . 如果您希望将文件从本地计算机复制到远程Docker计算机(如AWS EC2或Digital Ocean),这非常方便,因为Docker Machine正在为您处理SSH凭据 .
docker save
保存图像:假设您的远程Docker机器是
remote-machine
,并且您希望tar文件所在的目录是/home/ubuntu
.要将映像从本地Docker安装传输到minikube VM:
我想用标签移动所有图像 .
OUT=$(docker images --format '{}:{}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
说明:
首先
OUT
获取所有标签,但用新行分隔 . 第二个OUTPUT
获取数组中的所有标记 . 第三个$(echo "${OUTPUT[*]}")
将所有标签放在一个docker save
命令中,以便所有图像都在一个tar中 .此外,这可以使用gzip压缩 . 在目标上,运行:
-O
tar
的选项将内容放在stdin上,可以被docker load
抓取 .要将映像保存到任何文件路径或共享NFS位置,请参阅以下示例 .
通过执行以下操作获取图像ID:
假设您有一个id为“matrix-data”的图像 .
使用id保存图像:
将映像从路径复制到任何主机 . 现在使用以下命令导入到本地Docker安装:
这是您可以在两个远程寄存器/存储库之间移动Docker映像的方法 . 它适用于Docker 1.10.2版,构建c3959b1 .
如果要将映像迁移到AWS ECS / ECR服务,这是一种方便的方法 .
第一将Docker镜像保存为zip文件:
然后使用以下命令将导出的图像加载到Docker:
跑
查看主机上的图像列表 . 假设您有一张名为awesomesauce的图片 . 在终端中,
cd
到要将图像导出到的目录 . 现在运行:将tar文件复制到拇指驱动器或其他任何内容,然后将其复制到新的主机 .
现在从新主机做:
现在去喝杯咖啡,阅读Hacker News ...