轉載:https://k8s.abcdocker.com/kubernetes_harbor.htmlcss
1、介紹html
Docker容器應用的開發和運行路不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署咱們私有環境的Registry也是很是必要的。 Harbor是由VMware
公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日誌審覈、管理界面、自我註冊、鏡像複製和中文支持等功能。mysql
2、組件linux
用於部署 Harbor 的 Docker Compose 模板位於 /Deployer/docker-compose.yml. 打開這個模板文件,會發現 Harbor 由 5 個容器組成:nginx
這幾個容器經過 Docker link 的形式鏈接在一塊兒,這樣,在容器之間能夠經過容器名字互相訪問。對終端用戶而言,只須要暴露 proxy (即 Nginx)的服務端口。git
3、工做原理github
假設咱們將 Harbor 部署在主機名爲 registry.abcdocker.com 的虛機上。用戶經過 docker login 命令向這個 Harbor 服務發起登陸請求:docker login registry.abcdocker.com當用戶輸入所需信息並點擊回車後,Docker 客戶端會向地址「registry.abcdocker.com/v2/」 發出 HTTP GET 請求。redis
Harbor 的各個容器會經過如下步驟處理:sql
(1)Docker logindocker
(a) 首先,這個請求會由監聽 80 端口的 proxy 容器接收到。根據預先設置的匹配規則,容器中的 Nginx會將請求轉發給後端的 registry 容器;
(b) 在 registry 容器一方,因爲配置了基於 token 的認證,registry 會返回錯誤代碼 401,提示 Docker客戶端訪問 token 服務綁定的 URL。在 Harbor 中,這個 URL 指向 Core Services;
(c) Docker 客戶端在接到這個錯誤代碼後,會向token服務的URL發出請求,並根據HTTP協議的BasicAuthentication 規範,將用戶名密碼組合並編碼,放在請求頭部(header);
(d)相似地,這個請求經過 80 端口發到 proxy 容器後,Nginx 會根據規則把請求轉發給 ui 容器,ui 容器監聽 token 服務網址的處理程序接收到請求後,會將請求頭解碼,獲得用戶名、密碼;
(e) 在獲得用戶名、密碼後,ui 容器中的代碼會查詢數據庫,將用戶名、密碼與 mysql 容器中的數據進行比對(注:ui 容器還支持 LDAP 的認證方式,在那種狀況下 ui 會試圖和外部 LDAP 服務進行通訊並校驗用戶名/密碼)。比對成功,ui 容器會返回表示成功的狀態碼, 並用密鑰生成 token,放在響應體中返回給 Docker 客戶端。這個過程當中組件間的交互過程以下圖所示
至此,一次 docker login
成功地完成了,Docker 客戶端會把步驟(c)中編碼後的用戶名密碼保存在本地的隱藏文件中。
(2) Docker Push
用戶登陸成功後用 docker push 命令向 Harbor 推送一個 Docker 鏡像:docker push registry.abcdocker.com/library/hello-world
(a) 首先,docker 客戶端會重複 login 的過程,首先發送請求到 registry,以後獲得 token 服務的地址;
(b) 以後,Docker 客戶端在訪問ui容器上的token服務時會提供額外信息,指明它要申請一個對imagelibrary/hello-world 進行 push 操做的 token;
(c) token 服務在通過 Nginx 轉發獲得這個請求後,會訪問數據庫覈實當前用戶是否有權限對該 image進行 push。若是有權限,它會把 image 的信息以及 push 動做進行編碼,並用私鑰簽名,生成 token返回給 Docker 客戶端;
(d) 獲得 token 以後 Docker 客戶端會把 token 放在請求頭部,向 registry 發出請求,試圖開始推送image。 Registry 收到請求後會用公鑰解碼 token 並進行覈對,一切成功後,image 的傳輸就開始了。咱們省去 proxy 轉發的步驟,下圖描述了這個過程當中各組件的通訊
4、安裝環境
IP地址 | docker版本 | docker-compose版本 | 內核 | Centos |
---|---|---|---|---|
192.168.1.197 | 17.03 | 1.22 | 4.17.12 | 7.4 |
注意:Harbor的全部服務組件都是在Docker中部署的,因此官方安裝使用Docker-compose快速部署,因此咱們須要安裝Docker、Docker-compose. 因爲Harbor是基於Docker Registry V2版本,因此就要求Docker版本不小於1.10.0,Docker-compose版本不小於1.6.0
5、環境準備
# 設置主機名 hostnamectl set-hostname harbor # 時間同步 yum -y install ntp systemctl enable ntpd systemctl start ntpd ntpdate -u cn.pool.ntp.org hwclock --systohc timedatectl set-timezone Asia/Shanghai # 關閉swap分區 vim /etc/fstab #永久關閉swap分區 swap was on /dev/sda11 during installation UUID=0a55fdb5-a9d8-4215-80f7-f42f75644f69 none swap sw 0 0 #註釋掉SWAP分區項,便可 或者
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
swapoff -a && swapon -a
# 關閉防火牆 Selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config # 升級內核 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install kernel-ml -y&& sed -i s/saved/0/g /etc/default/grub&& grub2-mkconfig -o /boot/grub2/grub.cfg && reboot
下載Docker安裝包
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
➜ yum install docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm -y ➜ yum install docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm -y
設置開機啓動並啓動docker systemctl enable docker systemctl start docker 替換docker相關配置 sed -i '/ExecStart=\/usr\/bin\/dockerd/i\ExecStartPost=\/sbin/iptables -I FORWARD -s 0.0.0.0\/0 -d 0.0.0.0\/0 -j ACCEPT' /usr/lib/systemd/system/docker.service sed -i '/dockerd/s/$/ \-\-storage\-driver\=overlay2 --insecure-registry 192.168.60.26/g' /usr/lib/systemd/system/docker.service
注意:
1.Docker默認從官方拉取鏡像,而且從1.12版本以後,默認私有倉庫是使用https來進行鏈接,咱們須要將使用私服的主機上docker啓動文件進行修改,在啓動命令添加--insecure-registry 192.168.1.197
--insecure-registry 192.168.1.197
Github地址:https://github.com/docker/compose/releases
Docker Compose簡介
Docker Compose是Docker編排服務的最後一塊,前面提到的Machine可讓用戶在其它平臺快速安裝Docker,Swarm可讓Docker容器在集羣中高效運轉,而Compose可讓用戶在集羣中部署分佈式應用。簡單的說,Docker Compose屬於一個「應用層」的服務,用戶能夠定義哪一個容器組運行哪一個應用,它支持動態改變應用,並在須要時擴展。
安裝Docker-compose
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose $ docker-compose --version docker-compose version 1.22.0, build f46880fe
Docker-compose經常使用命令
docker-compose up -d ###後臺啓動,若是容器不存在根據鏡像自動建立 docker-compose down -v ###中止容器並刪除容器 docker-compose start ###啓動容器,容器不存在就沒法啓動,不會自動建立鏡像 docker-compose stop ###中止容器
Harbor官方地址
https://github.com/vmware/harbor/releases
Harbor 2種安裝方式
1.離線安裝 $ wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz $ tar xf harbor-online-installer-v1.5.0.tgz 2.在線安裝 $ wget https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.5.2.tgz $ tar xf harbor-online-installer-v1.5.2.tgz 重點:下載那個823M的安裝
重點:下載那個823M的安裝
配置Harbor
解壓以後,配置文件名稱harbor.cfg,該文件就是Harbor的配置文件
編輯harbor.cfg
實際上咱們只須要修改Hostname字段
[root@harbor harbor]# head harbor.cfg
## Configuration file of Harbor
#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY! _version = 1.5.0 #The IP address or hostname to access admin UI and registry service. #DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients. hostname = 192.168.1.197
harbor.cfg相關配置解釋
[root@master harbor]# grep -Ev "^$|^[#;]" harbor.cfg # Harbor版本 _version = 1.5.0 # hostname 設置訪問地址,可使用IP/域名,不能夠設置127.0.0.1 && localhost hostname = 192.168.60.24 # 訪問協議,默認是http,也能夠設置https,若是設置https,則nginx ssl須要設置on ui_url_protocol = http # Job 最大進程數 max_job_workers = 50 # 是否建立證書,建立證書將會在下面的路徑下生成 customize_crt = on ssl_cert = /data/cert/server.crt ssl_cert_key = /data/cert/server.key # 私鑰存儲路徑 secretkey_path = /data # 設置日誌大小 admiral_url = NA log_rotate_count = 50 log_rotate_size = 200M # 是否使用代理 http_proxy = https_proxy = no_proxy = 127.0.0.1,localhost,ui # 郵箱設置,發送重置密碼郵件時使用 email_identity = email_server = smtp.mydomain.com email_server_port = 25 email_username = sample_admin@mydomain.com email_password = abc email_from = admin <sample_admin@mydomain.com> email_ssl = false email_insecure = false # 安裝Harbor後,管理員UI登錄的密碼,默認是Harbor12345 harbor_admin_password = Harbor12345 # 認證方式,這裏支持多種認證方式,好比LDAP、數據庫認證。默認是db_auth auth_mode = db_auth # LDAP認證時配置項 ldap_url = ldaps://ldap.mydomain.com ldap_basedn = ou=people,dc=mydomain,dc=com ldap_uid = uid ldap_scope = 2 ldap_timeout = 5 ldap_verify_cert = true ldap_group_basedn = ou=group,dc=mydomain,dc=com ldap_group_filter = objectclass=group ldap_group_gid = cn ldap_group_scope = 2 #是否開啓自動註冊 self_registration = on # Token有效時間,默認30分鐘 token_expiration = 30 # 用戶建立項目權限控制,默認是everyone(全部人),也能夠設置爲adminonly(管理員) project_creation_restriction = everyone # Mysql數據庫root用戶默認密碼root123,根據實際時使用來進行修改 db_host = mysql db_password = root123 db_port = 3306 db_user = root # Redis配置 redis_url = redis:6379 clair_db_host = postgres clair_db_password = password clair_db_port = 5432 clair_db_username = postgres clair_db = postgres uaa_endpoint = uaa.mydomain.org uaa_clientid = id uaa_clientsecret = secret uaa_verify_cert = true uaa_ca_cert = /path/to/ca.pem registry_storage_provider_name = filesystem registry_storage_provider_config =
本次咱們使用離線安裝,安裝包在上面
./install tar xf harbor-offline-installer-v1.5.0.tgz
7、若是外網出現502 錯誤(權限不足),記得重啓服務器或者虛擬機。
8、訪問:192.168.1.197
默認端口爲80,須要修改端口請修改docker-compose.yaml對應服務的映射