当前位置:   article > 正文

如何让Docker镜像飞起来

microsoft/dotnet:2.1-sdk 如何拉取镜像

前言

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

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

  • 使用镜像加速器

  • 换源

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

  • 自己搭建就近镜像仓库

  • 最后的绝招(保密)

镜像加速器

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


Docker Hub 镜像加速器列表

如何使用镜像加速器呢?


Docker Hub 镜像加速器配置

Linux系统可以执行以下Shell:

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

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

换源

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

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

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

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

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

  1. #FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
  2. #修改为Azure中国镜像
  3. 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.2Asp.Net Core Runtime 2.2
2.2withfontsAsp.Net Core Runtime 2.2 (包含字体)
3.0Asp.Net Core Runtime 3.0
3.1Asp.Net Core Runtime 3.1

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

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

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


自己搭建就近镜像仓库

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

  1. apiVersion: apps/v1beta2
  2. kind: Deployment
  3. metadata:
  4. labels:
  5. k8s-app: nexus
  6. name: nexus
  7. namespace: default
  8. spec:
  9. progressDeadlineSeconds: 600
  10. replicas: 1
  11. revisionHistoryLimit: 10
  12. selector:
  13. matchLabels:
  14. k8s-app: nexus
  15. strategy:
  16. type: Recreate
  17. template:
  18. metadata:
  19. labels:
  20. k8s-app: nexus
  21. spec:
  22. containers:
  23. - image: sonatype/nexus3
  24. imagePullPolicy: IfNotPresent
  25. name: nexus
  26. resources:
  27. limits:
  28. cpu: "2"
  29. memory: 5024Mi
  30. requests:
  31. cpu: 10m
  32. memory: 256Mi
  33. volumeMounts:
  34. - mountPath: /nexus-data
  35. name: data
  36. restartPolicy: Always
  37. nodeName: k8s-node1 #强制约束将Pod调度到指定的Node节点上
  38. terminationGracePeriodSeconds: 30 #Pod结束时等待时长(单位为秒)
  39. volumes:
  40. - name: data
  41. hostPath: #使用主机目录
  42. path: /var/nexus
  43. hostNetwork: true
  44. ---
  45. apiVersion: v1
  46. kind: Service
  47. metadata:
  48. name: nexus
  49. namespace: default
  50. spec:
  51. ports:
  52. - name: tcp-8081-8081
  53. nodePort: 30081
  54. port: 8081
  55. protocol: TCP
  56. targetPort: 8081
  57. - name: tcp-8082-8082
  58. nodePort: 30082
  59. port: 8082
  60. protocol: TCP
  61. targetPort: 8082
  62. - name: tcp-8083-8083
  63. nodePort: 30083
  64. port: 8083
  65. protocol: TCP
  66. targetPort: 8083
  67. - name: tcp-8084-8084
  68. nodePort: 30084
  69. port: 8084
  70. protocol: TCP
  71. targetPort: 8084
  72. - name: tcp-8085-8085
  73. nodePort: 30085
  74. port: 8085
  75. protocol: TCP
  76. targetPort: 8085
  77. - name: tcp-8086-8086
  78. nodePort: 30086
  79. port: 8086
  80. protocol: TCP
  81. targetPort: 8086
  82. selector:
  83. k8s-app: nexus
  84. sessionAffinity: None
  85. type: NodePort

最后的绝招

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

  • docker save

  • docker load

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/381764
推荐阅读
相关标签
  

闽ICP备14008679号