驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
docker的导入和导出
/  

docker的导入和导出

开篇

最近捣鼓k8s,虽然在本机安装了Clash,但在虚拟机还是遇到了无法下载镜像的问题,幸运的是在宿主机先可以下载镜像,那么只要解决了将宿主机的镜像发送到虚拟机就可以啦。

查了下资料,摸索了一番,实践后总结下。

正文

首先在一台可以下载的或者已经下载了镜像的电脑上进行如下操作,假如镜像是:domain/repository/name:version

# 查找目标的 image-id
docker images ps
# 根据 image-id 进行保存
docker save image-id > target.tar

此时就是将镜像导出为target.tar了,接下来就是将这个文件发送到目标机器了,有如下几种方法

  • 利用阿里云镜像仓库中转后,手动设置tag。优势就是存储好之后可以持续利用。
  • 利用scp或者其他方式将镜像传输到目标主机。优势就是简单方便,但是如果机器很多,那么就稍微麻烦些。

阿里云中转

这里我拿阿里云的容器服务举例。

  • 首先,你需要在你的阿里云上开通容器服务,个人版是免费的。
  • 开通后,设置自己的账户名和密码,注意这个不是你的阿里云账号和密码。
  • 然后在终端进行登录,命令如下所示
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.

骐骥一跃,不能十步。驽马十驾,功在不舍。