天天看點

harbor私有鏡像倉庫搭建

harbor私有鏡像倉庫搭建

一、準備

1.1 harbor介紹

Docker容器應用的開發和運作離不開可靠的鏡像管理,雖然Docker官方也提供了公共的鏡像倉庫,但是從安全和效率等方面考慮,部署我們私有環境内的Registry也是非常必要的。Harbor是由VMware公司開源的企業級的Docker Registry管理項目,它包括權限管理(RBAC)、LDAP、日志稽核、管理界面、自我注冊、鏡像複制和中文支援等功能。

1.2 資源準備

安裝harbor之前請檢視:

安裝docker 、安裝docker-compose

名稱 資源位址
harbor-1.10.1 https://github.com/goharbor/harbor/releases

1.3 配置對Harbor的HTTPS通路

官網文檔說明:https://goharbor.io/docs/1.10/install-config/configure-https/

由于harbor login以及pull的時候指令行用ip會報錯,是以要配置一下hosts檔案ip映射

  1. 修改hosts檔案
vi /etc/hosts
----------------------------------------------
新增一行
39.96.46.193   nodeb
----------------------------------------------
           
  1. 生成CA憑證私鑰
//路徑不存在就自己建立
cd /root/ca
openssl genrsa -out ca.key 2048
           
  1. 生成CA憑證 ca.crt
openssl req -x509 -new -nodes -key ca.key -subj "/CN=nodeb" -days 7120 -out ca.crt
# 根據ca.key密鑰生成 ca.crt證書。
 
 # 參數說明:
-new 指生成證書請求
-x509 表示直接輸出證書
-key 指定私鑰檔案
-days 指定證書過期時間為3650天
-out 導出結束後證書檔案
-subj 輸入證書擁有者資訊
           
  1. 生成伺服器證書私鑰 nodeb.key
  1. 生成證書簽名請求(CSR)
openssl req -sha512 -new \
    -subj "/C=CN/ST=Shenzhen/L=Shenzhen/O=Harbor/OU=Harbor/CN=nodeb" \
    -key nodeb.key \
    -out nodeb.csr
           
  1. 生成一個x509 v3擴充檔案

無論是使用FQDN還是IP位址連接配接到Harbor主機,都必須建立此檔案。這樣的話,Harbor主機才能夠生成符合主題備用名稱(SAN)和x509 v3的證書擴充要求。

下面的配置中,DNS的部分需要替換為自己Harbor伺服器的域名。

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
 
[alt_names]
DNS.1=nodeb
EOF

           
  1. 使用該v3.ext檔案為您的Harbor主機生成證書 yourdomain.com.crt
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in nodeb.csr \
    -out nodeb.crt
           
  1. 将伺服器證書nodeb.crt的編碼格式轉換為nodeb.cert
openssl x509 -inform PEM -in nodeb.crt -out nodeb.cert
           
harbor私有鏡像倉庫搭建
  1. 将伺服器證書,密鑰和CA檔案複制到Harbor主機上的Docker certificate檔案夾中
//建立/etc/docker/certs.d/{域名}檔案夾,本文域名為nodeb
mkdir -p /etc/docker/certs.d/nodeb

cp /root/ca/nodeb.cert /etc/docker/certs.d/nodeb/
cp /root/ca/nodeb.key /etc/docker/certs.d/nodeb/
cp /root/ca/ca.crt /etc/docker/certs.d/nodeb/
           

如果将預設nginx端口443 映射到其他端口 port,請建立檔案夾/etc/docker/certs.d/yourdomain.com:port或/etc/docker/certs.d/harbor_IP:port。

也就是證書也要加上對應修改的端口号,不然無法生效。這個坑還是挺隐藏的。

  1. 配置允許通路http倉庫
vi /etc/docker/daemon.json
------------------------------------------------------------------
// 添加"insecure-registries":["http://39.96.46.193"]配置,配置之後如下:
{
"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"],"insecure-registries":["nodeb"]
}
------------------------------------------------------------------
           

配置完成之後重新開機docker服務:

systemctl daemon-reload
systemctl restart docker.service
           

二 、安裝配置harbor

2.1 安裝配置

上傳harbor離線資源包到/opt/resources 目錄下

  • 下載下傳資源包
