本節內容:java
Harbor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而得到了更加普遍的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪問控制 ,AD/LDAP集成以及審計日誌等。node
官方安裝文檔:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.mdpython
1. 環境要求mysql
Docker的安裝見文章《Docker鏡像和容器》和docker-compose的安裝見文章《Registry私有倉庫搭建及認證》。nginx
2. 環境信息git
主機名 | 操做系統版本 | IP地址 | 安裝軟件 |
spark32 | CentOS 7.0 | 172.16.206.32 | docker-ce 17.06.一、docker-compose 1.15.0、harbor-online-installer-v1.1.2.tar |
3. 安裝部署harborgithub
[root@spark32 ~]# cd /opt/ [root@spark32 opt]# mkdir harbor [root@spark32 opt]# cd harbor/
下載地址:https://github.com/vmware/harbor/releasesweb
因爲我這裏服務器能夠聯網,離線版本又很大,因此下載的在線安裝版本的1.1.2版本,將軟件上傳到/opt/harbor/目錄下。sql
[root@spark32 harbor]# tar xvf harbor-online-installer-v1.1.2.tar
4. 配置harbordocker
可配置的參數在文件harbor.cfg中。在該文件中,有兩種參數,必須配置的和可選的。
【注意】:若是你經過web ui設置這些參數,請在harbor啓動後當即設置。尤爲是,必須先設置 auth_mode 在你註冊或建立任何用戶以前。
這些具體參數的名字和意義詳見https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
[root@spark32 harbor]# cd harbor/ [root@spark32 harbor]# vim harbor.cfg # 指定 hostname,爲IP或者域名,用於登陸 Web UI 界面 hostname = 172.16.206.32 # mysql 數據庫 root 帳戶密碼 db_password = 123456 # 郵件相關信息配置,如忘記密碼發送郵件 email_server = smtp.exmail.qq.com email_server_port = 465 email_username = 01115004@wisedu.com email_password = 123456 email_from = admin <01115004@wisedu.com> email_ssl = on
5. 配置存儲
默認狀況下,harbor把鏡像存儲在本地文件系統,在生產環境中,你可能考慮用其餘的存儲替代本地存儲,好比S3, Openstack Swift, Ceph等等。你須要修改 common/templates/registry/config.yml 中的 storage 段。好比使用Openstack Swift,storage段的配置相似以下:
storage: swift: username: admin password: ADMIN_PASS authurl: http://keystone_addr:35357/v3/auth tenant: admin domain: default region: regionOne container: docker_images
更詳細的存儲配置,見 Registry Configuration Reference
6. 完成安裝和啓動harbor
一旦harbor.cfg和後端存儲(可選的)配置完成,就可使用install.sh腳本安裝和啓動harbor了。注意在線安裝可能須要等待一些時間從dockerhubs下載harbor鏡像。
【注意】:請確保主機上80和443端口沒被佔用。若是想修改端口,須要去修改docker-compose.yml文件。
[root@spark32 harbor]# pwd /opt/harbor/harbor [root@spark32 harbor]# ./install.sh
我這裏配置了阿里雲容器加速,因此在線版安裝沒有問題,若是有網絡問題能夠選擇離線包安裝。
瀏覽器輸入http://172.16.206.32
默認帳號密碼是admin/Harbor12345。默認是80端口,若是端口占用,咱們能夠去修改docker-compose.yml文件中,對應服務的端口映射。
咱們能夠看到系統各個模塊以下:
【注意】:非系統管理員用戶登陸,只能看到有權限的項目和日誌,其餘模塊不可見。
1. 修改管理員密碼
點擊右上角的admin,點擊修改密碼。
2. 啓動後相關容器
Harbor的全部服務組件都是在Docker中部署的。
[root@spark32 harbor]# ls common docker-compose.notary.yml docker-compose.yml harbor_1_1_0_template harbor.cfg install.sh LICENSE NOTICE prepare upgrade [root@spark32 harbor]# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------ harbor-adminserver /harbor/harbor_adminserver Up harbor-db docker-entrypoint.sh mysqld Up 3306/tcp harbor-jobservice /harbor/harbor_jobservice Up harbor-log /bin/sh -c crond && rm -f ... Up 127.0.0.1:1514->514/tcp harbor-ui /harbor/harbor_ui Up nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
這幾個 Contianer 經過 Docker link 的形式鏈接在一塊兒,在容器之間經過容器名字互相訪問。對終端用戶而言,只須要暴露 proxy(即Nginx)的服務端口。
【注意】:以前的版本更新配置,須要修改harbor.cfg,而後中止並刪除現有Harbor實例,再從新運行Harbor,比較繁瑣。新版本的adminconsole可使用戶很方便地經過WEB界面配置認證、同步、郵件和系統等信息,修改當即生效,無需重啓整個系統。
默認狀況下,registrys數據被持久化在宿主機的/data/目錄下,甚至你刪除harbor容器或者從新被建立,這部分數據也不會改變。
另外,harbor使用rsyslog來收集每個容器日誌,默認狀況下,這些日誌存放在宿主機的/var/log/harbor/目錄下。
可使用docker-compose來管理harbor的啓動、中止和銷燬。可是注意必須切換到docker-compose.yml同級目錄運行如下的命令。
1. 中止harbor
# docker-compose stop
2. 啓動harbor
# docker-compose start
3. 修改配置後啓動
先中止harbor,在修改配置文件harbor.cfg,而後運行prepare腳本應用配置,最後從新建立harbor並運行它。
# docker-compose down -v
# vim harbor.cfg
# prepare
# docker-compose up -d
4. 清除harbor容器,保留鏡像和數據
# docker-compose down -v
5. 刪除harbors數據庫和鏡像(用於乾淨的從新安裝)
# rm -r /data/database # rm -r /data/registry
企業中的軟件研發團隊每每劃分爲諸多角色,如項目經理、產品經理、測試、運維等。在實際的軟件開發和運維過程當中,這些角色對於鏡像的使用需求是不同的。好比:開發人員須要擁有對鏡像的讀寫(PULL/PUSH)權限以更新和改正代碼;測試人員中須要讀取(PULL)權限;而項目經理須要對上述的角色進行管理。
Harbor爲這種需求提供了用戶和成員兩種管理概念。
1. 用戶
用戶主要分兩類:
兩類用戶均可以成爲項目的成員。而管理員能夠對用戶進行管理。
2. 成員
成員是對應於項目的概念,分爲三類:
管理員能夠對開發者和訪客做權限的配置和管理。測試和運維人員能夠訪客身份讀取項目鏡像,或者公共鏡像庫中的文件。
從項目的角度出發,項目管理員擁有最大的項目權限,若是要對用戶進行禁用或限權等,能夠經過修改用戶在項目中的成員角色來實現,甚至將用戶移除出這個項目。
下面以實際操做來演示。
官方使用文檔:https://github.com/vmware/harbor/blob/master/docs/user_guide.md
注意:當項目設爲公開後,任何人都有此項目下鏡像的讀權限。命令行用戶不須要「docker login」就能夠拉取此項目下的鏡像。因此通常須要創建私有項目。
1. 登陸harbor,點擊「+項目」
2. 點擊左側菜單「用戶管理」,點擊「+用戶」
3. 點擊左側菜單項目,選擇剛纔建立的項目「godseye」,在點擊右側正文中的選項卡「成員」,點擊「+成員」,輸入剛纔建立的用戶,並設置其爲管理員。
對於權限(角色),項目管理員和開發人員能夠有 push 的權限,而訪客只能查看和 pull
4. 測試
我這裏找了另一臺機器,安裝了docker 1.12.6。因爲這裏harbor採用了默認的 http 方式鏈接,而 Docker 認爲這是不安全的,因此在 push 以前須要調整一下 docker 配置:
[root@node3 ~]# vim /etc/docker/daemon.json { "insecure-registries": ["172.16.206.32"] } [root@node3 ~]# systemctl restart docker
登陸harbor:
[root@node3 ~]# docker login 172.16.206.32 Username: jkzhao Password: Login Succeeded
而後 tag 一個 image,名稱必定要標準( registryAddress[:端口]/項目/imageName[:tag] ),最後將其 push 便可
[root@node3 ~]# docker tag centos:centos7 172.16.206.32/godseye/centos:latest [root@node3 ~]# docker push 172.16.206.32/godseye/centos:latest
而後到web ui上查看剛纔push的鏡像是否成功了:
【補充】:若是使用的docker客戶端版本比較低,好比在centos6上安裝了docker 1.7.1,那麼一樣須要先調整docker的配置:
[root@osb30 ~]# vim /etc/sysconfig/docker other_args="--insecure-registry=172.16.206.32"
Docker命令沒有提供Registry鏡像刪除功能,日積月累,將會產生許多無用的鏡像,佔用大量存儲空間。若要刪除鏡像並回收空間,須要調用docker registry API來完成,比較麻煩。Harbor提供了可視化的鏡像刪除界面,能夠邏輯刪除鏡像。在維護狀態下能夠回收垃圾鏡像的空間。
[root@node3 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE java openjdk-8-jre-alpine d61ff40a5bf6 16 months ago 108.3 MB [root@node3 ~]# docker login 172.16.206.32 Username: jkzhao Password: Login Succeeded [root@node3 ~]# docker tag java:openjdk-8-jre-alpine 172.16.206.32/godseye/jdk:openjdk-8-jre-alpine [root@node3 ~]# docker push 172.16.206.32/godseye/jdk:openjdk-8-jre-alpine
咱們先查看下宿主機上存放鏡像的目錄大小:
[root@spark32 2017-09-08]# du -sh /data/registry/docker/registry/v2/ 110M /data/registry/docker/registry/v2/
登陸harbor界面,點擊godseye項目,刪除剛纔上傳的鏡像:
可是實際上這只是邏輯刪除,咱們能夠查看此時宿主機上存放鏡像的目錄大小,仍然是110M:
[root@spark32 2017-09-08]# du -sh /data/registry/docker/registry/v2/ 110M /data/registry/docker/registry/v2/
此時你徹底能夠再次上傳這個鏡像,會顯示這些鏡像層已經存在了:
[root@node3 ~]# docker push 172.16.206.32/godseye/jdk:openjdk-8-jre-alpine The push refers to a repository [172.16.206.32/godseye/jdk] 2b4866cc0048: Layer already exists 5f70bf18a086: Layer already exists 8f01a53880b9: Layer already exists openjdk-8-jre-alpine: digest:sha256:56b1ffe13af2ee1c5e2c9a3d3cd8c377b5f1bc6130a87648d48ba3fffab0d5eb size: 1977
那麼如何完全刪除這個鏡像呢?
1.首先去界面刪除這個鏡像
2.在harbor宿主機上執行以下的命令:
先找到當前的registry版本:
[root@spark32 harbor]# docker images vmware/registry REPOSITORY TAG IMAGE ID CREATED SIZE vmware/registry 2.6.1-photon 0f6c96580032 3 months ago 150MB
列出要刪除的鏡像:
[root@spark32 harbor]# docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.1-photon garbage-collect --dry-run /etc/registry/config.yml
選項 --dry-run 只是在最後打印出界面刪除了的可是實際上並未刪除的鏡像層,可是這條命令不會刪除這些鏡像層。
運行下面的命令刪除鏡像:
[root@spark32 harbor]# docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.1-photon garbage-collect /etc/registry/config.yml
再次查看存放鏡像的目錄大小:
[root@spark32 2017-09-08]# du -sh /data/registry/docker/registry/v2/ 70M /data/registry/docker/registry/v2/