Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署咱們私有環境內的Registry也是很是必要的。Harbor 是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日誌審覈、管理界面、自我註冊、鏡像複製和中文支持等功能。前端
Harbor 的全部組件都在 Dcoker 中部署,因此 Harbor 可以使用 Docker Compose 快速部署。node
注: 因爲 Harbor 是基於 Docker Registry V2 版本,因此 docker 版本必須 > = 1.10.0 docker-compose >= 1.6.0mysql
Harbor的目標是幫助用戶迅速搭建一個企業級的Docker registry服務。它以Docker公司開源的registry爲基礎
,額外提供了以下功能:linux
Harbor的每一個組件都是以Docker容器的形式構建的,可使用Docker Compose來進行部署。若是環境中使用了kubernetes,Harbor也提供了kubernetes的配置文件。nginx
Harbor大概須要如下幾個容器組成:ui(Harbor的核心服務)、log(運行着rsyslog的容器,進行日誌收集)、mysql(由官方mysql鏡像構成的數據庫容器)、Nginx(使用Nginx作反向代理)、registry(官方的Docker registry)、adminserver(Harbor的配置數據管理器)、jobservice(Harbor的任務管理服務)、redis(用於存儲session)。git
Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,總體架構仍是很清晰的。下面借用了網上的架構圖:github
-> Nginx(即Proxy代理層): Nginx前端代理,主要用於分發前端頁面ui訪問和鏡像上傳和下載流量; Harbor的registry,UI,token等服務,經過一個前置的反向代理統一接收瀏覽器、Docker客戶端的請求,並將請求轉發給後端不一樣的服務。web
-> Registry v2: 鏡像倉庫,負責存儲鏡像文件; Docker官方鏡像倉庫, 負責儲存Docker鏡像,並處理docker push/pull命令。因爲咱們要對用戶進行訪問控制,即不一樣用戶對Docker image有不一樣的讀寫權限,Registry會指向一個token服務,強制用戶的每次docker pull/push請求都要攜帶一個合法的token, Registry會經過公鑰對token進行解密驗證。redis
-> Database(MySQL或Postgresql):爲core services提供數據庫服務,負責儲存用戶權限、審計日誌、Docker image分組信息等數據。sql
-> Core services(Admin Server): 這是Harbor的核心功能,主要提供如下服務:
* \-> UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 並對用戶進行受權。 * \-> webhook:爲了及時獲取registry 上image狀態變化的狀況, 在Registry上配置webhook,把狀態變化傳遞給UI模塊。 * \-> Auth服務:負責根據用戶權限給每一個docker push/pull命令簽發token. Docker 客戶端向Regiøstry服務發起的請求,若是不包含token,會被重定向到這裏,得到token後再從新向Registry進行請求。 * \-> API: 提供Harbor RESTful API
Proxy:一個nginx的前端代理,代理Harbor的registry,UI, token等服務。-經過深藍色先標識
db:負責儲存用戶權限、審計日誌、Dockerimage分組信息等數據。
UI:提供圖形化界面,幫助用戶管理registry上的鏡像, 並對用戶進行受權。
jobsevice:jobsevice是負責鏡像複製工做的,他和registry通訊,從一個registry pull鏡像而後push到另外一個registry,並記錄job\_log。經過紫色線標識
Adminserver:是系統的配置管理中心附帶檢查存儲用量,ui和jobserver啓動時候回須要加載adminserver的配置。經過灰色線標識;
Registry:鏡像倉庫,負責存儲鏡像文件。當鏡像上傳完畢後經過hook通知ui建立repository,上圖經過紅色線標識,固然registry的token認證也是經過ui組件完成。經過紅色線標識
Log:爲了幫助監控Harbor運行,負責收集其餘組件的log,供往後進行分析。過docker的log-driver把日誌彙總到一塊兒,經過淺藍色線條標識
[![](/img/bVcReF4)](https://gitee.com/owen2016/pic-hub/raw/master/pics/20201215235702.png)
Harbor以容器的形式進行部署, 所以能夠被部署到任何支持Docker的Linux發行版, 要使用Harbor,須要安裝docker和docker-compose編排工具
訪問harbor release page,下載Harbor軟件tgz壓縮包
或執行以下命令 wget https://storage.googleapis.com/harbor-releases/release-2.0.0/harbor-offline-installer-latest.tgz
解壓tgz壓縮包
`tar xvf harbor-offline-installer-<version>.tgz`
注: 新版本是.yaml文件,以前版本是.conf 或者 .cfg文件
解壓後文件在當前目錄下的harbor/
目錄下
``` `cd harbor/` `vim harbor.cfg` `harbor_admin_password = Harbor12345` ```
配置完後,執行安裝腳本 ./install.sh
``` `#會拉取好幾個鏡像下來,及檢查環境` `Note: docker version: 1.12.5` `Note: docker-compose version: 1.9.0` `[Step 0]: checking installation environment ...` `....` `[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.----` `...` `For more details, please visit https://github.com/vmware/harbor .` ``` 安裝完成後,會發現解壓目錄harbor下面多了一個docker-compose.yml文件,裏面包含了harbor依賴的鏡像和對應容器建立的信息
執行 docker-compose ps (執行docker-compose需在包含docker-compose.yml的目錄) , 確保 container 的狀態都是up (healthy).
若是安裝一切順利,經過以前在harbor.cfg配置的hostname便可以訪問到前端了.
Harbor安裝 以後,須要用docker-compose ps
命令去查看狀態,保證全部docker 容器都是 healthy, 不然 極可能login harbor 失敗
若是那個service 啓動不正常,就去查看/var/log/harbor/ 下對應的log
`owen@swarm-node-107:/disk/harbor_v2.0.0$ ls /var/log/harbor/ -lht` `總用量 22M` `-rw-r--r-- 1 10000 10000 3.5M 12月 15 23:03 registryctl.log` `-rw-r--r-- 1 10000 10000 5.4M 12月 15 23:02 core.log` `-rw-r--r-- 1 10000 10000 4.4M 12月 15 23:02 portal.log` `-rw-r--r-- 1 10000 10000 4.9M 12月 15 23:02 registry.log` `-rw-r--r-- 1 10000 10000 1.2M 12月 15 23:02 proxy.log` `-rw-r--r-- 1 10000 10000 392K 12月 15 23:00 redis.log` `-rw-r--r-- 1 10000 10000 1.6M 12月 15 23:00 jobservice.log` `-rw-r--r-- 1 10000 10000 53K 12月 14 21:42 postgresql.log` `-rw-r--r-- 1 10000 10000 65K 7月 7 23:35 clair.log` `-rw-r--r-- 1 10000 10000 1.2K 7月 5 11:43 clair-adapter.log` `-rw-r--r-- 1 10000 10000 1.4K 7月 5 11:38 chartmuseum.log`
修改harbor的運行配置,須要以下步驟:
`# 中止 harbor` `docker-compose down -v` `# 修改配置` `vim harbor.cfg` `# 執行./prepare已更新配置到docker-compose.yml文件` `./prepare` `# 啓動 harbor` `docker-compose up -d`
ubuntu@172-20-16-51:/opt/harbor$ docker login 192.20.16.51
Username: admin
Password:
Error response from daemon: login attempt to http://192.20.16.51/v2/ failed with status: 502 Bad Gateway
Harbor-db service 不能正常啓動,最後查看postgresql.log 發現下面 message.
`| initdb: directory "/var/lib/postgresql/data" exists but is not empty` `| If you want to create a new database system, either remove or empty` `| the directory "/var/lib/postgresql/data" or run initdb` `| with an argument other than "/var/lib/postgresql/data".`
由於當時/data/datebase 目錄下,確實不是empty, 手動改了docker-compose.yml ,而後 docker-compose up -d
從新啓動容器,服務正常
`postgresql:` `image: goharbor/harbor-db:v2.0.0` `container_name: harbor-db` `restart: always` `cap_drop:` `- ALL` `cap_add:` `- CHOWN` `- DAC_OVERRIDE` `- SETGID` `- SETUID` `volumes:` `- /data/database:/var/lib/postgresql/data:z`
`# docker login 192.20.16.51:80` `Username: admin` `Password:` `Error response from daemon: Get https://192.20.16.51:80/v2/: http: server gave HTTP response to HTTPS client` `或者` `Error response from daemon: Get https://192.168.31.107/v2/: dial tcp 192.168.31.107:443: connect: connection refused`
docker1.3.2版本開始默認docker registry使用的是https,·Harbor默認安裝使用的是HTTP協議·,因此當執行用docker login、pull、push等命令操做非https的docker regsitry
的時就會報錯。
臨時解決辦法:須要在每一臺harbor客戶端機器都要設置"insecure-registries" (完全解決須要啓動Harbor HTTPS證書)
若是系統是MacOS,則能夠點擊「Preference」裏面的「Advanced」在「Insecure Registry」里加上hostname (e.g. docker.bksx.com),重啓Docker客戶端就能夠了。
若是系統是Ubuntu
,則修改配置文件/lib/systemd/system/docker.service
,修改[Service]下ExecStart參數,增長–insecure-registry hostname
(e.g. docker.bksx.com)
若是系統是Centos
,能夠修改配置/etc/sysconfig/docker
,將OPTIONS增長 –insecure-registry hostname
(e.g. docker.bksx.com)
若是是新版本的docker在/etc/sysconfig/ 沒有docker這個配置文件的狀況下。
`#在daemon.json中添加如下參數` `[root@localhost harbor]# cat /etc/docker/daemon.json` `{` `"insecure-registries": [` `"hostname"` `]` `}`
注意:該文件必須符合 json 規範,不然 Docker 將不能啓動。另外hostname 必須與harbor.cfg 裏的hostname 一致。
添加完了後從新啓動 docker:systemctl daemon-reload && systemctl enable docker && systemctl restart docker
登陸後,帳號信息都保存到本機的~/.docker/config.json
`owen@swarm-manager-105:~/gitee/vnote_notebooks$ docker login 192.168.31.107` `Username: admin` `Password:` `WARNING! Your password will be stored unencrypted in /home/owen/.docker/config.json.` `Configure a credential helper to remove this warning. See` `https://docs.docker.com/engine/reference/commandline/login/#credentials-store` `Login Succeeded` `owen@swarm-manager-105:~/gitee/vnote_notebooks$ cat ~/.docker/config.json` `{` `"auths": {` `"192.168.31.107": {` `"auth": "YWRtaW46SGFyYm9yMTIzNDU="` `}` `},` `"HttpHeaders": {` `"User-Agent": "Docker-Client/19.03.14 (linux)"` `}`