在 Docker
中,當咱們執行 docker pull xxx
的時候,可能會比較好奇,docker
會去哪兒查找並下載鏡像呢?node
它其實是從 registry.hub.docker.com
這個地址去查找,這就是Docker公司爲咱們提供的公共倉庫,上面的鏡像,你們均可以看到,也可使用。git
因此,咱們也能夠帶上倉庫地址去拉取鏡像,如:docker pull registry.hub.docker.com/library/alpine
,不過要注意,這種方式下載的鏡像的默認名稱就會長一些。github
若是要在公司中使用 Docker
,咱們基本不可能把商業項目上傳到公共倉庫中,那若是要多個機器共享,又能怎麼辦呢?docker
正由於這種須要,因此私有倉庫也就有用武之地了。數據庫
所謂私有倉庫,也就是在本地(局域網)搭建的一個相似公共倉庫的東西,搭建好以後,咱們能夠將鏡像提交到私有倉庫中。這樣咱們既能使用 Docker
來運行咱們的項目鏡像,也避免了商業項目暴露出去的風險。json
想一想以下場景:跨域
有一個商業項目,須要部署到N臺機器上(也就是分佈式部署)。瀏覽器
一、常規作法:生成部署文件,手動拷貝到各個服務器,調整各項配置,挨個運行。(大體耗時半小時)安全
二、常規作法高級版:在每臺服務器上安裝FTP Server(實際上除非靜態,不然不夠用),或者是SVN Server(相對FTP Server,能夠還原版本),相對常規作法,優化了手動拷貝這個部署。(大體耗時20分鐘)bash
三、使用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的優點,可是拷貝文件這個,實在是山寨。
四、使用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
中來使用私有倉庫。
首先,須要在系統配置中啓用私有倉庫,並設置好咱們的倉庫地址,以下:
以後,咱們就能夠查看 Hub
功能了,截圖以下:
接着,重點來了,咱們來建立容器的時候,可使用私有倉庫的鏡像了:
Humbpack
已經在我公司穩定迭代1年多,是一套比較簡單易用,又不失強大的Docker管理平臺。
有 Docker
運維需求,而又由於命令行的 Swarm
不夠易用,強大的 K8S
(Kubernetes) 難以部署和運維,那就趕快來嘗試下 Humpback
,夠用,易用,易部署。
同時,用來做爲本地開發部署環境也是極好的。好比我就喜歡把各類數據庫,各類嚐鮮的程序讓 Humpback
來管理,用之即來揮之即去。
Star
;若是以爲很差用,或者不夠用,也歡迎給咱們提 Issue
,固然,可以有 PR
那就更好了。