03 搭建Harbor仓库

00 基本介绍

# 使用Harbor搭建镜像仓库,用于本地私有存储镜像
# 使用https方式部署Harobr仓库

01 基本部署

# 导入Harbor压缩包,并解压(我使用的是2.7.4版本)
[root@harbor opt]# tar -zxvf harbor-offline-installer-v2.7.4.tgz

# 注意,我是把压缩包放到/opt目录下,解压也是解压在/opt目录下

image-20250517213237401

图1 Harbor路径

02 生成证书

# 创建证书存放路径
[root@harbor harbor]# mkdir -pv /opt/harbor/certs/{ca,server,client}
# 进入证书存放路径,生成CA私钥
[root@harbor harbor]# cd /opt/harbor/certs/
[root@harbor certs]# openssl genrsa -out ca/ca.key 4096
Generating RSA private key, 4096 bit long modulus
........................++
..............................................................................................................................................................................................................................................................................................................................++
e is 65537 (0x10001)
# 生成ca的自签名证书
[root@harbor certs]# openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=likexy.com" \
 -key ca/ca.key \
 -out ca/ca.crt
# 生成Harbor主机的私钥
[root@harbor certs]# openssl genrsa -out server/harbor.likexy.com.key 4096
Generating RSA private key, 4096 bit long modulus
............++
.....................++
e is 65537 (0x10001)
# 生成harbor主机的证书申请
[root@harbor certs]# openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.likexy.com" \
    -key server/harbor.likexy.com.key \
    -out server/harbor.likexy.com.csr
# 生成x509 v3扩展文件
[root@harbor certs]# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=likexy.com
DNS.2=likexy
DNS.3=harbor.likexy.com
EOF
# 使用"v3.ext"给harbor主机签发证书
[root@harbor certs]# openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
    -in server/harbor.likexy.com.csr \
    -out server/harbor.likexy.com.crt

image-20250517214425440

图2 使用"v3.ext"给harbor主机签发证书
# 将crt文件转换为cert客户端证书文件
[root@harbor certs]# openssl x509 -inform PEM -in server/harbor.likexy.com.crt -out server/harbor.likexy.com.cert
# 准备客户端证书
[root@harbor certs]# cp server/harbor.likexy.com.{cert,key} client/
[root@harbor certs]# cp ca/ca.crt client/
[root@harbor certs]# ll client/
总用量 12
-rw-r--r-- 1 root root 2025 5月  17 21:47 ca.crt
-rw-r--r-- 1 root root 2102 5月  17 21:47 harbor.likexy.com.cert
-rw-r--r-- 1 root root 3243 5月  17 21:47 harbor.likexy.com.key
# 查看所有证书文件
[root@harbor certs]# tree
.
├── ca
│   ├── ca.crt
│   ├── ca.key
│   └── ca.srl
├── client
│   ├── ca.crt
│   ├── harbor.likexy.com.cert
│   └── harbor.likexy.com.key
├── server
│   ├── harbor.likexy.com.cert
│   ├── harbor.likexy.com.crt
│   ├── harbor.likexy.com.csr
│   └── harbor.likexy.com.key
└── v3.ext

3 directories, 11 files

03 配置Harbor配置文件

# harbor.yml 是配置文件,需要手动配置
[root@harbor harbor]# pwd
/opt/harbor
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# cat harbor.yml
...
hostname: harbor.likexy.com
...
https:
  port: 443
  certificate: /opt/harbor/certs/server/harbor.likexy.com.crt
  private_key: /opt/harbor/certs/server/harbor.likexy.com.key
harbor_admin_password: 1
...
# 安装Harbor
[root@harbor harbor]# ./install.sh

image-20250517220040967

图3 使用HTTPS访问网页

04 客户端配置

# 在把刚刚生成的client客户端文件夹拷贝到客户机中
# 在客户端创建文件夹
[root@master01 opt]# mkdir -pv /etc/docker/certs.d/harbor.likexy.com

# 使用脚本把clients放到客户端
[root@harbor opt]# cat certs.sh 
#!/bin/bash
# 定义远程主机的IP地址列表
HOSTS=("172.2.25.50" "172.2.25.51" "172.2.25.52" "172.2.25.53" "172.2.25.54" "172.2.25.55")
# 定义源文件路径和目标路径
SOURCE_DIR="/opt/harbor/certs/client/"
DEST_DIR="/etc/docker/certs.d/harbor.likexy.com/"
# 遍历每个远程主机并执行scp命令
for HOST in "${HOSTS[@]}"; do
    echo "正在将文件复制到 $HOST ..."
    scp -r "$SOURCE_DIR" "root@$HOST:$DEST_DIR"
    # 检查scp命令的退出状态
    if [ $? -eq 0 ]; then
        echo "文件已成功复制到 $HOST"
    else
        echo "警告: 复制到 $HOST 失败"
    fi
