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

我在VirtualBox中创建了自己的映像,完成后,我尝试部署到其他机器上以获得实际使用。

由于它基于我自己的镜像(如Red Hat Linux),因此无法从Dockerfile中重新创建。我的dockerfile不容易移植。

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


当前回答

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

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

说明:

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

此外,这可以使用gzip压缩。在目标上运行:

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

-tar的O选项将内容放在stdin上,docker加载可以获取这些内容。

其他回答

dockerpushssh是我为这个场景创建的命令行实用程序。

它在服务器上建立一个临时的私有Docker注册表,从本地主机建立一个SSH隧道,推送映像,然后自行清理。

与docker save相比,这种方法的好处(在编写答案时,大多数答案都使用这种方法)是,只有新的层被推送到服务器,从而导致更快的上传。

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

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

安装:

pip install docker-push-ssh

例子:

docker推ssh-i~/my_shkeyusername@myserver.com我的码头工人形象

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

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上的何处设置“--不安全注册表”标志?

真实世界示例

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

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




保存所有图像的最佳方法如下:

docker save $(docker images --format '{{.Repository}}:{{.Tag}}') -o allimages.tar

以上代码将保存allimages.tar中的所有图像,要加载图像,请转到保存图像的目录并运行以下命令:

docker load -i allimages.tar

只需确保在PowerShell中而不是在Commad Prompt中使用此命令

通过gzip命令保存和加载docker图像的最快方法:

docker save <image_id> | gzip > image_file.tgz

要在另一台服务器上加载压缩图像,请立即使用此命令,它将被识别为压缩图像:

docker load -i image_file.tgz

要重命名或重新标记图像,请使用:

docker image tag <image_id> <image_path_name>:<version>

例如:

docker image tag 4444444 your_docker_or_harbor_path/ubuntu:14.0

Run

docker images

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

docker save awesomesauce:latest > awesomesauce.tar

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

现在从新主机开始:

docker load < awesomesauce.tar

现在去喝杯咖啡,看看黑客新闻。。。