无法下载外网Docker镜像的解决方案
概述
在安装k8s相关组件时经常会遇到需要下载一些外网的Docker镜像仓库,比如k8s的一个NFS存储类k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner
,国内的网络环境下无法使用docker pull
将这些镜像拉取下来,而且在主流的国内镜像站里也找不到这些镜像仓库,这时候我们就需要想其他的办法来解决了,下面介绍两种相对比较简单的方法。
解决方案
1、使用能访问外网的云服务器
购买一个中国香港及其他境外地域的云服务器,从云服务器中下载好镜像再打包上传到我们自己的服务器上去。这里以腾讯云的轻量应用服务器为例,相对于常规的云服务器会便宜一些,以下示例是在新加坡的一台包月服务器上操作的。
首先登陆我们可以访问外网的云服务器,安装并验证Docker环境,安装教程参见在CentOS中安装Docker。
安装好Docker环境之后,我们正常拉取我们需要的镜像
docker pull k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
查看镜像是否拉取成功
docker images
拉取成功后,将我们的镜像打包保存为一个本地文件
docker save -o nfs-subdir-external-provisioner:v4.0.2.tar k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
打包完成后我们会得到一个tar文件,这里为nfs-subdir-external-provisioner:v4.0.2.tar
至此云服务器的作用到此结束,我们通过XFTP或者其他工具将这个文件包下载到本地即可。
接下来我们开始将下载下来的镜像文件上传到我们需要部署的服务器上去,同样可以使用XFTP或者其他工具进行上传。
上传到我们自己的服务器上后,开始准备导入镜像,导入前请确认已经正确安装了Docker环境
docker load -i nfs-subdir-external-provisioner_v4.0.2.tar
至此我们的镜像就导入完毕了,使用docker images
命令再次检查我们的镜像列表,已经可以看到我们之前无法拉取到的那个镜像了,跟直接docker pull
下来是一样的,最后在每一台服务器上重复上述导入操作即可。
2、使用阿里云容器镜像服务+GitHub
上述第一种方法比较简单,但是需要购买第三方的服务器,如果没有特别合适的服务器的话可以采用第二种方法,使用阿里云容器镜像服务+GitHub仓库构建自己的镜像版本,可能稍微复杂一点,但是也很简单。
首先我们登陆GitHub创建一个自己的公有仓库,比如这边我就创建了一个叫做mirror的公开的空仓库
创建好仓库之后,按照个人的喜好开始准备创建对应Dockerfile,以下就按照原始镜像的全名创建对应的路径,便于使用和查找。例如,这边我们就在仓库的根目录创建了/k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner/v4.0.2
文件夹,文件夹里只有一个Dockerfile
文件,内容只有一句话,就是FROM
+我们需要拉取的镜像名称,如下所示
FROM k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
GitHub截图如下,也可以通过以下地址查看本文的实例:nfs-subdir-external-provisioner/v4.0.2/Dockerfile
GitHub的仓库创建完毕,并且提交了相应的Dockerfile文件之后,在GitHub上的操作就结束了。
接下来我们访问阿里云的容器镜像服务网站进行注册登陆:https://cr.console.aliyun.com
登陆成功后,自行选择创建个人或者企业实例
创建好实例之后,进入对应的实例,然后创建一个命名空间,根据自己的用途取一个名字
创建好命名空间之后,根据我们的需要任意选择一个地区,然后开始创建镜像仓库。选择我们刚才创建的命名空间,并且设置仓库的名称,也就是我们要下载的docker镜像的名称,最好与官方镜像保持一致
设置好仓库的基本信息之后,下一步就是要关联到我们刚才创建并提交了Dockerfile的GitHub仓库,注意一定要勾选海外机器构建,因为我们要拉取海外服务器的镜像
镜像创建完毕之后,我们进入构建页面,点击添加规则,选择我们刚才提交的代码分支,以及上下文目录和Dockerfile文件名,以及镜像版本号,建议版本号跟原始镜像保持一致,以免管理混乱。
规则添加完毕之后,我们就可以点击立即构建开始构建我们自己的docker镜像了
等待构建完成之后,进入基本信息页面,直接复制这个公有网址就可以进行镜像拉取了
在我们自己要部署的服务器上拉取镜像,记得加上我们之前打的版本号
docker pull registry.cn-beijing.aliyuncs.com/nosrc/nfs-subdir-external-provisioner:v4.0.2
输出结果如下
v4.0.2: Pulling from nosrc/nfs-subdir-external-provisioner
60775238382e: Pull complete
528677575c0b: Pull complete
Digest: sha256:374f80dde8bbd498b1083348dd076b8d8d9f9b35386a793f102d5deebe593626
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/nosrc/nfs-subdir-external-provisioner:v4.0.2
registry.cn-beijing.aliyuncs.com/nosrc/nfs-subdir-external-provisioner:v4.0.2
再次使用docker images
命令查看我们的本地镜像仓库
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-beijing.aliyuncs.com/nosrc/nfs-subdir-external-provisioner v4.0.2 932b0bface75 12 months ago 43.8MB
这个时候我们可以直接使用我们自己的镜像进行部署了registry.cn-beijing.aliyuncs.com/nosrc/nfs-subdir-external-provisioner:v4.0.2
如果你对镜像的名称有强依赖的要求,那么可以使用以下命令创建一个新的标签,名称和标签名都和官方镜像的一样,注意第三个参数为docker images
命令中输出的镜像的IMAGE ID
,根据实际情况进行修改
docker tag 932b0bface75 k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
操作完毕之后,再次使用docker images
查看我们本地的镜像仓库,可以看到已经有了一个和官方镜像一样的本地镜像了,此时就可以当做官方的镜像正常使用了。
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner v4.0.2 932b0bface75 12 months ago 43.8MB
registry.cn-beijing.aliyuncs.com/nosrc/nfs-subdir-external-provisioner v4.0.2 932b0bface75 12 months ago 43.8MB