无法下载外网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最重要的特性就是可扩展性,把各种程序 ...
随机推荐
- springboot-mybatis集成pagehelper分页插件
1.引入jar包(示例) implementation group: 'com.github.pagehelper', name: 'pagehelper-spring-boot-starter', ...
- [iOS] 对 UItableView 等界面(ClipsToBounds) 同时使用 圆角和阴影
展示内容的界面会被 ClipsToBounds = YES(按边缘剪切),但同时需要圆角和阴影效果. 一个界面,ClipsToBounds = YES 之后,阴影会被剪切,不再展示. 感觉只能使用多个 ...
- python基础篇 12-函数+文件读写+json练习作业
需求: 写一个管理商品的程序,商品文件格式在a.json里面 提供商品的增删改查功能 choice = input('请输入你的选择:1.查看商品 2.新增商品 3.修改商品 4.删除商品') #1. ...
- base64EncodedStringWithOptions iOS
// 64位编码//先将string转换成dataNSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];NSData *base ...
- 笔记:vue.nextTick()方法的使用详解
vue.nextTick定义: 在下次DOM更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的DOM. 简单理解:数据更新了,在dom渲染后立即执行该函数 举例 注意:Vue实 ...
- mysql查询mapper返参类型为List
List<String> lists = mapper.select(); 返参类型为List,查询没有数据的时候,lists不会为null,lists.size() 为 0.
- UnsupportedOperationException异常
看看下面的例子,这样输出什么呢? public class test { public static void main(String[] args) { String arr = "ab, ...
- 配置IDE
1.使用的ide Visual Studio Code 2.
- C语言基础 DAY1
程序的三种基本控制结构及其相关概念 1.C语言的三种基本结构 顺序结构:从头到尾一句接着一句的执行下来,直到执行完最后一句: 选择结构:到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行 ...
- uniapp中使用echarts关系图
首先看一下页面效果: <template> <view class="page"> <!-- 导航栏 --> <b-nav-bar cla ...