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相关)

  1. 脚本运行注意:运行脚本前确保服务器能联网(用于下载Docker源和Harbor离线包),若离线环境,需手动下载Harbor离线包放到/opt/harbor目录,注释脚本中wget下载的语句。

  2. 部署模式选择:内网测试优先选HTTP模式(简单快捷,无需证书);生产环境必须选HTTPS模式,建议使用CA颁发的证书(替换自签名证书),提升安全性。

  3. HTTPS证书注意:自签名证书仅适合测试/内网生产,公网生产需购买CA证书(如阿里云、腾讯云免费SSL证书),替换脚本中自签名证书的路径即可。

  4. 客户端配置:HTTPS模式下,所有客户端必须导入自签名/CA证书,否则无法登录和推拉镜像;HTTP模式下,客户端需配置insecure-registries。

  5. 密码修改:部署完成后,务必登录Web UI修改管理员密码,避免默认密码泄露。

  6. 数据安全:镜像数据存储在/opt/harbor/data,定期备份该目录,防止数据丢失;HTTPS模式需额外备份/opt/harbor/cert目录(证书文件)。

  7. 版本兼容:Harbor v2.12.1 兼容Docker 20.10+,脚本中安装的Docker版本可满足,无需额外升级。

  8. 防火墙:HTTP模式放行80端口,HTTPS模式放行443端口;测试环境可临时关闭防火墙(sudo systemctl stop firewalld),生产环境建议限制访问IP。

  9. 双模式共存:可保留HTTP和HTTPS双端口(harbor.yml中不注释HTTP配置),适合过渡期使用,生产环境建议最终仅保留HTTPS。

七、常见问题排查(补充HTTPS相关问题)

  1. 脚本运行报错:wget下载失败

    • 原因:网络不通,或Harbor版本链接失效。

    • 解决:手动到Harbor官网下载对应版本离线包,放到/opt/harbor目录,注释脚本中sudo wget那一行。

  2. 镜像推拉报错:http: server gave HTTP response to HTTPS client

    • 原因:Docker未配置insecure-registries,强制使用HTTPS访问HTTP仓库;仅HTTP模式会出现此问题。

    • 解决:重新配置daemon.json,添加192.168.93.128到insecure-registries,重启Docker。

  3. 镜像推拉报错:x509: certificate signed by unknown authority

    • 原因:HTTPS模式下,客户端未导入自签名证书,Docker不识别证书。

    • 解决:按HTTPS客户端配置步骤,导入服务端的server.crt证书,重启Docker。

  4. Web UI无法访问

    • 原因:Harbor容器未正常启动,或防火墙未放行对应端口(HTTP80/HTTPS443)。

    • 解决:执行docker compose ps查看容器状态,若有Down的容器,执行docker compose up -d重启;检查防火墙端口是否放行。

  5. 登录失败:invalid username or password

    • 原因:管理员密码输入错误,或harbor.yml中密码配置错误。

    • 解决:确认harbor.yml中的harbor_admin_password,重新登录;若忘记密码,可修改harbor.yml后,重新执行./prepare和./install.sh重置密码。

  6. HTTPS模式下,curl访问API报错:SSL certificate problem

(注:文档部分内容可能由 AI 生成)

posted @ 2026-04-24 14:50  niuxiang  阅读(78)  评论(0)    收藏  举报