最近捣鼓k8s,虽然在本机安装了Clash
,但在虚拟机还是遇到了无法下载镜像的问题,幸运的是在宿主机先可以下载镜像,那么只要解决了将宿主机的镜像发送到虚拟机就可以啦。
查了下资料,摸索了一番,实践后总结下。
首先在一台可以下载的或者已经下载了镜像的电脑上进行如下操作,假如镜像是:domain/repository/name:version
# 查找目标的 image-id
docker images ps
# 根据 image-id 进行保存
docker save image-id > target.tar
此时就是将镜像导出为target.tar
了,接下来就是将这个文件发送到目标机器了,有如下几种方法
这里我拿阿里云的容器服务举例。
docker login --username=liuch****@outlook.com registry.cn-hang
官方的命令是加了sudo的,如果你当前用户不是root用户,那么请加上sudo。
加了sudo的情况下,第一次一定要输入你root账户的密码,第二次才是你设置的docker密码。
我当年在这里被卡了不少时间,血泪经验。
adopt
举例docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/uewell/adoptopenjdk:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/uewell/adoptopenjdk:[镜像版本号]
如果你的仓库并非公开的,你需要在目标机器进行登录。
docker login --username=liuch****@outlook.com registry.cn-hang
然后pull
docker pull registry.cn-hangzhou.aliyuncs.com/uewell/adoptopenjdk:[镜像版本号]
最后tag重新打上标签
# 查看目标的id
docker images
# 根据原始的信息进行打标签即可
docker tag [ImageId] domain/repository/name:version
当然你也可以通过scp
的方式进行传输
# 其中root可以省略,默认是当前所在主机环境的用户
scp target.tar root@node-243:/home/
# 省略的写法
scp target.tar node-243:/home/
利用load
加载
## 在目标服务器执行load,此时是none
docker load < target.tar
加载完成后利用docker images
会发现为none的镜像。如果你系统有多个none,你可以查看之前的镜像id来进行确认。
最后打上原始的标签,那么就算搞定了
# 根据原始的信息进行打标签即可
docker tag [ImageId] domain/repository/name:version
## 比如我当时用到的
docker tag 16d2f904b0d8 quay.io/external_storage/nfs-client-provisioner:latest
该做法是利用export
一个在运行的容器,将其反导出为镜像,该方法导出的镜像会缺失镜像历史。
docker export furious_bell > /home/myubuntu-export-1204.tar
docker import - /home/myubuntu-export-1204.tar
Across the Great Wall we can reach every corner in the world.