yum -y install openssl
           
  • 解壓到/opt 目錄下
  • 修改配置
[root@iZ2ze6qralnaqhb67athsaZ resources]# vi /opt/harbor/harbor.yml
修改如下參數
--------------------------------------------------------------------------------------
hostname: nodeb				//伺服器ip/域名
harbor_admin_password: Harbor12345			// 密碼
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /root/ca/nodeb.crt
  private_key: /root/ca/nodeb.key
---------------------------------------------------------------------------------------
           

如下圖:

harbor私有鏡像倉庫搭建
  • 執行腳本:
sh prepare
           

執行完之後/opt/harbor/目錄下回生成 docker-compose.yml檔案

  • 執行安裝指令:
sh install.sh
           
  • 檢視啟動情況:
docker-compose ps
           
harbor私有鏡像倉庫搭建

2.2 驗證

  • 通路驗證

    首先需要在自己本地C:\Windows\System32\drivers\etc\hosts檔案配置ip映射:

39.96.46.193	nodeb
           

浏覽器輸入 https://nodeb/

harbor私有鏡像倉庫搭建

至此安裝成功

  • docker login驗證

想要在别的主機上docker login

登入nodeb主機上的harbor,需要将nodeb主機上生成的幾個證書檔案上傳到用戶端主機對應位置。

nodeb上執行:

scp -r /etc/docker/certs.d/nodeb/ca.crt root@nodea:/etc/docker/certs.d/nodeb/
scp -r /etc/docker/certs.d/nodeb/nodeb.crt root@nodea:/etc/docker/certs.d/nodeb/
scp -r /etc/docker/certs.d/nodeb/nodeb.key root@nodea:/etc/docker/certs.d/nodeb/
           

修改用戶端配置:

vi /etc/hosts
-------------------------------------------------------------------------
39.96.46.193  nodeb		#新增
--------------------------------------------------------------------------

vi /etc/docker/daemon.json
-------------------------------------------------------------------------
{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
"insecure-registries": ["nodeb"] 	#新增
}
-------------------------------------------------------------------------
           

nodea上執行docker login指令

不用admin賬号進行登入,否則會報無權限錯誤

[root@nodea resources]# cd /etc/docker/certs.d/nodeb/
[root@nodea nodeb]# ll
total 12
-rw-r--r-- 1 root root 1777 Nov  3 13:51 ca.crt
-rw-r--r-- 1 root root 1919 Nov  3 11:29 nodeb.cert
-rw-r--r-- 1 root root 3247 Nov  3 11:29 nodeb.key
[root@nodea nodeb]# docker login -u admin nodeb
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
           

三、harbor基本使用

指令 解釋
docker login -u admin nodeb 登陸harbor鏡像倉庫
docker tag SOURCE_IMAGE[:TAG] nodeb/data_analysis/IMAGE[:TAG] 給鏡像打标簽 例如:docker tag mysql:5.7 nodeb/xdclass/mysql:5.7
docker push nodeb/data_analysis/IMAGE[:TAG] 推送鏡像到harbor
docker pull nodeb/xdclass/mysql:5.7 從harbor拉取鏡像

參考文章:https://blog.51cto.com/linsj/2321283?source=dra

四、測試

  • 本機login
[root@iZ2ze13kpist8bmp2hsgn3Z ca]# docker login -u admin nodeb 
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
           
  • 打包鏡像
這裡我自己上傳了一個jar包,通過dockerfile打包鏡像
Dockerfile
------------------------------------------------------------------
# 基于哪個鏡像
FROM java:8
# 将本地檔案夾挂載到目前容器
VOLUME /tmp
# 拷貝檔案到容器,handcuffs-reg-0.0.1-SNAPSHOT.jar這裡是maven打包後的名字
ADD eureka-server.jar eureka-server.jar
RUN bash -c 'touch /eureka-server.jar'
# 配置容器啟動後執行的指令
ENTRYPOINT  ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/eureka-server.jar"]
EXPOSE 1111
---------------------------------------------------------------------
在Dockerfile目錄執行:docker build -t eureka:latest .
           
  • 鏡像上傳harbor
docker tag e06775abe360nodeb/test/eureka-server:latest
docker push nodeb/test/eureka-server
           

打開harbor倉庫如下:

harbor私有鏡像倉庫搭建

繼續閱讀