如何在不使用存储库的情况下将Docker镜像从一台计算机传输到另一台计算机,无论是私有还是公共?
我习惯在VirtualBox中播放和创建自己的图像,当它完成后,我尝试部署到其他机器上以便真正使用。
由于它基于自己的映像(如Red Hat Linux),因此无法从Dockerfile重新创建它。
我可以使用简单的命令吗?还是另一种解决方案?
似乎保存/导出可以达到类似目的,请参阅 What is the difference between save and export in Docker? ,我更喜欢save
命令。
答案 0 :(得分:1727)
您需要将Docker镜像保存为tar文件:
docker save -o <path for generated tar file> <image name>
然后使用常规文件传输工具(例如cp
或scp
)将图像复制到新系统。之后,您必须将图像加载到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'
答案 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)
使用泊坞机时,您可以在机器mach1
和mach2
之间复制图像:
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实例,例如FTP
,SCP
等。
在新的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凭据。
使用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
答案 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服务,这是一种方便的方法。