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

本節內容:java

  • Harbor介紹
  • 安裝部署Harbor
    • 環境要求
    • 環境信息
    • 安裝部署harbor
    • 配置harbor
    • 配置存儲
    • 完成安裝和啓動harbor
  • 訪問Harbor
    • 修改管理員密碼
    • 啓動後相關容器
  • Harbor持久化數據和日誌
  • 管理Harbor的生命
    • 中止harbor
    • 啓動harbor
    • 修改配置後啓動
    • 清除harbor容器,保留鏡像和數據
    • 刪除harbors數據庫和鏡像(用於乾淨的從新安裝)
  • Harbor的安全機制
    • 用戶
    • 成員
  • Harbor使用
  • 鏡像刪除和空間回收

 

1、Harbor介紹

Harbor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而得到了更加普遍的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪問控制 ,AD/LDAP集成以及審計日誌等。node

 

2、安裝部署Harbor

官方安裝文檔:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.mdpython

 

1. 環境要求mysql

  • python 2.7+
  • docker 1.10+
  • docker-compose 1.6.0+

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中。在該文件中,有兩種參數,必須配置的和可選的。

  • 必須的:這些參數會在用戶更新配置文件和執行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 

我這裏配置了阿里雲容器加速,因此在線版安裝沒有問題,若是有網絡問題能夠選擇離線包安裝。

 

3、訪問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界面配置認證、同步、郵件和系統等信息,修改當即生效,無需重啓整個系統。

 

4、Harbor持久化數據和日誌

默認狀況下,registrys數據被持久化在宿主機的/data/目錄下,甚至你刪除harbor容器或者從新被建立,這部分數據也不會改變。

另外,harbor使用rsyslog來收集每個容器日誌,默認狀況下,這些日誌存放在宿主機的/var/log/harbor/目錄下。

 

5、管理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

 

6、Harbor的安全機制

企業中的軟件研發團隊每每劃分爲諸多角色,如項目經理、產品經理、測試、運維等。在實際的軟件開發和運維過程當中,這些角色對於鏡像的使用需求是不同的。好比:開發人員須要擁有對鏡像的讀寫(PULL/PUSH)權限以更新和改正代碼;測試人員中須要讀取(PULL)權限;而項目經理須要對上述的角色進行管理。

Harbor爲這種需求提供了用戶和成員兩種管理概念。

 

1. 用戶

用戶主要分兩類:

  • 管理員
  • 普通用戶

兩類用戶均可以成爲項目的成員。而管理員能夠對用戶進行管理。

 

2. 成員

成員是對應於項目的概念,分爲三類:

  • 管理員
  • 開發者
  • 訪客

管理員能夠對開發者和訪客做權限的配置和管理。測試和運維人員能夠訪客身份讀取項目鏡像,或者公共鏡像庫中的文件。

從項目的角度出發,項目管理員擁有最大的項目權限,若是要對用戶進行禁用或限權等,能夠經過修改用戶在項目中的成員角色來實現,甚至將用戶移除出這個項目。

下面以實際操做來演示。

 

7、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"

 

8、鏡像刪除和空間回收

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/
相關文章
相關標籤/搜索