概述
在安裝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