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 自动上传的镜像