done
echo "所有文件复制操作已完成"

# 在客户端所有主机执行
[root@master01 opt]# mv /etc/docker/certs.d/harbor.likexy.com/client/* /etc/docker/certs.d/harbor.likexy.com/

05 登录

image-20250517222757299

图4 使用docker login登录,注意把域名添加hosts解析
# 注意可以看到密码
[root@master01 opt]# more /root/.docker/config.json
{
	"auths": {
		"harbor.likexy.com": {
			"auth": "YWRtaW46MTIzMTIz"
		}
	}
}

image-20250517223210427

图5 可以看到密码
# 解析出的用户名和密码
[root@master01 opt]# echo YWRtaW46MTIzMTIz | base64 -d | more
admin:123123

image-20250517223951042

图6 解析出的用户名和密码
# 登出命令
[root@master01 opt]# docker logout harbor.likexy.com
Removing login credentials for harbor.likexy.com

06 上传和下载镜像

image-20250517224330776

图7 在客户端新建一个项目

图8 复制标记镜像命令
# 在服务器标记镜像
[root@harbor opt]# docker tag justwatch/elasticsearch_exporter:1.0.2 harbor.likexy.com/likexy/justwatch/elasticsearch_exporter:1.0.2

图9 复制推送镜像命令,标记和推送的REPOSITORY[:TAG]要一致
# 推送镜像
[root@harbor opt]# docker push harbor.likexy.com/likexy/justwatch/elasticsearch_exporter:1.0.2
The push refers to repository [harbor.likexy.com/likexy/justwatch/elasticsearch_exporter]
9d1baef0b628: Pushed 
1692ded805c8: Pushed 
5f70bf18a086: Pushed 
6a749002dd6a: Pushed 
1.0.2: digest: sha256:33783f3f16312e0172fea96755623640aa91495403169ce1fbd9e2e5539a4c65 size: 1154

image-20250517225015254

图10 成功推送镜像

image-20250517225118540

图11 在可视化界面也可以看到
# 批量上传镜像到Harobr仓库脚本
[root@harbor ~]# cat /opt/load-harbor.sh 
#!/bin/bash
# 定义Harbor的域名和项目
HARBOR_DOMAIN="harbor.likexy.com"
HARBOR_PROJECT="likexy"
# 获取本地Docker镜像列表
IMAGES=$(docker images --format "{{.Repository}}:{{.Tag}}")
# 遍历每个镜像并执行标记和推送操作
for IMAGE in $IMAGES; do
    # 跳过没有标签的镜像(例如,没有标签的镜像可能显示为"<none>:<none>")
    if [[ "$IMAGE" == "<none>:<none>" ]]; then
        continue
    fi
    # 提取镜像名称和标签
    SOURCE_IMAGE=$(echo "$IMAGE" | cut -d':' -f1)
    TAG=$(echo "$IMAGE" | cut -d':' -f2)
    # 构造目标镜像名称
    TARGET_IMAGE="${HARBOR_DOMAIN}/${HARBOR_PROJECT}/${SOURCE_IMAGE}:${TAG}"
    # 标记镜像
    echo "正在标记镜像: $IMAGE 为 $TARGET_IMAGE"
    docker tag "$IMAGE" "$TARGET_IMAGE"
    # 检查docker tag命令的退出状态
    if [ $? -ne 0 ]; then
        echo "警告: 标记镜像 $IMAGE 失败"
        continue
    fi
    # 推送镜像
    echo "正在推送镜像: $TARGET_IMAGE"
    docker push "$TARGET_IMAGE"
    # 检查docker push命令的退出状态
    if [ $? -ne 0 ]; then
        echo "警告: 推送镜像 $TARGET_IMAGE 失败"
    else
        echo "镜像 $TARGET_IMAGE 已成功推送"
    fi
done
echo "所有镜像推送操作已完成"

image-20250517230051334

图12 自动标记并推送镜像

image-20250517230225295

图13 自动上传的镜像
posted @ 2025-05-17 22:53  Chains_1  阅读(131)  评论(0)    收藏  举报