如何從docker將image映象到私有的registry
阿新 • • 發佈:2018-12-26
docker越來越炙手可熱,如果你的團隊已經準備開始使用docker,那麼私有倉庫是必不可少的東西,首先是可以幫助你加快從伺服器pull映象的速度,其次也可以幫助你存放私有的映象,本文主要為大家介紹如何從公用伺服器上講開放的images備份到本地私有伺服器上。
本文中以index中的ubuntu映象舉例
從官方的Index伺服器上下載ubuntu映象
docker pull ubuntu
檢視現有的images
REPOSITORY | TAG | IMAGE ID | CREATED | VIRTUAL SIZE |
---|---|---|---|---|
ubuntu | 13.10 | 9f676bd305a4 | 5 weeks ago | 178 MB |
ubuntu | saucy | 9f676bd305a4 | 5 weeks ago | 178 MB |
ubuntu | raring | eb601b8965b8 | 5 weeks ago | 166.5 MB |
ubuntu | 13.04 | eb601b8965b8 | 5 weeks ago | 166.5 MB |
ubuntu | 12.10 | 5ac751e8d623 | 5 weeks ago | 161 MB |
ubuntu | quantal | 5ac751e8d623 | 5 weeks ago | 161 MB |
ubuntu | 10.04 | 9cc9ea5ea540 | 5 weeks ago | 180.8 MB |
ubuntu | lucid | 9cc9ea5ea540 | 5 weeks ago | 180.8 MB |
ubuntu | 12.04 | 9cd978db300e | 5 weeks ago | 204.4 MB |
ubuntu | latest | 9cd978db300e | 5 weeks ago | 204.4 MB |
ubuntu | precise | 9cd978db300e | 5 weeks ago | 204.4 MB |
一般來講,我們會使用最新版本的ubuntu,大家可以發現多個TAG對應同一個image,Tag只是一個名字而已。
為需要push到私有registry的image打tag
docker tag 9cd978db300e rd-server:5000/ubuntu
我們可以執行docker
images
檢視效果
REPOSITORY | TAG | IMAGE ID | CREATED | VIRTUAL SIZE |
---|---|---|---|---|
ubuntu | 13.10 | 9f676bd305a4 | 5 weeks ago | 178 MB |
ubuntu | saucy | 9f676bd305a4 | 5 weeks ago | 178 MB |
ubuntu | raring | eb601b8965b8 | 5 weeks ago | 166.5 MB |
ubuntu | 13.04 | eb601b8965b8 | 5 weeks ago | 166.5 MB |
ubuntu | 12.10 | 5ac751e8d623 | 5 weeks ago | 161 MB |
ubuntu | quantal | 5ac751e8d623 | 5 weeks ago | 161 MB |
ubuntu | 10.04 | 9cc9ea5ea540 | 5 weeks ago | 180.8 MB |
ubuntu | lucid | 9cc9ea5ea540 | 5 weeks ago | 180.8 MB |
ubuntu | 12.04 | 9cd978db300e | 5 weeks ago | 204.4 MB |
ubuntu | latest | 9cd978db300e | 5 weeks ago | 204.4 MB |
ubuntu | precise | 9cd978db300e | 5 weeks ago | 204.4 MB |
rd-server:5000/ubuntu | latest | 9cd978db300e | 5 weeks ago | 204.4 MB |
將ubuntu push到私有registry
docker push rd-server:5000/ubuntu
如何將ubuntu的所有分支都映象到自己的私有倉庫?
1.先打TAG,把需要的版本打上標籤,然後進行推送
語句大概是這個樣子的:
docker tag eb601b8965b8 rd-server:5000/ubuntu:raring docker tag eb601b8965b8 rd-server:5000/ubuntu:13.04 docker tag 9f676bd305a4 rd-server:5000/ubuntu:saucy docker tag 9f676bd305a4 rd-server:5000/ubuntu:13.10 docker tag 9cd978db300e rd-server:5000/ubuntu:precise docker tag 9cd978db300e rd-server:5000/ubuntu:latest docker tag 9cd978db300e rd-server:5000/ubuntu:12.04 docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:lucid docker tag 9cc9ea5ea540 rd-server:5000/ubuntu:10.04 docker tag 5ac751e8d623 rd-server:5000/ubuntu:quantal docker tag 5ac751e8d623 rd-server:5000/ubuntu:12.10
開始推送
docker push rd-server:5000/ubuntu
如果返回的內容的最後一行是下面這個樣子的
2014/03/14 08:22:14 push: }
請反覆執行,沒錯,不要懷疑,請迴圈一直反覆執行下去
docker pull rd-server:5000/ubuntu
直到不再出現 push:
}
的字樣
不知道這是docker的BUG還是本身設計是這樣的,需要反覆多次push才能將完整的tag推送到private registry裡,否則在客戶端下載的時候總會提示某些image找不到,個人猜測可能是這麼設計的,因為docker image比較大,而一個repo會有很多的塊檔案,每次push的時候只Push一個塊,好了,猜測就道這,活還是得幹,所以,寫個指令碼解決手工的問題吧。
#!/bin/sh # #Copyright (c) 2014 ZhengXujin [email protected] # server="127.0.0.1:5000" index_repo_name="username/ubuntu" private_repo_name="ubuntu" echo "\n" echo " ## ." echo " ## ## ## ==" echo " ## ## ## ## ===" echo " /""""""""""""""""\___/ ===" echo " ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~" echo " \______ o __/" echo " \ \ __/" echo " \____\______/" echo "\n" idx=0 is_continue=1 docker images|grep -q "$server/$private_repo_name" if [[ $? -ne 0 ]]; then docker images|grep $index_repo_name|awk -F" " '{printf("docker tag %s %s/%s:%s\n",$3,"'$server'","'$private_repo_name'",$2)}'|bash fi while [ $is_continue -eq 1 ] do docker push $server/$private_repo_name is_continue=$? let idx=$idx+1 echo "$(tput setaf 1)continue push, $idx times pushed. $(tput sgr 0)" done
從客戶端獲取私有庫的映象
docker pull rd-server:5000/ubuntu
或者獲取某個版本的ubuntu
docker pull -t 13.04 rd-server:5000/ubuntu
在從公有庫往私有庫上推送的時候,可能會遇到一些依賴的映象並沒有完全推送到伺服器上,在客戶端pull的時候會有錯誤,提示如下
eb601b8965b8: Error pulling image (13.04) from rd-server:5000/ubuntu, Server error: 400 trying to fetch remote history for eb601b9cd978db300e: Download complete
請反覆執行下面的語句,一直到完整上傳所有的images
docker push rd-server:5000/ubuntu
當然也不是每次出現這樣的問題都是因為上傳不完整導致的,也有可能是pull的客戶端網路不好,如果反覆出現相同問題,就需要考慮上面的方法
如果出現如下的問題,請將主機名直接換成IP來pull庫
Invalid Registry endpoint: Get http://rd-server:5000/v1/_ping: dial tcp: lookup rd-server: no such host
例如
docker pull 172.16.1.88:5000/ubuntu