本節內容:
- Harbor介紹
- 安裝部署Harbor
- 環境要求
- 環境信息
- 安裝部署harbor
- 配置harbor
- 配置存儲
- 完成安裝和啟動harbor
- 訪問Harbor
- 修改管理員密碼
- 啟動后相關容器
- Harbor持久化數據和日志
- 管理Harbor的生命
- 停止harbor
- 啟動harbor
- 修改配置后啟動
- 清除harbor容器,保留鏡像和數據
- 刪除harbors數據庫和鏡像(用於干凈的重新安裝)
- Harbor的安全機制
- 用戶
- 成員
- Harbor使用
- 鏡像刪除和空間回收
一、Harbor介紹
Harbor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而獲得了更加廣泛的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪問控制 ,AD/LDAP集成以及審計日志等。
二、安裝部署Harbor
官方安裝文檔:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
1. 環境要求
- python 2.7+
- docker 1.10+
- docker-compose 1.6.0+
Docker的安裝見文章《Docker鏡像和容器》和docker-compose的安裝見文章《Registry私有倉庫搭建及認證》。
2. 環境信息
主機名 | 操作系統版本 | IP地址 | 安裝軟件 |
spark32 | CentOS 7.0 | 172.16.206.32 | docker-ce 17.06.1、docker-compose 1.15.0、harbor-online-installer-v1.1.2.tar |
3. 安裝部署harbor
[root@spark32 ~]# cd /opt/ [root@spark32 opt]# mkdir harbor [root@spark32 opt]# cd harbor/
下載地址:https://github.com/vmware/harbor/releases
由於我這里服務器可以聯網,離線版本又很大,所以下載的在線安裝版本的1.1.2版本,將軟件上傳到/opt/harbor/目錄下。
[root@spark32 harbor]# tar xvf harbor-online-installer-v1.1.2.tar
4. 配置harbor
可配置的參數在文件harbor.cfg中。在該文件中,有兩種參數,必須配置的和可選的。
- 必須的:這些參數會在用戶更新配置文件和執行install.sh腳本重新安裝harbor起作用。你至少得設置 hostname 參數。
- 可選的:用戶可以就使用默認值,或者在啟動后通過web ui進行修改。如果這些可選參數被設置在harbor.cfg文件中,它們只會在第一次啟動時起作用,以后在harbor.cfg文件中修改會被忽略。也就是說在 Harbor 初次啟動時,Admin Server 從 harbor.cfg 文件讀取配置並記錄下來。之后重新啟動Harbor的過程中,只有必需的配置會從 harbor.cfg 文件讀取;其他可選的配置將不再生效,需要通過 Admin Server 的管理界面來修改。
【注意】:如果你通過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
我這里配置了阿里雲容器加速,所以在線版安裝沒有問題,如果有網絡問題可以選擇離線包安裝。
三、訪問Harbor
瀏覽器輸入http://172.16.206.32
默認賬號密碼是admin/Harbor12345。默認是80端口,如果端口占用,我們可以去修改docker-compose.yml文件中,對應服務的端口映射。
我們可以看到系統各個模塊如下:
- 項目:新增/刪除項目,查看鏡像倉庫,給項目添加成員、查看操作日志、復制項目等
- 日志:倉庫各個鏡像create、push、pull等操作日志
- 系統管理
- 用戶管理:新增/刪除用戶、設置管理員等
- 復制管理:新增/刪除從庫目標、新建/刪除/啟停復制規則等
- 配置管理:認證模式、復制、郵箱設置、系統設置等
- 其他設置
- 用戶設置:修改用戶名、郵箱、名稱信息
- 修改密碼:修改用戶密碼
【注意】:非系統管理員用戶登錄,只能看到有權限的項目和日志,其他模塊不可見。
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
- harbor-adminserver:用來管理系統配置,並提供了相應的 WEB 頁面和 API 來供用戶操作,改進了之前需用戶手動修改配置文件並手動重啟系統的用戶體驗。
- harbor-db : 由官方MySql鏡像構成的數據庫容器
- harbor-jobservice:是harbor的job管理模塊,job在harbor里面主要是為了鏡像倉庫同步使用的。
- harbor-log : 運行着rsyslogd的容器,通過log-driver的形式收集其他容器的日志
- harbor-ui : 即架構中的core services, 構成此容器的代碼是Harbor項目的主體
- nginx : 由 nginx 服務器構成的反向代理
- registry : 由Docker官方的開源 registry 鏡像構成的容器實例
這幾個 Contianer 通過 Docker link 的形式連接在一起,在容器之間通過容器名字互相訪問。對終端用戶而言,只需要暴露 proxy(即Nginx)的服務端口。
【注意】:之前的版本更新配置,需要修改harbor.cfg,然后停止並刪除現有Harbor實例,再重新運行Harbor,比較繁瑣。新版本的adminconsole可以使用戶很方便地通過WEB界面配置認證、同步、郵件和系統等信息,修改立即生效,無需重啟整個系統。
四、Harbor持久化數據和日志
默認情況下,registrys數據被持久化在宿主機的/data/目錄下,甚至你刪除harbor容器或者重新被創建,這部分數據也不會改變。
另外,harbor使用rsyslog來收集每一個容器日志,默認情況下,這些日志存放在宿主機的/var/log/harbor/目錄下。
五、管理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
六、Harbor的安全機制
企業中的軟件研發團隊往往划分為諸多角色,如項目經理、產品經理、測試、運維等。在實際的軟件開發和運維過程中,這些角色對於鏡像的使用需求是不一樣的。比如:開發人員需要擁有對鏡像的讀寫(PULL/PUSH)權限以更新和改正代碼;測試人員中需要讀取(PULL)權限;而項目經理需要對上述的角色進行管理。
Harbor為這種需求提供了用戶和成員兩種管理概念。
1. 用戶
用戶主要分兩類:
- 管理員
- 普通用戶
兩類用戶都可以成為項目的成員。而管理員可以對用戶進行管理。
2. 成員
成員是對應於項目的概念,分為三類:
- 管理員
- 開發者
- 訪客
管理員可以對開發者和訪客作權限的配置和管理。測試和運維人員可以訪客身份讀取項目鏡像,或者公共鏡像庫中的文件。
從項目的角度出發,項目管理員擁有最大的項目權限,如果要對用戶進行禁用或限權等,可以通過修改用戶在項目中的成員角色來實現,甚至將用戶移除出這個項目。
下面以實際操作來演示。
七、Harbor使用
官方使用文檔: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/