應用現狀
隨著容器化技術的發展,越來越多的企業使用容器代替了虛擬機完成應用的運行部署。目前許多企業選擇自建Kubernetes集群,但是自建集群往往有著沉重的運維負擔,需要運維人員自己配置管理系統和監控解決方案。企業自運維大批鏡像資源,意味著要付出高昂的運維、人力、管理成本,且效率不高。
容器鏡像服務支持Linux等多架構容器鏡像托管。企業可以將鏡像倉庫遷移到容器鏡像服務,節省運維成本。
如何把已有的鏡像倉庫平滑地遷移到容器鏡像服務?這里將介紹2種常見的方案,用戶可以根據自己的實際使用場景來選擇。
遷移方案
隨著
| 方案類型 | 適用場景 | 注意事項 |
|---|---|---|
| 使用docker命令遷移鏡像至SWR | 待遷移的鏡像數量較少 | 依賴磁盤存儲,需要及時進行本地鏡像的清理,而且落盤形成多余的時間開銷,難以勝任生產場景中大量鏡像的遷移。 依賴docker 程序,docker daemon 對 pull/push 的并發數進行了嚴格的限制,沒法進行高并發同步 一些功能只能經過HTTP api 進行操作,單純使用 docker cli 沒法做到,使腳本變得復雜 |
| 使用image-syncer遷移鏡像至SWR | 待遷移的鏡像數量龐大 | 支持多對多鏡像倉庫同步 支持基于Docker Registry V2 搭建的 docker 鏡像倉庫服務 (如 Docker Hub、 Quay、 Harbor等) 同步只通過內存和網絡,不依賴磁盤存儲,同步速度快 增量同步, 經過對同步過的鏡像 blob 信息落盤,不重復同步已同步的鏡像 并發同步,能夠經過配置文件調整并發數? 自動重試失敗的同步任務,能夠解決大部分鏡像同步中的網絡抖動問題 不依賴docker 以及其余程序 |
使用docker命令遷移鏡像至SWR
容器鏡像服務提供了簡便、易用的鏡像托管和高效分發業務。當要遷移的鏡像數量較少時,企業可以通過簡單的docker pull、docker push命令行,將之前維護的鏡像遷移到SWR上。
操作步驟:
步驟 1 從源倉庫下載鏡像。
使用docker pull 命令下載鏡像。
示例:docker pull nginx:latest
使用docker images命令查看是否下載成功。
#docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 22f2bf2e2b4f 5 hours ago 22.8MB
步驟 2 將步驟1中下載的鏡像上傳到SWR。
- 登錄到目標端容器所在虛擬機,并登錄SWR。詳細步驟請參考客戶端上傳鏡像。
- 給鏡像打標簽。
docker tag [鏡像名稱:版本名稱] [鏡像倉庫地址]/[組織名稱]/[鏡像名稱:版本名稱]
示例:
docker tag nginx:v1 swr.cn-gz1.daliqc.cn/cloud-develop/nginx:v1
- 上傳鏡像至目標鏡像倉庫。
docker push [鏡像倉庫地址]/[組織名稱]/[鏡像名稱:版本名稱]
示例:
docker push swr.cn-gz1.daliqc.cn/cloud-develop/nginx:v1
- 終端顯示如下信息,表明上傳鏡像成功。
The push refers to repository [swr.cn-gz1.daliqc.cn/cloud-develop/nginx:v1]fbce26647e70: Pushedfb04ab8effa8: Pushed8f736d52032f: Pushed009f1d338b57: Pushed678bbd796838: Pushedd1279c519351: Pushedf68ef921efae: Pushedv1: digest: sha256:0cdfc7910db531bfa7726de4c19ec556bc9190aad9bd3de93787e8bce3385f8d size: 1780
返回容器鏡像服務控制臺,在“我的鏡像”頁面,執行刷新操作后可查看到對應的鏡像信息。
使用image-syncer遷移鏡像至SWR
當我們處理數量較少的鏡像遷移任務時,使用命令行遷移就可以解決這個問題。但是實際生產中涉及到成千上百個鏡像,幾T的鏡像倉庫數據時,遷移過程就變得耗時很是漫長,甚至丟失數據。這時,我們可以使用開源鏡像遷移工具來處理這個任務。
步驟 1 下載image-syncer,解壓并運行工具。
以v1.3.1版本為例,您也可以選擇其他版本。
wget //github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gztar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz
步驟 2 創建鏡像倉庫的認證信息文件auth.json。
image-syncer支持基于 Docker Registry V2 搭建的 docker 鏡像倉庫,按格式填寫即可。
將源倉庫及目標倉庫認證信息寫入,示例如下。
{
"swr.cn-gz1.daliqc.cn": {
"username": "cn-gz1@F1I3Q……",
"password": "2fd4c869ea0……"
},
"swr.cn-gz4.daliqc.cn": {
"username": "cn-gz4@4N3FA……",
"password": "f1c82b57855f9d35……"
}
}
username、password可以在登錄命令中獲取,獲取方法如下:
登錄SWR控制臺,在右上角單擊“登錄指令”,在彈出的窗口中獲取登錄指令,如下圖所示。


