1. 问题描述
在没有外网的情况下,怎样把 docker image 分享给局域网的其他用户?
解决办法有两个:
- 1)搭建本地镜像仓库
- 2)导出导入镜像
2. 搭建本地镜像仓库
搭建本地镜像仓库,把镜像push到本地镜像仓库,其他机器pull即可。
搭建本地镜像仓库方法参考:《Harbor入门篇》 和 《Docker镜像站的配置和使用》
假设需求为本机有镜像 busybox:1.25,现在想要把这个镜像分享给其他机器。
1、有镜像的机器执行:
1 | docker tag busybox:1.25 harbor.voidking.com/base/busybox:1.25 |
2、其他机器执行:
1 | docker pull harbor.voidking.com/base/busybox:1.25 |
3. 导出导入镜像
导出导入镜像,主要依赖docker save
和docker 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确实会变成增量拉取。
暂时不知道原因,待解。
参考文档: