利用 Katacoda 免費同步 Docker 鏡像到 Docker Hub

運維之美2019-08-18 02:28:20

為什麼要同步

安裝 kubernetes 的時候,我們需要用到 gcr.io/google_containers 下面的一些鏡像,在國內是不能直接下載的。如果用 Self Host 方式安裝,Master 上的組件除開 Kubelet 之外都用容器運行,甚至 CNI 插件也是容器運行。比如 Flannel,在 quay.io/coreos 下面,在國內下載非常慢。但是我們可以把這些鏡像同步到我們的 Docker Hub 倉庫裏,再配個 Docker Hub 加速器,這樣下載鏡像就很快了。

原理

Katacoda 是一個在線學習平台,在 Web 上提供學習需要的服務器終端,裏面包含學習所需的環境,我們可以利用 Docker 課程的終端來同步,因為裏面有 Docker 環境,可以執行 docker login、docker pull、docker tag、docker push 等命令來實現同步鏡像。

但是手工去執行命令很麻煩,如果要同步的鏡像和 Tag 比較多,手工操作那就是浪費生命。我們可以利用程序代替手工操作,不過 Katacoda 為了安全起見,不允許執行外來的二進制程序,但是可以 Shell 腳本,我寫好了腳本,大家只需要粘貼進去根據自己需要稍稍修改下,然後運行就可以了。

Let’s Do It

點擊 這裏[1] 進入 Docker 課程。

點擊 START SCENARIO 或 終端右上角全屏按鈕將終端放大。

安裝腳本依賴的 jq 命令

$ apt install jq

登錄 Docker Hub

$ docker login

創建腳本並賦予執行權限

$ touch sync$ chmod +x sync

編輯腳本,可以使用自帶的 vim 編輯器

$ vim sync

將腳本粘貼進去

#! /bin/bash
docker_repo="k8smirror" # your docker hub username or organization nameregistry="gcr.io" # the registry of original image, e.g. gcr.io, quay.iorepo="google_containers" # the repository name of original image
sync_one(){ docker pull ${registry}/${repo}/${1}:${2} docker tag ${registry}/${repo}/${1}:${2} docker.io/${docker_repo}/${1}:${2} docker push docker.io/${docker_repo}/${1}:${2} docker rmi -f ${registry}/${repo}/${1}:${2} docker.io/${docker_repo}/${1}:${2}}
sync_all_tags() { for image in $*; do tags_str=`curl https://${registry}/v2/${repo}/$image/tags/list | jq '.tags' -c | sed 's/\[/\(/g' | sed 's/\]/\)/g' | sed 's/,/ /g'` echo "$image $tags_str" src="sync_one(){ docker pull ${registry}/${repo}/\${1}:\${2} docker tag ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2} docker push docker.io/${docker_repo}/\${1}:\${2} docker rmi -f ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2}}tags=${tags_str}echo \"$image ${tags_str}\"for tag in \${tags[@]}do sync_one $image \${tag}done;" bash -c "$src" done }
sync_with_tags(){ image=$1 skip=1 for tag in $*; do if [ $skip -eq 1 ]; then skip=0 else sync_one $image $tag fi done }
sync_after_tag(){ image=$1 start_tag=$2 tags_str=`curl https://${registry}/v2/${repo}/$image/tags/list | jq '.tags' -c | sed 's/\[/\(/g' | sed 's/\]/\)/g' | sed 's/,/ /g'` echo "$image $tags_str" src="sync_one(){ docker pull ${registry}/${repo}/\${1}:\${2} docker tag ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2} docker push docker.io/${docker_repo}/\${1}:\${2} docker rmi -f ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2}}tags=${tags_str}start=0for tag in \${tags[@]}; do if [ \$start -eq 1 ]; then sync_one $image \$tag elif [ \$tag == '$start_tag' ]; then start=1 fidone" bash -c "$src"}
get_tags(){ image=$1 curl https://${registry}/v2/${repo}/$image/tags/list | jq '.tags' -c}
#sync_with_tags etcd 2.0.12 2.0.13 # sync etcd:2.0.12 and etcd:2.0.13#sync_after_tag etcd 2.0.8 # sync tag after etcd:2.0.8#sync_all_tags etcd hyperkube # sync all tags of etcd and hyperkube

腳本中有一些參數需要根據你自己情況修改,可以使用它自帶的 vim 在線修改,也可以在你本地改好在粘貼上去。

  • docker_repo 改為你的 Docker Hub 賬號組織名

  • registry 改為被同步鏡像所在倉庫的域名

  • repo 改為被同步鏡像所在倉庫的賬號或組織名

在腳本最後,可以調用寫好的函數來實現鏡像同步,舉例:

  • 同步一個鏡像中指定的一個或多個 tag

sync_with_tags etcd 2.0.12 2.0.13


  • 從某個 Tag 後面的 Tag 開始一直同步到最後(Tag 順序按照字母數字來的,不是上傳日期;Katacoda 終端用久了會斷連,可能處於安全原因考慮,斷開之後可以看 Tag 同步到哪一個了,然後執行類似下面的命令從斷連的 Tag 開始同步)

sync_after_tag etcd 2.0.8


同步一個或多個鏡像的所有 Tag

sync_all_tags etcd hyperkube

最後執行腳本

$ ./sync

這就開始同步了,Katacoda 服務器在國外,下載 gcr.io 或 quay.io 上那些鏡像都很快,上傳 Docker Hub 也很快。如果斷連了,可以在 Docker Hub 上查最新上傳的 Tag 是哪個(如:https://hub.docker.com/r/k8smirror/hyperkube/tags/ 把 k8smirror 改為你的 Docker 用户名或組織名,hyperkube 改為鏡像名),然後改腳本,用 sync_after_tag 這個函數繼續上傳。

這就開始同步了,Katacoda 服務器在國外,下載 gcr.io 或 quay.io 上那些鏡像都很快,上傳 Docker Hub 也很快。如果斷連了,可以在 Docker Hub 上查最新上傳的 Tag 是哪個(如:https://hub.docker.com/r/k8smirror/hyperkube/tags/ 把 k8smirror 改為你的 Docker 用户名或組織名,hyperkube 改為鏡像名),然後改腳本,用 sync_after_tag 這個函數繼續上傳。

參考資料

[1]

Docker 課程: https://www.katacoda.com/courses/docker/deploying-first-container

來源:I’m roc Blog

原文:http://t.cn/AiW3Jpot

題圖:來自谷歌圖片搜索 

版權:本文版權歸原作者所有

投稿:歡迎投稿,投稿郵箱: [email protected]


你可能還喜歡

點擊下方圖片即可閲讀

大話 Kubernetes Runtime


https://hk.wxwenku.com/d/201171394