harbor:
Harbor是構建企業級私有docker鏡像的倉庫的開源解決方案,它是Docker Registry的更高級封裝,它除了提供友好的Web UI界面,角色和用戶權限管理,用戶操做審計等功能外,它還整合了K8s的插件(Add-ons)倉庫,即Helm經過chart方式下載,管理,安裝K8s插件,而chartmuseum能夠提供存儲chart數據的倉庫【注:helm就至關於k8s的yum】。另外它還整合了兩個開源的安全組件,一個是Notary,另外一個是Clair,Notary相似於私有CA中心,而Clair則是容器安全掃描工具,它經過各大廠商提供的CVE漏洞庫來獲取最新漏洞信息,並掃描用戶上傳的容器是否存在已知的漏洞信息,這兩個安全功能對於企業級私有倉庫來講是很是具備意義的。
補充:
Nexus 是Maven倉庫管理器,若是你使用Maven,你能夠從Maven中央倉庫 下載所須要的構件(artifact),但這一般不是一個好的作法,你應該在本地架設一個Maven倉庫服務器,在代理遠程倉庫的同時維護本地倉庫,以節省帶寬和時間,Nexus就能夠知足這樣的須要。此外,他還提供了強大的倉庫管理功能,構件搜索功能,它基於REST,友好的UI是一個extjs的REST客戶端,它佔用較少的內存,基於簡單文件系統而非數據庫。這些優勢使其日趨成爲最流行的Maven倉庫管理器。
Notary是一個容許任何人信任任意數據集合的項目。Notary項目包括服務器和客戶端,用於運行和與可信集合交互。Notary旨在經過讓人們輕鬆發佈和驗證內容,使互聯網更加安全。咱們常常依靠TLS來保護咱們與Web服務器的通訊,這自己就存在缺陷,由於服務器被攻破時可以使惡意內容替代合法內容。藉助Notary,發佈商可使用保持高度安全的密鑰離線簽署其內容。一旦發佈者準備好內容,他們能夠將他們簽名的可信集合推送到Notary服務器。消費者經過安全渠道得到了發佈者的公鑰,而後能夠與任何Notary服務器或(不安全)鏡像進行通訊,僅依靠發佈者的密鑰來肯定接收內容的有效性和完整性。Notary基於TUF項目,一個針對軟件分發和更新問題的安全通用設計。
Clair:
參考: http://www.javashuo.com/article/p-navsdjcb-gs.html
經過對容器的layer進行掃描,發現漏洞並進行預警,其使用數據是基於Common Vulnerabilities and Exposures數據庫(簡稱CVE), 各Linux發行版通常都有本身的CVE源,而Clair則是與其進行匹配以判斷漏洞的存在與否,好比HeartBleed的CVE爲:CVE-2014-0160。 node
目前Clair支持以下數據源:mysql
HARBOR:
這是VMWare公司提供的一個docker私有倉庫構建程序,功能很是強大.
1. 支持多租戶簽名和認證
2. 支持安全掃描和風險分析
3. 此次日誌審計
4. 基於角色的訪問控制
5. 支持可擴展的API和GUI
6. Image replication between instances
7. 國際化作的很好(目前僅支持英文和中文)
linux
Harbor部署:
1. 從GitHub上下載Harbor的二進制發行包.
2. 準備必要的環境:
yum install docker-ce docker-compose
3. 解壓後,先編輯harbor.cfg
vim harbor.cfg
hostname = node1.test.com
ui_url_protocol = http
max_job_workers = 3 #啓動3個處理用戶上傳下載的進程,若爲4核,3個就是最好的。
admiral_url = NA #NA:不自定義管理URL
harbor_admin_password = Harbor12345 #默認的管理員密碼
#默認它會自動建立一個mysql容器,並設置mysql的root密碼爲root123,
#注意:從harbor v1.7.5之後使用的數據庫默認是postgresql
db_password = root123
#若想讓其使用外部數據庫,可修改下面參數爲外部數據庫的地址.
db_host = postgresql
#若啓用了--with-clair時,注意修改clair的數據庫密碼,還有redis的密碼,由於clair須要使用redis。
clair_db_password = root123
4. 運行 install.sh ,若須要啓用harbor的其它功能,可查看 install.sh --help
安裝完成後,它會提示你訪問harbor的地址是多少,你就能夠直接在瀏覽器中訪問這個地址了。
5. 可測試打開harbor,並測試上傳鏡像。
5.1 在測試上傳鏡像時,須要先登陸harbor的Web界面,而後建立一個項目,這個項目就至關於公司中不一樣的項目組,每一個項目組分別管理各自的項目鏡像,以便後期該項目不須要時,可直接刪除該項目。
5.2 而後到harbor客戶端,測試登陸harbor倉庫,並嘗試上傳鏡像
5.2.1 由於這裏使用了非安全的HTTP,所以須要修改docker的啓動參數
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --selinux-enabled=false --insecure-registry 192.168.10.154
#若沒有啓用SELinux可設置不啓用它
#--insecure-registry 即指定一個非安全的倉庫,這裏指定內網harbor地址爲192.168.10.154
# 如有多個可重複--insecure-registry
5.2.2 測試上傳鏡像
~]# docker login http://192.168.10.154
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json. #這裏須要注意: 登陸成功後,用戶名密碼會保存到config.json中。
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
~]# docker push 192.168.10.154/test1/nginx-alpine:v1 #這樣就能夠上傳鏡像到harbor上了。
6. 可自行查看 docker-compose.yml, install.sh 實際執行的docker-compose命令.
docker-compose
#命令在運行時,會自動在當前目錄下,找docker-compose.yml配置文件,若找到則安裝裏面的定義
#來決定到哪裏去找鏡像,先啓動那個容器,啓動鏡像須要掛載什麼卷等。
在配置Harbor時,若出現問題,可結合/var/log/harbor中的日誌文件來查看問題.
我一般會這樣查看:
tail -f /var/log/harbor/*.log
Harbor配置HTTPS:
1. 修改 harbor.cfg
hostname = harbor.zcf.com
ui_url_protocol = https
ssl_cert = /data/docker/certs/harbor.zcf.com.crt
ssl_cert_key = /data/docker/certs/harbor.zcf.com.key
harbor_admin_password = adminpass
2. 建立證書,並放到上面定義的目錄中
測試使用,可以使用我用shell寫的證書製做工具:
https://github.com/zhang75656/shell-tools/blob/master/gencret.sh
chmod +x gencret.sh
./gencret.sh --help #可查看使用幫助.但前提是必須安裝openssl
3. 從新執行 ./install.sh 便可,這樣harbor服務端就能夠工做了.
Harbor 客戶端配置:
1. 在docker配置目錄下建立證書目錄,
#注意: 證書目錄是存放harbor服務器的證書文件.
# docker login harbor.zcf.com
# 當執行上面命令登陸harbor時,默認docker會到/etc/docker/certs.d/下去找 harbor.zcf.com這個目錄,看其下面是否有證書可用。
# 因此,須要將harbor服務器上的證書scp過來,放到docker客戶端的這個目錄中。
mkdir /etc/docker/certs.d/harbor.zcf.com
nginx
Harbor經過Systemd管理時,所須要的systemd腳本參考:git
[Unit]
Description=BigDisk docker-compose container starter
After=docker.service network-online.target
Requires=docker.service network-online.target
[Service]
WorkingDirectory=/[path_to_harbor] #這裏須要修改成Harbor的安裝目錄.
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/docker-compose up -d #這裏須要確認,docker-compose的路徑是否與本身的系統的路徑一致.
ExecStop=/usr/local/bin/docker-compose down
ExecReload=/usr/bin/docker-compose up -d
[Install]
WantedBy=multi-user.targetgithub