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映射
- 修改hosts檔案
vi /etc/hosts
----------------------------------------------
新增一行
39.96.46.193 nodeb
----------------------------------------------
- 生成CA憑證私鑰
//路徑不存在就自己建立
cd /root/ca
openssl genrsa -out ca.key 2048
- 生成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 輸入證書擁有者資訊
- 生成伺服器證書私鑰 nodeb.key
- 生成證書簽名請求(CSR)
openssl req -sha512 -new \
-subj "/C=CN/ST=Shenzhen/L=Shenzhen/O=Harbor/OU=Harbor/CN=nodeb" \
-key nodeb.key \
-out nodeb.csr
- 生成一個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
- 使用該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
- 将伺服器證書nodeb.crt的編碼格式轉換為nodeb.cert
openssl x509 -inform PEM -in nodeb.crt -out nodeb.cert
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9EUTwUkeOhXUU9EMrpmYohmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3IDO2MDMzMTMzATMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- 将伺服器證書,密鑰和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。
也就是證書也要加上對應修改的端口号,不然無法生效。這個坑還是挺隐藏的。
- 配置允許通路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
---------------------------------------------------------------------------------------
如下圖:
- 執行腳本:
sh prepare
執行完之後/opt/harbor/目錄下回生成 docker-compose.yml檔案
- 執行安裝指令:
sh install.sh
- 檢視啟動情況:
docker-compose ps
2.2 驗證
-
通路驗證
首先需要在自己本地C:\Windows\System32\drivers\etc\hosts檔案配置ip映射:
39.96.46.193 nodeb
浏覽器輸入 https://nodeb/
至此安裝成功
- 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倉庫如下: