一个计算机技术爱好者与学习者

0%

好好学Docker:Docker镜像迁移/分享

1. 问题描述

在没有外网的情况下,怎样把 docker image 分享给局域网的其他用户?

解决办法有两个:

  • 1)搭建本地镜像仓库
  • 2)导出导入镜像

2. 搭建本地镜像仓库

搭建本地镜像仓库,把镜像push到本地镜像仓库,其他机器pull即可。

搭建本地镜像仓库方法参考:《Harbor入门篇》《Docker镜像站的配置和使用》

假设需求为本机有镜像 busybox:1.25,现在想要把这个镜像分享给其他机器。

1、有镜像的机器执行:

1
2
3
docker tag busybox:1.25 harbor.voidking.com/base/busybox:1.25
docker login harbor.voidking.com
docker push harbor.voidking.com/base/busybox:1.25

2、其他机器执行:

1
2
docker pull harbor.voidking.com/base/busybox:1.25
docker tag harbor.voidking.com/base/busybox:1.25 busybox:1.25

3. 导出导入镜像

导出导入镜像,主要依赖docker savedocker load命令。

3.1. 单个镜像出导入

假设需求为本机有镜像 busybox:1.25,现在想要把这个镜像分享给其他机器。

1、有镜像的机器导出镜像

1
docker save -o busybox.tar busybox:1.25

2、拷贝压缩包到其他机器

3、其他机器导入镜像

1
docker load -i busybox.tar

3.2. 全部镜像导出导入

假设需求为本机有很多个镜像,现在想要把这些镜像全部导出到其他机器。

1、有镜像的机器导出所有镜像

1
docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o all.tar

2、拷贝压缩包到其他机器

3、其他机器导入镜像

1
docker load -i all.tar

3.3. docker save/load存在的问题

这种导出导入存在一个问题:导入后的镜像,不会作为base layer。

已知:A主机上docker save了一个镜像X,拷贝到B主机后,B主机上docker load了镜像X。接着A主机上基于镜像X做了一个镜像Y,上传到harbor。
问题:B主机上docker pull拉取harbor中的镜像Y,会全量拉取镜像吗?

理论上,不会全量拉取镜像,只会增量拉取。
但是实测第一次拉取依然会全量拉取Y。神奇的是,如果执行过docker rmi Y,再次拉取Y确实会变成增量拉取。
暂时不知道原因,待解。

参考文档: