无法下载外网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
无法下载外网Docker镜像的解决方案的更多相关文章
- golang包管理工具及环境管理工具;如何下载外网的依赖包
简介: golang的包管理工具类似于java的maven.python的pip.js的npm,可以实现依赖包的统一管理:有很多:govendor.godep.glide,挑一个自己喜欢的用吧.mac ...
- golang module 下载外网资源失败解决办法
用 golang 1.11 module 特性时,需要下载golang.org等外网地址的库文件 可以创建环境变量GOPROXY,使用Aliyun的镜像 go公共代理文档 简介 go module公共 ...
- 外网访问XAMPP失败 解决方案
xampp 访问出现New XAMPP security concept 收藏 New XAMPP security concept: Access to the requested director ...
- 阿里云centos7成功安装和启动nginx,但是外网访问不了的解决方案
问题环境: 阿里云centos7.4.1708 问题描述:成功配置,启动成功,外网访问不了 解决方案: 经过查阅文档,去阿里云后台查看,原来是新购的服务器都加入和实例安全组. (OMG)立即去配置.加 ...
- 使用 Docker 镜像构建 GO 语言环境
1. 安装 Docker 我当前使用的系统环境是 CentOS7 ,安装 Docker 使用的命令是 yum install docker*.至于其它系统,可以到百度查找其对应的安装方式. 2. 配置 ...
- 慕课网--docker走进第一个javaweb应用
zh docker镜像就是一系列文件的集合 docker 容器就是一个进程.将docker镜像运行起来就是一个docker容器 docker仓库就是存储docker镜像的 1.docker的安装 do ...
- (转)内网网站发布到外网-nat123动态公网IP动态域名解析
环境描述: 路由器分配的是动态公网IP,且有路由器登录管理权限,网站服务器部署在路由器内部网络.如何将内网网站发布到外网大众访问? 解决方案: 内网使用nat123动态域名解析,将域名实时固定解析到路 ...
- ubuntu连有线网 无法连接外网
问题:连上网线后,有ip,但是无法访问外网. 我的解决方案是: .通过命令行ifconfig命令查看以太网(即网线插口)的名称,如下图,'enp3s0'是网线插口(Ethernet以太网): zhum ...
- debian官网qcow2镜像修改root账号密码,开启ssh等
1.下载官网qcow2镜像文件 wget http://172.16.20.10/vmtemplate/KVM/wangrui/Debian/debian-10.2.0-openstack-amd64 ...
- 使用 mysql 的 Docker 镜像
使用 mysql 的 Docker 镜像 前言 之前搞了很多都是手工在操作系统的镜像中安装使用 mysql,作为自己折腾也就算了,作为实际使用实为不妥:Docker最重要的特性就是可扩展性,把各种程序 ...
随机推荐
- react 学习笔记更新
生命周期 插槽 组件中间内容用this.props.children访问 是否组件更新 shouldcompontsupdata(props,newstatus){ return false: } 父 ...
- javascript向tabale中动态添加数据
<table width="600" border="1" cellspacing="0"> <thead> < ...
- NOI模板复习组——图论部分
1.最小生成树: kruscal: #include <cstdio> #include <cmath> #include <cstring> #include & ...
- JS实现异步的方法:回调函数callback、事件监听、setTimeout、Promise、生成器Generators/yield、async/awt
所有异步任务都是在同步任务执行结束之后,从任务队列中依次取出执行. 回调函数是异步操作最基本的方法,比如AJAX回调,回调函数的优点是简单.容易理解和实现,缺点是不利于代码的阅读和维护,各个部分之间高 ...
- count(1) and count(*),count(字段)区别及效率比较
执行结果: count(1)和count(*)之间没有区别,因为count(*)count(1)都不会去过滤空值, count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况.即不统 ...
- wavesurfer音波插件之播放指定语音片段
使用wavesurfer音波插件时,可能会用到这么一个功能,点击音转文后的某一句文字,则需要在音波条上进行播放这一段录音,恰好wavesurfer插件自带这么一个功能,直接上代码: <scrip ...
- Spring Cloud学习记录
Eureka和zookeeper都是注册中心为什么zookeeper不适合? 1.CAP原则.一致性,可用性,分区容错性,最多满足两种.zookeeper遵循CP原则,实际项目中不应该为了一致性失去可 ...
- solidworks卸载方法,怎么完全彻底卸载删除清理干净solidworks各种残留注册表和文件?
标题:solidworks重新安装方法,利用卸载清理工具完全彻底排查删除干净solidworks各种残留注册表和文件.solidworks显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎 ...
- centos7 升级gcc
#安装gcc yum install -y gcc-c++ autoconf automake #centos7 默认的 gcc 默认是4.8.5,版本小于 5.3 无法编译,需要先安装gcc新版 ...
- 电脑日常维护技巧(windows系统)
一.磁盘检测 cmd-->chkdsk 二.磁盘修复 cmd-->sfc/scannow 三.删除缓存文件 运行-->%temp%