Docker鏡像倉庫Harbor之搭建及配置... 1前端
1、 Harbor簡介... 1node
2、 安裝和配置Harbor. 3python
1. 環境說明... 3linux
2. 安裝docker. 4nginx
3. 安裝docker-compose. 4git
4. 安裝harbor. 6github
5. 修改配置文件... 6web
6. 執行安裝腳本... 6redis
7. Harbor啓動和中止... 7docker
8. 訪問測試... 7
3、 測試上傳和下載鏡像... 8
4、 Harbor配置TLS證書... 9
1. 修改Harbor配置文件... 9
2. 建立自簽名證書key文件... 9
3. 建立自簽名證書crt文件... 10
4. 開始安裝Harbor. 10
5. 客戶端配置... 10
6. 測試是否支持https訪問... 10
5、 鏡像刪除... 11
6、 遇到問題... 13
Docker容器應用的開發和運行離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署咱們私有環境內的Registry也是很是必要的。Harbor是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日誌審覈、管理界面、自我註冊、鏡像複製和中文支持等功能。
Harbor在架構上主要由6個組件構成:
各個組件之間的關係以下圖所示:
Harbor實現
Harbor的每一個組件都是以Docker容器的形式構建的,官方也是使用Docker Compose來對它進行部署。用於部署Harbor的Docker Compose模板位於 harbor/docker-compose.yml,打開這個模板文件,發現Harbor是由7個容器組成的;
nginx:nginx負責流量轉發和安全驗證,對外提供的流量都是從nginx中轉,因此開放https的443端口,它將流量分發到後端的ui和正在docker鏡像存儲的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模塊,job在harbor裏面主要是爲了鏡像倉庫以前同步使用的;
harbor-ui:harbor-ui是web管理頁面,主要是前端的頁面和後端CURD的接口;
registry:registry就是docker原生的倉庫,負責保存鏡像。
harbor-adminserver:harbor-adminserver是harbor系統管理接口,能夠修改系統配置以及獲取系統信息。
這幾個容器經過Docker link的形式鏈接在一塊兒,在容器之間經過容器名字互相訪問。對終端用戶而言,只須要暴露proxy (即Nginx)的服務端口。
harbor-db:harbor-db是harbor的數據庫,這裏保存了系統的job以及項目、人員權限管理。因爲本harbor的認證也是經過數據,在生產環節大多對接到企業的ldap中;
harbor-log:harbor-log是harbor的日誌服務,統一管理harbor的日誌。經過inspect能夠看出容器統一將日誌輸出的syslog。
這幾個容器經過Docker link的形式鏈接在一塊兒,這樣,在容器之間能夠經過容器名字互相訪問。對終端用戶而言,只須要暴露proxy (即Nginx)的服務端口。
環境名稱 |
版本 |
系統版本 |
CentOS Linux release 7.2.1511 (Core) |
docker-ce |
17.03.1-ce |
docker-compose |
1.16.1 |
Harbor |
v1.2.0 |
安裝方式 |
在線安裝 |
安裝位置 |
/usr/local/harbor |
安裝Harbor須要先安裝docker和docker-compose
# yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
配置repository:
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安裝最新版本docker-ce Docker version 17.03.1-ce
# yum install docker-ce
啓動docker:
# systemctl start docker
若是須要卸載docker-ce,操做以下:
yum remove docker-ce
卸載後images,containers,volumes,configuration files 是不能自動刪除的,爲了刪除all images,containers,and volumes,請執行以下命令:
rm -rf /var/lib/docker
方法一:二進制安裝
a.下載二進制文件
# curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
若是須要安裝其餘版本的話,請修改上面命令中的版本號。
b.賦予二進制文件可執行權限
# chmod +x /usr/local/bin/docker-compose
c.根據本身的狀況決定是否安裝命令補全功能
# yum install bash-completion
[root@test-tz-master ~]# curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# docker-compose
build config down exec images logs port pull restart run start top up
bundle create events help kill pause ps push rm scale stop unpause version
d.測試是否安裝成功
# docker-compose --version
docker-compose version 1.22.0, build 6d1ac21
若是是單機版,則將此文件拷貝到/usr/local/bin/docker-compose,執行便可,只能用這種方式安裝的進行,pip方式拷貝不生效。
方法二:pip
# yum install python-pip
# pip install --upgrade pip
# pip install docker-compose
測試:
# docker-compose --version
卸載docker-compose
對應上面兩種安裝方法:
二進制:
# rm /usr/local/bin/docker-compose
pip 方式
# pip uninstall docker-compose
根據狀況看是否須要安裝
沒有python-pip包執行命令 yum install –y epel-release
執行yum install 報錯
"Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7"
解決:yum install -y epel-release
# cd /etc/pki/rpm-gpg
# wget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
報錯及解決
報錯:ReadTimeoutError: HTTPSConnectionPool(host='pypi.python.org', port=443): Read timed out
# pip --default-timeout=200 install -U docker-compose
若是報錯:
pkg_resources.DistributionNotFound: backports.ssl-match-hostname>=3.5
解決方法:更新backports.ssl-match-hostname的版本,在終端輸入命令
pip install --upgrade backports.ssl_match_hostname
安裝方式分爲在線安裝和離線安裝兩種方式,我這裏選擇的是離線安裝。
# wget -P /usr/loca/src/ https:
//github.com/vmware/harbor/releases/download/v1.6.0/harbor-offline-installer-v1.6.0.tgz
# cd /usr/local/src/
# tar zxf harbor-online-installer-v1.2.0.tgz -C /usr/local/
# cd /usr/local/harbor/
# vim /usr/local/harbor/harbor.cfg
hostname =
http://192.168.1.121
#郵箱配置
email_server = smtp.qq.com
25email_server_port =
@unixfbiemail_username = unixfbi.com
12345678email_password =
@unixfbiemail_from = UnixFBI <unixfbi.com>
falseemail_ssl =
#禁止用戶註冊
self_registration = off
#用戶建立項目權限控制,默認是everyone(全部人),也能夠設置爲adminonly(只能管理員)
project_creation_restriction = adminonly
harbor_admin_password = Harbor
# sh install.sh
出現如下安裝成功
Now you should be able to visit the admin portal at http://192.168.1.121
For more details, please visit https://github.com/vmware/harbor
Harbor 的平常運維管理是經過docker-compose來完成的,Harbor自己有多個服務進程,都放在docker容器之中運行,咱們能夠經過docker ps命令查看。
[root@node01-1 harbor]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up
harbor-db /entrypoint.sh postgres Up 5432/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up 127.0.0.1:1514->10514/tcp
harbor-ui /harbor/start.sh 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
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh /etc/regist ... Up 5000/tcp
Harbor的啓動和中止
啓動Harbor
# docker-compose start docker-compose up -d
中止Harbor
# docker-comose stop docker-compose down -v
重啓Harbor
# docker-compose restart
瀏覽器訪問:http://192.168.1.121
後臺登陸倉庫
[root@node01-1 harbor]# docker login 192.168.1.121 -uadmin -pHarbor
Error response from daemon: Get https://192.168.1.121/v1/users/: dial tcp 192.168.1.121:443: getsockopt: connection refused
[root@node01-1 harbor]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 855/sshd
tcp 0 0 127.0.0.1:1514 0.0.0.0:* LISTEN 1475/docker-proxy-c
tcp6 0 0 :::80 :::* LISTEN 1509/docker-proxy-c
tcp6 0 0 :::22 :::* LISTEN 855/sshd
tcp6 0 0 :::443 :::* LISTEN 1498/docker-proxy-c
tcp6 0 0 :::4443 :::* LISTEN 1487/docker-proxy-c
kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1
查文檔千變一概說docker一個bug,卸載重裝後依然,
# yum remove docker\*
# yum remove container-selinux\*
# ls docker-ce-
docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
# yum install docker-ce-*
# rm -rf /var/lib/docker
# systemctl restart docker
從新安裝harbor,
更改配置文件不生效,後docker版本更換爲17.03,生效
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.121:80
# systemctl daemon-reload
# systemctl restart docker
# docker login 192.168.1.121:80 -uadmin -pHarbor12345
Login Succeeded
# docker tag e548f1a579cf 192.168.1.120:80/library/nginx:t1
# docker push 192.168.1.120:80/library/nginx:t1
修改vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.120
# systemctl daemon-reload
# systemctl restart docker
# docker login 192.168.1.120
Username: admin
Password:
Login Succeeded
[root@master-1 harbor]# docker push 192.168.1.120/library/nginx:t2
The push refers to a repository [192.168.1.120/library/nginx]
e89b70d28795: Pushed
832a3ae4ac84: Layer already exists
014cf8bfcb2d: Layer already exists
t1: digest: sha256:9b1ac09900081baca06c8cad32767aeceed9ee62404b1f0c20122cb9a7b1a6e1 size: 948
可見docker配置文件配的什麼就是什麼,
至此私有鏡像庫搭建完畢!
修改harbor.cfg
hostname = rgs.unixfbi.com
ui_url_protocol = https
ssl_cert = /etc/certs/ca.crt
ssl_cert_key = /etc/certs/ca.key
# mkdir /etc/certs
# openssl genrsa -out /etc/certs/ca.key 2048
Generating RSA private key, 2048 bit long modulus
....+++
..................................................+++
e is 65537 (0x10001)
注意命令中/CN=rgs.unixfbi.com字段中rgs.unixfbi.com修改成你本身的倉庫域名。
# openssl req -x509 -new -nodes -key /etc/certs/ca.key -subj "/CN=rgs.unixfbi.com" -days 5000 -out /etc/certs/ca.crt
# ./install.sh
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://rgs.unixfbi.com.
For more details, please visit https://github.com/vmware/harbor .
客戶端須要建立證書文件存放的位置,而且把服務端建立的證書拷貝到該目錄下,而後重啓客戶端docker。咱們這裏建立目錄爲:/etc/docker/certs.d/rgs.unixfbi.com
# mkdir -p /etc/docker/certs.d/rgs.unixfbi.com
把服務端crt證書文件拷貝到客戶端,例如我這的客戶端爲:192.168.199.183
# scp /etc/certs/ca.crt root@192.168.199.183:/etc/docker/certs.d/rgs.unixfbi.com/
重啓客戶端docker
# systemctl restart docker
# docker login rgs.unixfbi.com
Username (admin):
Password:
Login Succeeded
Harbor私有倉庫運行一段時間後,倉庫中存有大量鏡像,會佔用太多的存儲空間。直接經過Harbor界面刪除相關鏡像,並不會自動刪除存儲中的文件和鏡像。須要中止Harbor服務,執行垃圾回收命令,進行存儲空間清理和回收。
#要啓用垃圾回收(GC),首先要關閉Harbor服務,而後再執行清理命令
#中止Harbor相關服務
$ docker-compose stop
#使用--dry-run參數運行容器,預覽運行效果,但不刪除任何數據
$ docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml
#NOTE: The above option "--dry-run" will print the progress without removing any data.
Verify the result of the above test, then use the below commands to perform garbage collection and restart Harbor.
#不使用--dry-run參數,將刪除相關的文件和鏡像,
$ docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect /etc/registry/config.yml
#從新啓動Harbor相關服務
$ docker-compose start
圖1:01-先在Harbor UI圖形界面中刪除不須要的鏡像
圖2:02-中止Harbor服務,執行垃圾回收命令
[root@master-1 harbor]# docker images | grep goharbor | grep registry
goharbor/registry-photon v2.6.2-v1.6.0 98bf341403a5 6 days ago 201 MB
# docker run -it --name gc --rm --volumes-from registry goharbor/registry-photon:v2.6.2-v1.6.0 garbage-collect --dry-run /etc/registry/config.yml
# docker run -it --name gc --rm --volumes-from registry goharbor/registry-photon:v2.6.2-v1.6.0 garbage-collect /etc/registry/config.yml
遇到的問題就是Harbor我配置的是http訪問,可是docker客戶端默認都是https訪問Harbor,因此就會產生錯誤。下面看看我是怎麼解決這個問題的吧。下面咱們來訪問如下Harbor
# docker pull rgs.unixfbi.com/library/centos7.1:0.1
Error response from daemon: Get https://rgs.unixfbi.com/v1/_ping: dial tcp 192.168.199.233:443: getsockopt: connection refused
解決方法:
方法一:
在docker啓動的配置倉庫地址添加以下內容:
--insecure-registry rgs.unixfbi.com
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry rgs.unixfbi.com
而後
# systemctl daemon-reload
# systemctl restart docker
補充:--insecure-registry 192.168.1.14:5000
dig @114.114.114.114 registry-1.docker.io
參考文檔:
docker
官網: https://docs.docker.com/install/
compose
文檔:https://docs.docker.com/compose/install/#install-compose