Docker容器管理平台Humpback進階-私有倉庫


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 來管理,用之即來揮之即去。

最后:Humpback開源免費,Github地址是:https://github.com/humpback/humpback,要是喜歡,還望不吝給個 Star;如果覺得不好用,或者不夠用,也歡迎給我們提 Issue,當然,能夠有 PR 那就更好了。

本文github地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM