如何让Docker镜像飞起来
前言
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”源:
# 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:2.2withfonts AS base這里分享一個技巧:Linux下使用apt裝包很多時候非常緩慢而且不靠譜,有時候換成國內的代理也很不靠譜,這時候可以考慮使用海外構建,做成鏡像。
自己搭建就近鏡像倉庫
服務器帶寬不行,本地網絡不佳,怎么辦?還能怎么辦,自己搭建倉庫吧。這里推薦使用nexus,nexus可以托管各種包,包括Docker、Nuget、Jar、npm、Bower等等包,簡直不要太犀利了。如何搭建?Yaml常考如下:
apiVersion: apps/v1beta2 kind: Deployment metadata:labels:k8s-app: nexusname: nexusnamespace: default spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: nexusstrategy:type: Recreatetemplate:metadata:labels:k8s-app: nexusspec:containers:- image: sonatype/nexus3imagePullPolicy: IfNotPresentname: nexusresources:limits:cpu: "2"memory: 5024Mirequests:cpu: 10mmemory: 256MivolumeMounts:- mountPath: /nexus-dataname: datarestartPolicy: AlwaysnodeName: k8s-node1 #強制約束將Pod調度到指定的Node節點上terminationGracePeriodSeconds: 30 #Pod結束時等待時長(單位為秒)volumes:- name: datahostPath: #使用主機目錄path: /var/nexushostNetwork: true --- apiVersion: v1 kind: Service metadata:name: nexusnamespace: default spec:ports:- name: tcp-8081-8081nodePort: 30081port: 8081protocol: TCPtargetPort: 8081- name: tcp-8082-8082nodePort: 30082port: 8082protocol: TCPtargetPort: 8082- name: tcp-8083-8083nodePort: 30083port: 8083protocol: TCPtargetPort: 8083- name: tcp-8084-8084nodePort: 30084port: 8084protocol: TCPtargetPort: 8084- name: tcp-8085-8085nodePort: 30085port: 8085protocol: TCPtargetPort: 8085- name: tcp-8086-8086nodePort: 30086port: 8086protocol: TCPtargetPort: 8086selector:k8s-app: nexussessionAffinity: Nonetype: NodePort最后的絕招
還不行,用U盤復制吧。別說認識我。你不信可以通過U盤復制?可以去了解下以下兩個命令:
docker save
docker load
總結
以上是生活随笔為你收集整理的如何让Docker镜像飞起来的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DotNet SSL TLS证书问题分析
- 下一篇: Nuget多项目批量打包上传服务器的简明