原文: Docker鏡像倉庫
這里僅以一個場景: 自己制作的鏡像如何分享, 主要說明私有鏡像倉庫Harbor的搭建使用
Docker Hub
首先介紹Docker Hub
推送&拉取鏡像
推送自己的鏡像到Docker Hub上, 因?yàn)榫W(wǎng)速... 這里用一個超小的鏡像試驗(yàn)
[root@bogon ~]# docker images | grep busy
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest af2f74c517aa 6 days ago 1.2MB
1. 打標(biāo)簽
docker tag busybox:latest thank037/busybox:1.0
[root@bogon ~]# docker images | grep busy
busybox latest af2f74c517aa 6 days ago 1.2MB
thank037/busybox latest af2f74c517aa 6 days ago 1.2MB
注意這里的thank037就是DockerHub中的username
2. 推送
docker push thank037/busybox:1.0
去自己的鏡像倉庫看下吧, 有了
如果推送過程中提示:
denied: requested access to the resource is denied
登錄一下即可:
docker login
拉取鏡像很常見
docker pull thank037/busybox:1.0
國內(nèi)的鏡像倉庫
國內(nèi)也有很多, 例如網(wǎng)易, DaoCloud, 阿里云等, 上傳鏡像和拉取鏡像的姿勢基本和Docker Hub一樣
網(wǎng)易的這兩天個人認(rèn)證無法使用, 必須要企業(yè)認(rèn)證, 所以這里實(shí)驗(yàn)阿里云的
首先需要在阿里云-容器鏡像服務(wù)
中創(chuàng)建一個命名空間
可以設(shè)置倉庫類型, 公有私有
推送和拉取
省略自己制作鏡像的過程, 這里以一個我已經(jīng)拉取好的官方鏡像redis:latest
為例
首先登錄
$ sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
# tag
docker tag redis:latest registry.cn-hangzhou.aliyuncs.com/thank/redis:1.0
# push
docker push registry.cn-hangzhou.aliyuncs.com/thank/redis:1.0
# pull
docker pull registry.cn-hangzhou.aliyuncs.com/thank/redis:1.0
去鏡像倉庫看看吧, 有了
基于代碼源構(gòu)建
上面的方式是自己在docker環(huán)境中制作好鏡像, 上傳到倉庫, 這里介紹一種基于代碼源的構(gòu)建方式
以GitHub為例, 代碼源為: https://github.com/Thank037/spring-cloud-study2
創(chuàng)建鏡像倉庫: 寫好倉庫名稱, 選擇好命名空間即可
設(shè)置代碼源: 選擇github, 第一次使用需要綁定賬號
-
構(gòu)建設(shè)置
- 構(gòu)建設(shè)置: 例如可以開啟代碼變更自動構(gòu)建鏡像
- 構(gòu)建規(guī)則設(shè)置: 設(shè)置代碼源的分支/tag, Dockerfile目錄和名字, 需要構(gòu)建的鏡像版本
開始構(gòu)建: 點(diǎn)擊規(guī)則上的立即構(gòu)建即可
每次的構(gòu)建過程會輸出到構(gòu)建日志中, 可以進(jìn)行查看
私有倉庫
出于安全和速度的考慮, 很多企業(yè)會選擇搭建私有鏡像倉庫
registry
安裝和使用
是一個官方提供的鏡像倉庫, 安裝極其簡單!
docker pull registry:2
拉取完成后啟動registry: docker run -d -p 5000:5000
推送和拉取過程跟推送到公有倉庫差不多
# 打標(biāo)簽
docker tag busybox:latest localhost:5000/busybox:1.0
# 推送
docker push localhost:5000/busybox:1.0
# 拉取
docker pull localhost:5000/busybox:1.0
需要注意的是
如果其它主機(jī)在推送到registry所在主機(jī)時可能出現(xiàn)安全錯誤, 也就是鏡像倉庫和docker客戶端不在一臺機(jī)器上
在Client端/etc/docker/daemon.json
中加入:
{ "insecure-registries":["ip:5000"] }
然后重啟docker即可 systemctl restart docker
除了推送和拉取鏡像, registry還提供了一些API, 查看鏡像信息, 刪除等... 例如:
[root@bogon ~]# curl localhost:5000/v2/_catalog
{"repositories":["busybox"]}
可以看到registry很輕便, 具備了基礎(chǔ)的鏡像管理功能, 但是有以下兩個缺點(diǎn)
- 不具備授權(quán)認(rèn)證功能, 需要自己去做一些認(rèn)證方案
- 雖有API, 但沒有一個好看的界面
harbor
harbor意為港灣, 很貼合它的作用
github地址: https://github.com/goharbor/harbor
記得以前是在vmware下, 現(xiàn)在地址轉(zhuǎn)到goharbor下了
官方的定義是企業(yè)級私有Registry服務(wù)器, 實(shí)際內(nèi)部也是依靠docker registry
那么它與registry相比, 一定提供了很多企業(yè)級的特性, 例如:
- 提供良好的Web界面
- 提供良好的安全機(jī)制, 包括角色, 權(quán)限控制, 日志等
- 支持水平擴(kuò)展
- 傳輸優(yōu)化, 因?yàn)殓R像的分層機(jī)制, 所以每次傳輸并非全量, 從而提升速度
搭建
環(huán)境準(zhǔn)備
在安裝harbor之前, 需要docker環(huán)境, 除此還需要docker-compose, 不說了
安裝Harbor
在github release中查看需要安裝的版本, 這里我用當(dāng)前最新的v1.7.5
文檔中有兩種安裝方式: offline和online, 也就是在線和離線
- online: 在線方式會下載一個很小的tar包, 里面只有
docker-compose.yml
和啟動腳本, 會在啟動安裝時在線拉取鏡像 - offline: 下載一個大概500多M的tar包, 里面包括了鏡像文件, 所以安裝時會快
我的瀏覽器設(shè)置了代理, 所以選擇offline的離線包, 再上傳放到docker環(huán)境的主機(jī)上
大致看下解壓后的目錄
[root@localhost opt]# tree harbor -CL 2
harbor
├── common
│ ├── config
│ └── templates
├── docker-compose.chartmuseum.yml
├── docker-compose.clair.yml
├── docker-compose.notary.yml
├── docker-compose.yml
├── harbor.cfg
├── harbor.v1.7.5.tar.gz
├── install.sh
├── LICENSE
├── open_source_license
└── prepare
接下來對harbor.cfg
幾個配置做修改, 我修改了如下:
# 注釋中也說了, 不要設(shè)置成localhost和127.0.0.1阿
hostname = hub.thank.com
# 郵箱相關(guān)的設(shè)置
email_server = smtp.163.com
email_server_port = 25
email_username = coderthank@163.com
email_password = ******
email_from = thank <coderthank@163.com>
# 修改admin默認(rèn)的登錄密碼
harbor_admin_password = 123123
更多詳細(xì)的設(shè)置可參考官方文檔和配置文件的注釋
然后執(zhí)行install.sh
即可
[Step 0]: checking installation environment ...
Note: docker version: 1.13.1
Note: docker-compose version: 1.16.1
[Step 1]: loading Harbor images ...
...略
[Step 2]: preparing environment ...
...略
[Step 3]: checking existing instance of Harbor ...
[Step 4]: starting Harbor ...
...略
? ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://hub.thank.com.
For more details, please visit https://github.com/goharbor/harbor .
從Step可以看到這個一鍵腳本幫我們做了傻瓜式的安裝
docker-compose幫我們完成了Harbor所需要的多個容器服務(wù)
來看一眼
-
鏡像
[root@localhost harbor]# docker images --format "table {{.Repository}}\t{{.Size}}" | grep harbor goharbor/chartmuseum-photon 113 MB goharbor/harbor-migrator 679 MB goharbor/redis-photon 101 MB goharbor/clair-photon 164 MB goharbor/notary-server-photon 135 MB goharbor/notary-signer-photon 132 MB goharbor/harbor-registryctl 102 MB goharbor/registry-photon 86.7 MB goharbor/nginx-photon 35.9 MB goharbor/harbor-log 81.4 MB goharbor/harbor-jobservice 84.1 MB goharbor/harbor-core 95.6 MB goharbor/harbor-portal 40.6 MB goharbor/harbor-adminserver 72.3 MB goharbor/harbor-db 138 MB
-
容器
[root@localhost harbor]# docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}" | grep harbor c517af1cff6a goharbor/nginx-photon:v1.7.5 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp 7bb6eac57291 goharbor/harbor-jobservice:v1.7.5 723cb4c96a0d goharbor/harbor-portal:v1.7.5 80/tcp 1425f64756d1 goharbor/harbor-core:v1.7.5 f19a00ce693b goharbor/registry-photon:v2.6.2-v1.7.5 5000/tcp 4d3f0f8929c7 goharbor/harbor-adminserver:v1.7.5 23df470d2b0d goharbor/harbor-db:v1.7.5 5432/tcp e7d6d1cc3b1b goharbor/harbor-registryctl:v1.7.5 6e2912ec566e goharbor/redis-photon:v1.7.5 6379/tcp ee8685192041 goharbor/harbor-log:v1.7.5 127.0.0.1:1514->10514/tcp
界面使用
因?yàn)閯偛旁谂渲梦募r了一個假域名, 這里我修改下hosts
192.168.118.143 hub.thank.com
訪問http://hub.thank.com
, 可以看到Harbor的登錄頁面
直接訪問IP也可, 默認(rèn)80端口
登錄后的主頁面
測試: 創(chuàng)建用戶thank
, 創(chuàng)建項(xiàng)目cloudlink-base
和項(xiàng)目中添加用戶thank
, 角色為項(xiàng)目管理員
其它功能就不做介紹了, 中文簡體點(diǎn)一點(diǎn)就好啦
運(yùn)維管理
從前面的一鍵啟動腳本也能看出, 我們可以用docker-compose統(tǒng)一完成harbor服務(wù)的運(yùn)維管理
- 停止:
docker-comose stop
- etc...
image管理
這里測試一下鏡像的拉取和上傳
方法跟其它倉庫的沒什么不一樣, 不說了
# login
docker login hub.thank.com
# image tag
docker tag redis:latest hub.thank.com/cloudlink-base/thank-redis:latest
# push
docker push hub.thank.com/cloudlink-base/thank-redis:latest
# pull
docker pull
https問題
剛才在配置文件harbor.cfg
中可以看到默認(rèn)配置了http協(xié)議訪問
這里在其它主機(jī)上傳鏡像時, docker客戶端默認(rèn)都是https訪問Harbor, 所以會出現(xiàn)connection refused
的錯誤
有兩種解決辦法:
- 前面提到過, 在
/etc/docker/daemon.json
加入
{
"insecure-registries" : ["hub.thank.com"]
}
- 修改harbor配置文件為https方式:
ui_url_protocol = https
, 除此之外還需要配置證書
不是很復(fù)雜, 可以參照搭建Harbor企業(yè)級docker倉庫#五、Harbor配置TLS證書