前言

Docker用起来非常爽,尤其是用于DevOps实践时。但是,当你在国内或者本地拉取镜像时,经常会碰到各种“便秘”——要么镜像拉取缓慢,要么时断时连,要么连接超时!

当我们的镜像又比较大时(比如某人在代码里面丢了个魔兽争霸的包),这简直是一个噩梦!那么如何解决这个问题?接下来我们就主要从以下几个方面来解决这个问题:

  • 使用镜像加速器
  • 换源
  • 自己做镜像推送到国内仓库
  • 自己搭建就近镜像仓库
  • 最后的绝招(保密)

镜像加速器

玩网游卡都可以祭出加速器,镜像拉取通用有相关的加速器。国内的云厂商基本上都提供了镜像加速器:

Docker Hub 镜像加速器列表

镜像加速器 镜像加速器地址 专属加速器 其它加速
Docker 中国官方镜像 https://registry.docker-cn.com   Docker Hub
DaoCloud 镜像站 http://f1361db2.m.daocloud.io 可登录,系统分配 Docker Hub
Azure 中国镜像 https://dockerhub.azk8s.cn   Docker Hub、GCR、Quay
科大镜像站 https://docker.mirrors.ustc.edu.cn   Docker Hub、GCRQuay
阿里云 https://.mirror.aliyuncs.com 需登录,系统分配 Docker Hub
七牛云 https://reg-mirror.qiniu.com   Docker Hub、GCR、Quay
网易云 https://hub-mirror.c.163.com   Docker Hub
腾讯云 https://mirror.ccs.tencentyun.com   Docker Hub

如何使用镜像加速器呢?

Docker Hub 镜像加速器配置

Linux系统可以执行以下Shell:

配置了之后,可以通过“docker info”命令来查看是否生效:

如果是Windows 10呢?可以在如下图所示的界面处配置:

换源

加速器用起来非常爽,但是很多时候某些镜像就算是配置了加速器也不好使(可能和加速器的国际带宽有关系),这个时候就必须换源了。毕竟加速器不是万能的,尤其是当你的镜像比较大的时候。这时候你就要找合适的源了。

比如.NET Core 的SDK镜像,我们可以统一使用Azure中国的镜像源,如下表所示,我们看到“mcr.microsoft.com”在国内对应的代理为“mcr.azk8s.cn”:

global proxy in China format example
dockerhub (docker.io) dockerhub.azk8s.cn dockerhub.azk8s.cn//: dockerhub.azk8s.cn/microsoft/azure-cli:2.0.61 dockerhub.azk8s.cn/library/nginx:1.15
gcr.io gcr.azk8s.cn gcr.azk8s.cn//: gcr.azk8s.cn/google_containers/hyperkube-amd64:v1.13.5
quay.io quay.azk8s.cn quay.azk8s.cn//: quay.azk8s.cn/deis/go-dev:v1.10.0
mcr.microsoft.com mcr.azk8s.cn mcr.azk8s.cn//: mcr.azk8s.cn/oss/kubernetes/hyperkube:v1.15.7

因此,我们可以使用“mcr.azk8s.cn”来替代官方提供的“mcr.microsoft.com”源:

# docker pull  mcr.microsoft.com/dotnet/core/sdk:2.2-stretch
docker pull mcr.azk8s.cn/dotnet/core/sdk:2.2-stretch

如上述代码所示,我们将Azure国际的源换成了Azure中国的源,拉包速度就会飞快。换源了,意味着我们也需要将Dockerfile的命令也进行修改:

#FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
#修改为Azure中国镜像
FROM mcr.azk8s.cn/dotnet/core/sdk:2.2-stretch AS build

自己做镜像推送到国内仓库

有源的还还说,要是没源怎么办?那总不能凉拌吧?那就自己做吧。可以基于GitHub托管,Azure DevOps和Docker hub进行海外构建,然后将镜像推送到国内的镜像仓库之中。如下面这个开源库,用于构建项目中使用的aspnetcore的运行时公共基础镜像,同时提供了腾讯云公共镜像和Docker Hub公共镜像以供国内外使用:
https://github.com/xin-lai/aspnetcore-docker

相关镜像标签说明

标签名称 说明
latest 最新镜像,当前为3.1
2.2 Asp.Net Core Runtime 2.2
2.2withfonts Asp.Net Core Runtime 2.2 (包含字体)
3.0 Asp.Net Core Runtime 3.0
3.1 Asp.Net Core Runtime 3.1

然后,仅需在Dockerfile中替换为自己的源即可,即可享受快的飞起:

#说明见:https://github.com/xin-lai/aspnetcore-docker
FROM ccr.ccs.tencentyun.com/magicodes/aspnetcore-runtime:.2withfonts AS base

这里分享一个技巧:Linux下使用apt装包很多时候非常缓慢而且不靠谱,有时候换成国内的代理也很不靠谱,这时候可以考虑使用海外构建,做成镜像。

自己搭建就近镜像仓库

