使用Docker來構建應用程式最常見的操作就是 docker run 或者 docker pull了,但是由於眾所周知的原因,在國內想要高速穩定的獲取docker hub上面的資源並不是件容易的事情,雖然國內的一些docker社群也提供了所謂的加速器,但是實測結果並不理想。今天這篇文章就給大家介紹一下怎麼藉助Azure Storage來搭建一個高速的私有 Docker Hub (Registiry)。
一圖解千言,基本上一看你就明白了。我們利用Docker Registry 提供的 Azure Storage 儲存模式,將2個不同的registry 容器連線到同一個blob儲存上,其中一個registry容器執行在Azure香港的資料中心,另外一個執行在我本地docker-machine中。需要docker pull的時候,我們使用香港的容器進行操作,並push到本地的registry中;這個操作其實會把映象上傳至Azure的blob儲存中;本地在pull映象的時候就可以直接從Azure儲存中下載了,速度非常快,關鍵是更加穩定。
搭建這個環境也很簡單:
1. 使用docker-machine 在香港的Azure資料中心中建立一臺容器化主機
docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 --azure-location "EastAsia" {machine-name}
2. 在Azure Storage中建立儲存帳號,獲取訪問金鑰
如果你有中國版Azure的帳號,建議把這個儲存放置在北京或者上海;如果只有國際版的帳號,放在香港速度也是不錯的。
3. 在香港和本地的docker-machine中分別使用同樣的命令啟動regsitry容器
macOS/linux 指令碼
docker run -d -p 5000:5000 \ -e REGISTRY_STORAGE=azure \ -e REGISTRY_STORAGE_AZURE_ACCOUNTNAME="{Account Name}" \ -e REGISTRY_STORAGE_AZURE_ACCOUNTKEY="{access key}" \ -e REGISTRY_STORAGE_AZURE_CONTAINER="{storage container name}" \ -e REGISTRY_STORAGE_AZURE_REALM="core.chinacloudapi.cn" \ --name=registry \ --restart=always \ registry:2
Windows指令碼
docker run -d -p 5000:5000 ^ -e REGISTRY_STORAGE=azure ^ -e REGISTRY_STORAGE_AZURE_ACCOUNTNAME="{Account Name}" ^ -e REGISTRY_STORAGE_AZURE_ACCOUNTKEY="{access key}" ^ -e REGISTRY_STORAGE_AZURE_CONTAINER="{storage container name}" ^ -e REGISTRY_STORAGE_AZURE_REALM="core.chinacloudapi.cn" ^ --name=registry ^ --restart=always ^ registry:2
注意以上我所使用的是中國版Azure儲存帳號,如果使用國際版,請更新 REGISTRY_STORAGE_AZURE_REALM 這個引數。
4. 使用指令碼一次性完成映象拉取
macOS或者Linux的指令碼 pull-image.sh
echo There are $# arguments to $0: $* echo Pulling image $3 from docker hub via azure storage echo Usage echo "-------------------------------------------" echo "$1 is the offshore docker-machine name" echo "$2 is the local docker-machine name" echo "$3 is the image name" echo "-------------------------------------------" echo "-> switch to $1" eval $(docker-machine env $1) echo "-> pulling image $3" docker pull $3 echo "-> tag image $3 and push to local registry" docker tag $3 localhost:5000/$3 docker push localhost:5000/$3 echo "-> Pull from registry in localhost into $2" eval $(docker-machine env $2) docker pull localhost:5000/$3 docker tag localhost:5000/$3 $3 docker rmi localhost:5000/$3 echo "-> Done!"
Windows 指令碼 pull-image.cmd
echo off echo Usage echo "-------------------------------------------" echo "%1 is the offshore docker-machine name" echo "%2 is the local docker-machine name" echo "%3 is the image name" echo "-------------------------------------------" echo "-> switch to %1" @FOR /f "tokens=*" %i IN ('docker-machine env %1') DO @%i echo "-> pulling image %3" docker pull $3 echo "-> tag image %3 and push to local registry" docker tag %3 localhost:5000/%3 docker push localhost:5000/%3 echo "-> Pull from registry in localhost into %2" @FOR /f "tokens=*" %i IN ('docker-machine env %2') DO @%i docker pull localhost:5000/%3 docker tag localhost:5000/%3 %3 docker rmi localhost:5000/%3 echo "-> Done!"
當然,你也可以把這個registry容器執行在雲端的docker-machine裡面,這樣你就可以把這個registry共享給團隊使用了,但是不要忘記加入驗證。
另外,如果你使用的是AWS或者阿里雲,Docker Registry也提供了類似的driver可以搭建一樣的環境,具體請參考:https://docs.docker.com/registry/storage-drivers/
相關閱讀:
- docker4dotnet #1 前世今生 & 世界你好
- docker4dotnet #2 容器化主機
- docker4dotnet #3 在macOS上使用Visual Studio Code和Docker開發asp.net core和mysql應用
- docker – 你應該知道的10件事
- DockerCon 2016 – 微軟帶來了什麼?
請關注微信公眾號 【devopshub】,獲取更多關於DevOps研發運維一體化的資訊