Docker私有倉庫
在 Docker
中,當我們執行 docker pull xxx
的時候,可能會比較好奇,docker
會去哪兒查找並下載鏡像呢?
它實際上是從 registry.hub.docker.com
這個地址去查找,這就是Docker公司為我們提供的公共倉庫,上面的鏡像,大家都可以看到,也可以使用。
所以,我們也可以帶上倉庫地址去拉取鏡像,如:docker pull registry.hub.docker.com/library/alpine
,不過要注意,這種方式下載的鏡像的默認名稱就會長一些。
如果要在公司中使用 Docker
,我們基本不可能把商業項目上傳到公共倉庫中,那如果要多個機器共享,又能怎么辦呢?
正因為這種需要,所以私有倉庫也就有用武之地了。
所謂私有倉庫,也就是在本地(局域網)搭建的一個類似公共倉庫的東西,搭建好之后,我們可以將鏡像提交到私有倉庫中。這樣我們既能使用 Docker
來運行我們的項目鏡像,也避免了商業項目暴露出去的風險。
想想如下場景:
有一個商業項目,需要部署到N台機器上(也就是分布式部署)。
1、常規做法:生成部署文件,手動拷貝到各個服務器,調整各項配置,挨個運行。(大致耗時半小時)
2、常規做法高級版:在每台服務器上安裝FTP Server(實際上除非靜態,否則不夠用),或者是SVN Server(相對FTP Server,可以還原版本),相對常規做法,優化了手動拷貝這個部署。(大致耗時20分鍾)
3、使用Docker的做法(前提是要部署的服務器要安裝好docker環境):在某台服務器上構建好鏡像,拷貝鏡像到其他機器,啟動鏡像(大致耗時10分鍾)。
其中拷貝鏡像的方式如下:
# 將docker鏡像保存為tar文件。
docker save <image name> > <tar file address>
# 如
docker save node-test > /tmp/node-test.tar
# 拷貝這個tar文件到需要使用該鏡像的服務器上(FTP,SCP等等)
# 將tar文件文件加載為鏡像
docker load < /tmp/node-test.tar
# 接下來就可以通過鏡像運行容器了。
這種方式中,用到了Docker的優勢,但是拷貝文件這個,實在是山寨。
4、使用Docker+私有倉庫的做法:在某台服務器上構建好鏡像,推送到私有倉庫,在其他要部署的服務器上,拉取鏡像,然后運行。
對比以上的幾種方式,我們可以知道前三種都無法逃避拷貝文件,並登錄到服務器這個操作,這也是操作慢的根源,當我們有了私有倉庫之后,所有的步驟都差不多可以自動化了,可以說是大大提交的效率。
看到私有倉庫有這么大的優勢,肯定要一探究竟了吧。別急,接下來,我們就來看看如何部署和使用私有倉庫,並利用 Humpback
來再次提高部署效率。
搭建私有倉庫
既然是使用 Docker
,那毫無意外,私有倉庫也是個容器化的東西。Docker官方早就為我們考慮了私有化部署的場景,所以,它提供了官方的私有倉庫鏡像:registry
。接下來,我們就使用這個鏡像來搭建私有倉庫。
首先,按照常規思路,我們先拉取鏡像:docker pull registry:2.6.1
。(建議帶上Tag拉取)
一般來說,有了鏡像,我們就可以直接運行它就行了。
為了定制一些配置,和在 Humpback
中使用,我們還需要提供一個定制化的配置文件(使用yml來編寫配置文件),如下:
# config.yml 內容
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :7000
secret: docker-registry
headers:
X-Content-Type-Options: [nosniff]
Access-Control-Allow-Headers: ['*']
Access-Control-Allow-Origin: ['*']
Access-Control-Allow-Methods: ['GET,POST,PUT,DELETE']
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
其中 storage
設置提交到倉庫的鏡像,應該存儲在什么地方;http
節點中需要配置端口和安全碼,其中關鍵的地方在於 http.headers
的配置。如上的配置,是為了能夠跨域訪問倉庫API,這是要讓倉庫搭配 Humpback
必須的設置,Humpback會在瀏覽器端對倉庫發起請求。
如果不設置 http.secret
,會遇到如下錯誤:
No HTTP secret provided - generated random secret.
還需要注意,http.addr
的寫法,:7000
並不是錯誤的寫法,不要省略了 :
,這代表使用所有地址的 7000
端口。
接着我們把這個配置文件放在 /etc/docker/registry/
目錄下,然后就可以創建容器並運行了,命令如下:
# -p映射端口,格式為:主機端口:容器內部端口
# -v映射volumn(目錄或者文件),格式為:主機目錄:容器內目錄
# --name 設置容器名稱
# 最后的 `registry:2.6.1` 則是鏡像名稱
docker run -d -p 7000:7000 --restart=always \
-v /var/lib/registry/:/var/lib/registry/ \
-v /etc/docker/registry/config.yml:/etc/docker/registry/config.yml \
--name humpback-registry \
registry:2.6.1
運行好容器后,我們通過直接訪問地址 http://192.168.1.200:7000/v2/
來檢查倉庫是否正常運行,當返回 {}
時,表示部署成功。
推送鏡像到私有倉庫
要推送鏡像到私有倉庫,需要先根據私有倉庫地址來設定新標簽。根據我的環境,我進行的操作如下:
# pull image from docker hub(從官方倉庫拉取一個鏡像)
docker pull alpine:3.6
# 根據私有倉庫,設定標簽(必須)
# 為鏡像 `alpine:3.6` 創建一個新標簽 `192.168.1.200:7000/alpine:3.6`
docker tag alpine:3.6 192.168.1.200:7000/alpine:3.6
# 推送到私有倉庫中
docker push 192.168.1.200:7000/alpine:3.6
在推送到的時候,可能會遇到問題:http: server gave HTTP response to HTTPS client
,因為默認是提交到 https
,但我們的倉庫是使用的http,此時要么創建一個https映射,要么將倉庫地址加入到不安全的倉庫列表中。
如何將倉庫地址配置到不安全倉庫列表中?
使用如下步驟:
# 編輯 /etc/docker/daemon.json
vi /etc/docker/daemon.json
# 增加配置項
{
... # 其他配置項
"insecure-registries":[ # 關鍵配置項,將倉庫將入到不安全的倉庫列表中
"192.168.1.200:7000"
]
}
# 重啟Docker服務(CentOS 7.2)
systemctl restart docker
之后,再次執行 docker push 192.168.1.200:7000/alpine:3.6
就沒問題了。
通過訪問 http://192.168.1.200:7000/v2/alpine/tags/list
就能看到剛才提交的鏡像了。
也可以通過 http://192.168.1.200:7000/v2/_catalog
來列出倉庫中的鏡像列表。
Humpback中使用私有倉庫
至此,我們已經安裝好了私有倉庫,接着,我們就需要在 Humpback
中來使用私有倉庫。
首先,需要在系統配置中啟用私有倉庫,並設置好我們的倉庫地址,如下:
之后,我們就可以查看 Hub
功能了,截圖如下:
接着,重點來了,我們來創建容器的時候,可以使用私有倉庫的鏡像了:
結語
Humbpack
已經在我公司穩定迭代1年多,是一套比較簡單易用,又不失強大的Docker管理平台。
有 Docker
運維需求,而又因為命令行的 Swarm
不夠易用,強大的 K8S
(Kubernetes) 難以部署和運維,那就趕快來嘗試下 Humpback
,夠用,易用,易部署。
同時,用來作為本地開發部署環境也是極好的。比如我就喜歡把各種數據庫,各種嘗鮮的程序讓 Humpback
來管理,用之即來揮之即去。