服务器带宽不行,本地网络不佳,怎么办?还能怎么办,自己搭建仓库吧。这里推荐使用nexus,nexus可以托管各种包,包括Docker、Nuget、Jar、npm、Bower等等包,简直不要太犀利了。如何搭建?Yaml常考如下:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
labels:
k8s-app: nexus
name: nexus
namespace: default
spec:
progressDeadlineSeconds:
replicas:
revisionHistoryLimit:
selector:
matchLabels:
k8s-app: nexus
strategy:
type: Recreate
template:
metadata:
labels:
k8s-app: nexus
spec:
containers:
- image: sonatype/nexus3
imagePullPolicy: IfNotPresent
name: nexus
resources:
limits:
cpu: ""
memory: 5024Mi
requests:
cpu: 10m
memory: 256Mi
volumeMounts:
- mountPath: /nexus-data
name: data
restartPolicy: Always
nodeName: k8s-node1 #强制约束将Pod调度到指定的Node节点上
terminationGracePeriodSeconds: #Pod结束时等待时长(单位为秒)
volumes:
- name: data
hostPath: #使用主机目录
path: /var/nexus
hostNetwork: true
---
apiVersion: v1
kind: Service
metadata:
name: nexus
namespace: default
spec:
ports:
- name: tcp--
nodePort:
port:
protocol: TCP
targetPort:
- name: tcp--
nodePort:
port:
protocol: TCP
targetPort:
- name: tcp--
nodePort:
port:
protocol: TCP
targetPort:
- name: tcp--
nodePort:
port:
protocol: TCP
targetPort:
- name: tcp--
nodePort:
port:
protocol: TCP
targetPort:
- name: tcp--
nodePort:
port:
protocol: TCP
targetPort:
selector:
k8s-app: nexus
sessionAffinity: None
type: NodePort

最后的绝招

还不行,用U盘复制吧。别说认识我。你不信可以通过U盘复制?可以去了解下以下两个命令:

  • docker save
  • docker load


如何让Docker镜像飞起来的更多相关文章

  1. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

  2. MySQL、MongoDB、Redis数据库Docker镜像制作

    MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...

  3. 理解Docker(2):Docker 镜像

    本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  4. 如何合并两个Docker 镜像

    http://www.open-open.com/lib/view/open1437746544709.html 在你的机器上使用docker pull来从Docker Hub下载镜像. docker ...

  5. Docker镜像的管理和创建

    1. Docker镜像和Docker容器:      Docker镜像实际上是一系列的文件系统,通常的Linux系统一般是两层文件系统,bootfs和rootfs,bootfs就是bootloader ...

  6. docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储

    前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,cli ...

  7. docker使用阿里云Docker镜像库加速

    官方镜像下载实在是慢,于是开通了阿里云开发者帐号, 官方帮助 阿里云Docker镜像库 阿里云容器Hub服务:http://dev.aliyun.com/search.html 来自云端的容器Hub服 ...

  8. 第四章 使用Docker镜像和仓库(二)

    第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...

  9. 第四章 使用Docker镜像和仓库

    第4章 使用Docker镜像和仓库 回顾: 回顾如何使用 docker run 创建最基本的容器 $sudo docker run -i -t --name another_container_mum ...

随机推荐

  1. 解决sendmail发送邮件慢的问题

    sendmail默认会先监听本机的邮件服务,如果本机邮件服务访问不了,在访问其他的邮件服务器 自己测试将本机主机名(通过hostname命令查看)从/etc/hosts中删除,发送邮件的速度就非常快了 ...

  2. 大厂面试题:集群部署时的分布式 session 如何实现?

    面试官心理分析 面试官问了你一堆 dubbo 是怎么玩儿的,你会玩儿 dubbo 就可以把单块系统弄成分布式系统,然后分布式之后接踵而来的就是一堆问题,最大的问题就是分布式事务.接口幂等性.分布式锁, ...

  3. VUE实现Studio管理后台(一):鼠标拖放改变窗口大小

    近期改版RXEditor,把改版过程,用到的技术点,记录下来.昨天完成了静态页面的制作,制作过程并未详细记录,后期已经不愿再补了,有些遗憾.不过工作成果完整保留在github上,地址:https:// ...

  4. 从头认识js-js的发展历史

    JavaScript简介 JavaScript诞生于1995年,当时,它的主要目的是处理以前有服务端语言(如Perl)负责的一些输入验证操作. JavaScript简史 1995年2月当时就职于Net ...

  5. Safari配置WebApp----添加启动图和桌面图标让你的WebApp在ios设备上体验如原生一样

    现在很多开发者的Web应用程序的设计样式和交互类似本机应用程序,例如,它的缩放比例适合iOS上的整个屏幕.当用户将其添加到主屏幕时,您可以通过使其看起来像本机应用程序一样,在iOS上为您的Web应用程 ...

  6. 一起了解 .Net Foundation 项目 No.15

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. NUnit Test Fr ...

  7. Linux——如何将Red Hat Enterprise Linux 6的语言改为中文?

    第一步,打开终端,输入su -,获取超级用户权限,输入密码. 第二步,输入cd /etc/sysconfig,进入设置目录. 第三步,输入vi i18n,进入到配置文件. 第四步,按 ‘i’键,进入编 ...

  8. JavaScript的类数组

    类数组对象啊,被人问到它跟真正的数组对象有什么差别啊?说不上来就老埋汰了,只知道函数的arguments对象是个类数组对象,也有length属性,其他呢?干货奉上: 首先先说说数组吧: 1,当有新的元 ...

  9. C# 简单地使用下 音频解码器Bass.Net

    在C#中有许多音频播放的方案,例如WinForm里调用系统自带MediaPlayer的COM组件和WPF的MediaPlayer(实质上还是WindowsMediaPlayer) 以及一堆API播放和 ...

  10. DEV GridControl控件使用(CheckBox全选、操作按钮、事件处理,获取值)

    1.GridControl控件使用 (1)绑定数据源 //绑定DataTable gridControl1.DataSource = DbHelper.ExecuteDataTable("S ...