docker4dotnet #4 使用Azure云存儲(chǔ)搭建高速 Docker registry
使用Docker來(lái)構(gòu)建應(yīng)用程序最常見(jiàn)的操作就是 docker run 或者 docker pull了,但是由于眾所周知的原因,在國(guó)內(nèi)想要高速穩(wěn)定的獲取docker hub上面的資源并不是件容易的事情,雖然國(guó)內(nèi)的一些docker社區(qū)也提供了所謂的加速器,但是實(shí)測(cè)結(jié)果并不理想。今天這篇文章就給大家介紹一下怎么借助Azure Storage來(lái)搭建一個(gè)高速的私有 Docker Hub (Registiry)。
一圖解千言,基本上一看你就明白了。我們利用Docker Registry 提供的 Azure Storage 存儲(chǔ)模式,將2個(gè)不同的registry 容器連接到同一個(gè)blob存儲(chǔ)上,其中一個(gè)registry容器運(yùn)行在Azure香港的數(shù)據(jù)中心,另外一個(gè)運(yùn)行在我本地docker-machine中。需要docker pull的時(shí)候,我們使用香港的容器進(jìn)行操作,并push到本地的registry中;這個(gè)操作其實(shí)會(huì)把鏡像上傳至Azure的blob存儲(chǔ)中;本地在pull鏡像的時(shí)候就可以直接從Azure存儲(chǔ)中下載了,速度非??欤P(guān)鍵是更加穩(wěn)定。
搭建這個(gè)環(huán)境也很簡(jiǎn)單:
1. 使用docker-machine 在香港的Azure數(shù)據(jù)中心中創(chuàng)建一臺(tái)容器化主機(jī)
- docker-machine create --driver azure --azure-subscription-id {sub-id} --azure-open-port 80 {machine-name}
2. 在Azure Storage中創(chuàng)建存儲(chǔ)帳號(hào),并獲取訪問(wèn)密鑰
如果你有中國(guó)版Azure的帳號(hào),建議把這個(gè)存儲(chǔ)放置在北京或者上海;如果只有國(guó)際版的帳號(hào),放在香港速度也是不錯(cuò)的。
3. 在香港和本地的docker-machine中分別使用同樣的命令啟動(dòng)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
注意以上我所使用的是中國(guó)版Azure存儲(chǔ)帳號(hào),如果使用國(guó)際版,請(qǐng)更新 REGISTRY_STORAGE_AZURE_REALM 這個(gè)參數(shù)
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 "-> Swithc 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 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 "-> Swithc 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!"
當(dāng)然,你也可以把這個(gè)registry容器運(yùn)行在云端的docker-machine里面,這樣你就可以把這個(gè)registry共享給團(tuán)隊(duì)使用了,但是不要忘記加入驗(yàn)證。
另外,如果你使用的是AWS或者阿里云,Docker Registry也提供了類似的driver可以搭建一樣的環(huán)境,具體請(qǐng)參考:https://docs.docker.com/registry/storage-drivers/
【本文為51CTO專欄作者“徐磊”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)devopshub獲取授權(quán)】