这样简单地的设置一下,可以让你的让Docker镜像起飞


本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等

一、前言

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

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

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

二、镜像加速器

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

Docker Hub 镜像加速器列表

这样简单地的设置一下,可以让你的让Docker镜像起飞

如何使用镜像加速器呢?

Docker Hub 镜像加速器配置

Linux系统可以执行以下Shell:

这样简单地的设置一下,可以让你的让Docker镜像起飞

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

这样简单地的设置一下,可以让你的让Docker镜像起飞

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

Windows 10配置

这样简单地的设置一下,可以让你的让Docker镜像起飞

三、换源

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

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

这样简单地的设置一下,可以让你的让Docker镜像起飞

因此,我们可以使用“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进行海外构建,然后将镜像推送到国内的镜像仓库之中。

相关镜像标签说明

这样简单地的设置一下,可以让你的让Docker镜像起飞

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

#说明见:https://github.com/xin-lai/aspnetcore-docker
FROM ccr.ccs.tencentyun.com/magicodes/aspnetcore-runtime:2.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: 600
  replicas: 1
  revisionHistoryLimit: 10
  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: "2"
            memory: 5024Mi
          requests:
            cpu: 10m
            memory: 256Mi
        volumeMounts:
        - mountPath: /nexus-data
          name: data
      restartPolicy: Always
      nodeName: k8s-node1 #强制约束将Pod调度到指定的Node节点上
      terminationGracePeriodSeconds: 30 #Pod结束时等待时长(单位为秒)
      volumes:
        - name: data
          hostPath:   #使用主机目录
            path: /var/nexus
      hostNetwork: true
---
apiVersion: v1
kind: Service
metadata:
  name: nexus
  namespace: default
spec:
  ports:
  - name: tcp-8081-8081
    nodePort: 30081
    port: 8081
    protocol: TCP
    targetPort: 8081
  - name: tcp-8082-8082
    nodePort: 30082
    port: 8082
    protocol: TCP
    targetPort: 8082
  - name: tcp-8083-8083
    nodePort: 30083
    port: 8083
    protocol: TCP
    targetPort: 8083
  - name: tcp-8084-8084
    nodePort: 30084
    port: 8084
    protocol: TCP
    targetPort: 8084
  - name: tcp-8085-8085
    nodePort: 30085
    port: 8085
    protocol: TCP
    targetPort: 8085
  - name: tcp-8086-8086
    nodePort: 30086
    port: 8086
    protocol: TCP
    targetPort: 8086
  selector:
    k8s-app: nexus
  sessionAffinity: None
  type: NodePort

六、最后的绝招

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

  • docker save
  • docker load

来源:https://blog.51cto.com/14637764/2507576


码神部落- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与码神部落立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者爷依然萧洒码神部落享有帖子相关版权。
3、码神部落管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者爷依然萧洒码神部落的同意。
5、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任。
6、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
7、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意。

最新回复 (0)
    • 码神部落
      2
        立即登录 立即注册 GitHub登录
返回
发新帖
作者最近主题: