企業級Docker Registry —— Harbor搭建和使用


本節內容:

  • 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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM