Harbor自建镜像仓库部署
Harbor自建镜像仓库部署
一、环境说明
-
系统版本:Rocky Linux 9.4
-
服务器IP:192.168.93.128(固定,与之前私有仓库保持一致)
-
部署模式:HTTP(内网测试)+ HTTPS(生产可用) 双模式,可按需选择
-
端口:HTTP(80端口)、HTTPS(443端口)
-
核心要求:全程仅使用dnf命令,无yum相关操作,一键脚本自动完成大部分部署
-
数据存储:/opt/harbor/data(持久化,避免数据丢失)
-
HTTPS补充:使用自签名证书(适合测试/内网生产),生产环境建议替换为CA颁发证书
二、一键部署脚本(install-harbor.sh,支持HTTP/HTTPS切换)
👉 可直接复制脚本内容,保存后运行即可,通过变量切换部署模式
#!/bin/bash
set -e # 脚本出错自动退出,避免后续操作失效
# 定义全局变量(可修改以下3项,其余无需改动)
HARBOR_VERSION="v2.12.1" # Harbor版本,可自行替换新版
ADMIN_PASSWORD="Harbor12345" # 管理员初始密码,建议修改
DEPLOY_MODE="HTTP" # 部署模式:HTTP(默认,内网测试)、HTTPS(生产可用),二选一
# 打印欢迎信息
echo "====================================="
echo " Harbor 镜像仓库一键部署脚本 "
echo " 适配 Rocky Linux 9.4 纯 dnf 环境 "
echo " 服务器IP:192.168.93.128 "
echo " 部署模式:$DEPLOY_MODE "
echo " 管理员初始密码:$ADMIN_PASSWORD "
echo "====================================="
# 1. 卸载旧版本Docker(清理环境)
echo "【1/9】卸载旧版本Docker,保证环境干净..."
sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine &>/dev/null
# 2. 安装dnf依赖工具,添加Docker官方源
echo "【2/9】安装依赖并添加Docker官方源..."
sudo dnf install -y dnf-utils &>/dev/null
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &>/dev/null
sudo dnf clean all &>/dev/null
sudo dnf makecache &>/dev/null
# 3. 安装Docker及Compose插件
echo "【3/9】安装Docker和Docker Compose插件..."
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin &>/dev/null
sudo systemctl enable --now docker &>/dev/null
# 4. 验证Docker安装成功
echo "【4/9】验证Docker安装状态..."
if docker --version &>/dev/null && docker compose version &>/dev/null; then
echo "Docker安装成功!"
else
echo "Docker安装失败,脚本退出!"
exit 1
fi
# 5. 创建Harbor工作目录,下载并解压离线包
echo "【5/9】下载并解压Harbor离线安装包..."
sudo mkdir -p /opt/harbor &>/dev/null
cd /opt/harbor &>/dev/null
# 下载Harbor离线包(若下载缓慢,可手动下载后放到/opt/harbor目录,注释此句)
sudo wget -q https://github.com/goharbor/harbor/releases/download/$HARBOR_VERSION/harbor-offline-installer-$HARBOR_VERSION.tgz
sudo tar -zxvf harbor-offline-installer-$HARBOR_VERSION.tgz &>/dev/null
cd harbor-offline-installer-$HARBOR_VERSION &>/dev/null
# 6. 生成自签名证书(仅HTTPS模式需要)
if [ "$DEPLOY_MODE" = "HTTPS" ]; then
echo "【6/9】HTTPS模式,生成自签名证书..."
# 创建证书目录
sudo mkdir -p /opt/harbor/cert &>/dev/null
cd /opt/harbor/cert &>/dev/null
# 生成私钥
sudo openssl genrsa -out server.key 2048 &>/dev/null
# 生成证书请求(Common Name填写服务器IP:192.168.93.128)
sudo openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Harbor/OU=Harbor/CN=192.168.93.128" &>/dev/null
# 生成自签名证书(有效期3650天)
sudo openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt &>/dev/null
# 回到Harbor安装目录
cd /opt/harbor/harbor-offline-installer-$HARBOR_VERSION &>/dev/null
else
echo "【6/9】HTTP模式,跳过证书生成..."
fi
# 7. 配置harbor.yml(根据部署模式自动适配)
echo "【7/9】自动配置Harbor配置文件($DEPLOY_MODE模式)..."
cp harbor.yml.tmpl harbor.yml &>/dev/null
# 通用配置:替换hostname、管理员密码、数据路径
sudo sed -i "s/hostname: reg.mydomain.com/hostname: 192.168.93.128/g" harbor.yml
sudo sed -i "s/harbor_admin_password: Harbor12345/harbor_admin_password: $ADMIN_PASSWORD/g" harbor.yml
sudo sed -i "s/data_volume: \/data\/harbor/data_volume: \/opt\/harbor\/data/g" harbor.yml
# 模式适配:HTTP模式注释HTTPS,HTTPS模式启用HTTPS并配置证书
if [ "$DEPLOY_MODE" = "HTTP" ]; then
# HTTP模式:注释HTTPS配置
sudo sed -i '/^https:/,/^private_key:/s/^/#/' harbor.yml
else
# HTTPS模式:启用HTTPS,配置证书路径,注释HTTP(可选,也可双端口共存)
sudo sed -i "s/#https:/https:/" harbor.yml
sudo sed -i "s/ port: 443/ port: 443/" harbor.yml
sudo sed -i "s/ certificate: \/your\/cert.crt/ certificate: \/opt\/harbor\/cert\/server.crt/" harbor.yml
sudo sed -i "s/ private_key: \/your\/key.key/ private_key: \/opt\/harbor\/cert\/server.key/" harbor.yml
# 可选:注释HTTP端口(若仅需HTTPS,取消下面注释)
# sudo sed -i '/^http:/,/^ port: 80/s/^/#/' harbor.yml
fi
# 8. 生成配置并启动Harbor
echo "【8/9】生成配置并启动Harbor服务..."
sudo ./prepare &>/dev/null
sudo ./install.sh &>/dev/null
# 9. 配置Docker信任 + 防火墙放行(根据模式适配)
echo "【9/9】配置Docker信任及防火墙放行($DEPLOY_MODE模式)..."
if [ "$DEPLOY_MODE" = "HTTP" ]; then
# HTTP模式:配置insecure-registries,放行80端口
sudo cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["192.168.93.128"]
}
EOF
# 放行80端口
sudo firewall-cmd --add-port=80/tcp --permanent &>/dev/null
else
# HTTPS模式:无需配置insecure-registries(自签名证书需信任,客户端需导入证书),放行443端口
sudo cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
# 放行443端口
sudo firewall-cmd --add-port=443/tcp --permanent &>/dev/null
fi
# 重启Docker生效
sudo systemctl daemon-reload &>/dev/null
sudo systemctl restart docker &>/dev/null
sudo firewall-cmd --reload &>/dev/null
# 部署完成提示(区分模式)
echo "====================================="
echo " Harbor部署完成!✅"
echo "-------------------------------------"
if [ "$DEPLOY_MODE" = "HTTP" ]; then
echo " 部署模式:HTTP(内网测试)"
echo " Web访问地址:http://192.168.93.128"
else
echo " 部署模式:HTTPS(生产可用)"
echo " Web访问地址:https://192.168.93.128(浏览器需信任自签名证书)"
echo " 自签名证书路径:/opt/harbor/cert(客户端需导入此证书)"
fi
echo " 管理员账号:admin"
echo " 管理员密码:$ADMIN_PASSWORD (建议登录后修改)"
echo " 数据存储路径:/opt/harbor/data"
echo " 脚本路径:/opt/harbor/install-harbor.sh"
echo "====================================="
echo " 测试命令参考($DEPLOY_MODE模式):"
if [ "$DEPLOY_MODE" = "HTTP" ]; then
echo " 1. docker login 192.168.93.128 -u admin -p $ADMIN_PASSWORD"
else
echo " 1. 客户端导入证书后,执行:docker login 192.168.93.128 -u admin -p $ADMIN_PASSWORD"
fi
echo " 2. docker tag nginx:latest 192.168.93.128/library/nginx:v1"
echo " 3. docker push 192.168.93.128/library/nginx:v1"
echo "====================================="
脚本使用方法(👉 可直接复制运行)
# 1. 创建脚本文件
sudo vi /opt/harbor/install-harbor.sh
# 2. 粘贴上面的一键脚本内容,保存退出(按Esc,输入:wq保存)
# 3. (可选)修改部署模式:将DEPLOY_MODE="HTTP"改为DEPLOY_MODE="HTTPS"
# 若选择HTTPS,无需额外操作,脚本自动生成自签名证书
# 4. 赋予脚本执行权限
sudo chmod +x /opt/harbor/install-harbor.sh
# 5. 运行脚本(全程自动,无需手动干预,约5-10分钟)
sudo /opt/harbor/install-harbor.sh
脚本可修改项(无需修改也可正常使用)
-
HARBOR_VERSION:Harbor版本,可替换为最新版(如v2.13.0),需对应修改下载链接中的版本号
-
ADMIN_PASSWORD:管理员初始密码,建议修改为更安全的密码(如Harbor@2024)
-
DEPLOY_MODE:部署模式,HTTP(默认,适合内网测试,无需证书)、HTTPS(适合生产,脚本自动生成自签名证书)
三、手动部署步骤(备用,供调试使用,HTTP+HTTPS双模式)
1. 安装Docker(纯dnf,两种模式通用)
👉 可直接复制运行
# 卸载旧版本
sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖和Docker源
sudo dnf install -y dnf-utils
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf clean all
sudo dnf makecache
# 安装Docker和Compose
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker
# 验证
docker --version
docker compose version
2. 下载并解压Harbor(两种模式通用)
👉 可直接复制运行
sudo mkdir -p /opt/harbor
cd /opt/harbor
# 下载离线包(v2.12.1,可替换为新版)
sudo wget https://github.com/goharbor/harbor/releases/download/v2.12.1/harbor-offline-installer-v2.12.1.tgz
sudo tar -zxvf harbor-offline-installer-v2.12.1.tgz
cd harbor-offline-installer-v2.12.1
3. 配置harbor.yml(分HTTP/HTTPS两种模式)
先复制配置模板:
👉 可直接复制运行
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
模式1:HTTP模式(内网测试,简单快捷)
👉 可直接复制粘贴配置
hostname: 192.168.93.128 # 服务器IP,不要写localhost
http:
port: 80 # HTTP端口,无需修改
# https: # 注释掉HTTPS相关所有内容
# port: 443
# certificate: /your/cert.crt
# private_key: /your/key.key
harbor_admin_password: Harbor12345 # 管理员密码,自行修改
data_volume: /opt/harbor/data # 数据存储路径,与脚本一致
模式2:HTTPS模式(生产可用,需证书)
第一步:生成自签名证书(若有CA证书,可跳过此步,直接使用CA证书)
👉 可直接复制运行
# 创建证书目录
sudo mkdir -p /opt/harbor/cert
cd /opt/harbor/cert
# 生成私钥(2048位)
sudo openssl genrsa -out server.key 2048
# 生成证书请求(Common Name必须填写服务器IP:192.168.93.128)
sudo openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Harbor/OU=Harbor/CN=192.168.93.128"
# 生成自签名证书(有效期10年,3650天)
sudo openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
# 回到Harbor安装目录
cd /opt/harbor/harbor-offline-installer-v2.12.1
第二步:修改harbor.yml配置(启用HTTPS,配置证书路径)
👉 可直接复制粘贴配置
hostname: 192.168.93.128 # 服务器IP,不要写localhost
http:
port: 80 # 可选:保留HTTP端口,双模式共存;无需则注释
https:
port: 443 # HTTPS默认端口
certificate: /opt/harbor/cert/server.crt # 自签名/CA证书路径
private_key: /opt/harbor/cert/server.key # 私钥路径
harbor_admin_password: Harbor12345 # 管理员密码,自行修改
data_volume: /opt/harbor/data # 数据存储路径
4. 安装并启动Harbor(两种模式通用)
👉 可直接复制运行
sudo ./prepare
sudo ./install.sh
# 查看容器运行状态(确认所有harbor-*容器为Up状态)
docker compose ps
5. 配置Docker信任 + 防火墙放行(分模式配置)
模式1:HTTP模式
👉 可直接复制运行
# 配置Docker信任HTTP仓库
vi /etc/docker/daemon.json
👉 可直接复制粘贴配置
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["192.168.93.128"]
}
重启Docker + 放行80端口:
sudo systemctl daemon-reload
sudo systemctl restart docker
# 放行80端口
sudo firewall-cmd --add-port=80/tcp --permanent
sudo firewall-cmd --reload
模式2:HTTPS模式
(1)服务端配置(无需insecure-registries,自签名证书需信任)
vi /etc/docker/daemon.json
👉 可直接复制粘贴配置
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
(2)客户端配置(自签名证书必须导入,否则无法登录/推拉镜像)
👉 可直接复制运行(客户端执行)
# 1. 在客户端创建证书目录
sudo mkdir -p /etc/docker/certs.d/192.168.93.128
# 2. 从服务端复制自签名证书到客户端(替换服务器IP)
sudo scp root@192.168.93.128:/opt/harbor/cert/server.crt /etc/docker/certs.d/192.168.93.128/
# 3. 重启Docker生效
sudo systemctl daemon-reload
sudo systemctl restart docker
(3)放行443端口(服务端执行)
sudo systemctl daemon-reload
sudo systemctl restart docker
# 放行443端口
sudo firewall-cmd --add-port=443/tcp --permanent
sudo firewall-cmd --reload
四、访问与测试(核心步骤,分模式)
1. Web UI访问
模式1:HTTP模式
👉 可直接复制访问地址
http://192.168.93.128
模式2:HTTPS模式
👉 可直接复制访问地址
https://192.168.93.128
⚠️ 注意:HTTPS模式访问时,浏览器会提示“证书不安全”,点击“高级”→“继续访问”即可(自签名证书正常现象);生产环境替换为CA证书可解决此问题。
-
账号:admin
-
密码:Harbor12345(脚本中或配置文件中修改的密码)
-
登录后建议:修改管理员密码(个人中心 → 密码修改),创建项目(如test-project)用于管理镜像
2. 镜像推拉测试(服务端/客户端通用,分模式)
模式1:HTTP模式(👉 可直接复制运行)
# 1. 登录Harbor(首次推拉必须登录)
docker login 192.168.93.128 -u admin -p Harbor12345
# 2. 拉取公共nginx镜像,打Harbor标签(library是默认项目)
docker pull nginx:latest
docker tag nginx:latest 192.168.93.128/library/nginx:v1
# 3. 推送镜像到Harbor
docker push 192.168.93.128/library/nginx:v1
# 4. 拉取Harbor中的镜像(测试是否成功)
docker rmi 192.168.93.128/library/nginx:v1 # 删除本地镜像
docker pull 192.168.93.128/library/nginx:v1 # 从Harbor拉取
模式2:HTTPS模式(👉 可直接复制运行,客户端需先导入证书)
# 1. 登录Harbor(首次推拉必须登录)
docker login 192.168.93.128 -u admin -p Harbor12345
# 2. 拉取公共nginx镜像,打Harbor标签(library是默认项目)
docker pull nginx:latest
docker tag nginx:latest 192.168.93.128/library/nginx:v1
# 3. 推送镜像到Harbor
docker push 192.168.93.128/library/nginx:v1
# 4. 拉取Harbor中的镜像(测试是否成功)
docker rmi 192.168.93.128/library/nginx:v1 # 删除本地镜像
docker pull 192.168.93.128/library/nginx:v1 # 从Harbor拉取
五、常用管理命令(👉 可直接复制运行,两种模式通用)
# 进入Harbor安装目录(所有命令在此目录执行)
cd /opt/harbor/harbor-offline-installer-v2.12.1
# 启动Harbor
docker compose up -d
# 停止Harbor
docker compose down
# 查看Harbor运行日志(排查问题用)
docker compose logs -f
# 查看Harbor中所有镜像(Web UI更直观,命令行辅助)
# HTTP模式
curl http://192.168.93.128/api/v2.0/projects/library/repositories
# HTTPS模式(自签名证书需加-k跳过证书验证)
curl -k https://192.168.93.128/api/v2.0/projects/library/repositories
# 重启Harbor服务
docker compose down && docker compose up -d
# 查看Docker日志(排查镜像推拉失败)
sudo journalctl -u docker -f
# HTTPS模式补充:重新生成自签名证书(证书过期时使用)
sudo rm -rf /opt/harbor/cert
sudo mkdir -p /opt/harbor/cert && cd /opt/harbor/cert
sudo openssl genrsa -out server.key 2048
sudo openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Harbor/OU=Harbor/CN=192.168.93.128"
sudo openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
cd /opt/harbor/harbor-offline-installer-v2.12.1
docker compose down && docker compose up -d
六、注意事项(重点,补充HTTPS相关)
-
脚本运行注意:运行脚本前确保服务器能联网(用于下载Docker源和Harbor离线包),若离线环境,需手动下载Harbor离线包放到/opt/harbor目录,注释脚本中wget下载的语句。
-
部署模式选择:内网测试优先选HTTP模式(简单快捷,无需证书);生产环境必须选HTTPS模式,建议使用CA颁发的证书(替换自签名证书),提升安全性。
-
HTTPS证书注意:自签名证书仅适合测试/内网生产,公网生产需购买CA证书(如阿里云、腾讯云免费SSL证书),替换脚本中自签名证书的路径即可。
-
客户端配置:HTTPS模式下,所有客户端必须导入自签名/CA证书,否则无法登录和推拉镜像;HTTP模式下,客户端需配置insecure-registries。
-
密码修改:部署完成后,务必登录Web UI修改管理员密码,避免默认密码泄露。
-
数据安全:镜像数据存储在/opt/harbor/data,定期备份该目录,防止数据丢失;HTTPS模式需额外备份/opt/harbor/cert目录(证书文件)。
-
版本兼容:Harbor v2.12.1 兼容Docker 20.10+,脚本中安装的Docker版本可满足,无需额外升级。
-
防火墙:HTTP模式放行80端口,HTTPS模式放行443端口;测试环境可临时关闭防火墙(sudo systemctl stop firewalld),生产环境建议限制访问IP。
-
双模式共存:可保留HTTP和HTTPS双端口(harbor.yml中不注释HTTP配置),适合过渡期使用,生产环境建议最终仅保留HTTPS。
七、常见问题排查(补充HTTPS相关问题)
-
脚本运行报错:wget下载失败
-
原因:网络不通,或Harbor版本链接失效。
-
解决:手动到Harbor官网下载对应版本离线包,放到/opt/harbor目录,注释脚本中sudo wget那一行。
-
-
镜像推拉报错:http: server gave HTTP response to HTTPS client
-
原因:Docker未配置insecure-registries,强制使用HTTPS访问HTTP仓库;仅HTTP模式会出现此问题。
-
解决:重新配置daemon.json,添加192.168.93.128到insecure-registries,重启Docker。
-
-
镜像推拉报错:x509: certificate signed by unknown authority
-
原因:HTTPS模式下,客户端未导入自签名证书,Docker不识别证书。
-
解决:按HTTPS客户端配置步骤,导入服务端的server.crt证书,重启Docker。
-
-
Web UI无法访问
-
原因:Harbor容器未正常启动,或防火墙未放行对应端口(HTTP80/HTTPS443)。
-
解决:执行docker compose ps查看容器状态,若有Down的容器,执行docker compose up -d重启;检查防火墙端口是否放行。
-
-
登录失败:invalid username or password
-
原因:管理员密码输入错误,或harbor.yml中密码配置错误。
-
解决:确认harbor.yml中的harbor_admin_password,重新登录;若忘记密码,可修改harbor.yml后,重新执行./prepare和./install.sh重置密码。
-
-
HTTPS模式下,curl访问API报错:SSL certificate problem
-
原因:自签名证书未被信任,curl默认验证证书。
-
解决:curl命令添加-k参数,跳过证书验证(如:curl -k https://192.168.93.128/api/v2.0/projects)。
-
(注:文档部分内容可能由 AI 生成)

浙公网安备 33010602011771号