注意
因安全性要求,以上示例中所有username和password均有部分內容進行省略,請以控制臺獲取到的實際用戶名和密碼為準。
步驟 3 創建同步鏡像描述文件images.json。
如下示例,左邊是源倉庫的地址,右邊是目的倉庫地址。image-syncer還支持其他描述方式,詳見官網說明。
{"swr.cn-north-4.myhuaweicloud.com/org-ss/canary-consumer": "swr.cn-east-3.myhuaweicloud.com/dev-container/canary-consumer"}
步驟 4 執行如下命令將鏡像遷移至SWR。
./image-syncer --auth=./auth.json --images=./images.json --namespace=dev-container --registry=swr.cn-east-3.myhuaweicloud.com --retries=3 --log=./log
命令行參數說明。
| 參數 | 說明 |
|---|---|
| --config | 設置用戶提供的配置文件路徑,使用之前需要創建此文件,默認為當前工作目錄下的config.json文件。這個參數與 --auth和--images 的作用相同,分解成兩個參數可以更好地區分認證信息與鏡像倉庫同步規則。建議使用 --auth 和 --images. |
| --images | 設置用戶提供的鏡像同步規則文件所在路徑,使用之前需要創建此文件,默認為當前工作目錄下的images.json文件 |
| --auth | 設置用戶提供的認證文件所在路徑,使用之前需要創建此認證文件,默認為當前工作目錄下的auth.json文件 |
| --log | 打印出來的log文件路徑,默認打印到標準錯誤輸出,如果將日志打印到文件將不會有命令行輸出,此時需要通過cat對應的日志文件查看 |
| --namespace | 設置默認的目標namespace,當配置文件內一條images規則的目標倉庫為空,并且默認registry也不為空時有效,可以通過環境變量DEFAULT_NAMESPACE設置,同時傳入命令行參數會優先使用命令行參數值 |
| --proc | 并發數,進行鏡像同步的并發goroutine數量,默認為5 |
| --retries | 失敗同步任務的重試次數,默認為2,重試會在所有任務都被執行一遍之后開始,并且也會重新嘗試對應次數生成失敗任務的生成。一些偶爾出現的網絡錯誤比如io timeout、TLS handshake timeout,都可以通過設置重試次數來減少失敗的任務數量 |
| --registry | 設置默認的目標registry,當配置文件內一條images規則的目標倉庫為空,并且默認namespace也不為空時有效,可以通過環境變量DEFAULT_REGISTRY設置,同時傳入命令行參數會優先使用命令行參數值 |
遷移命令執行后,可登錄目標鏡像倉庫,查看已遷移的鏡像。