Harbor部署基于HTTPS协议访问的私有仓库

本文主要记录在自己的测试环境上搭建基于https协议访问的harbor仓库,文章结尾附带本人自己编写的shell脚本,该脚本可用于在linux服务器上一键部署harbor仓库,可选择基于IP访问或者基于域名访问两种部署方式,有兴趣的可以自取。

在部署前真的很想吐槽一下harbor,本人才疏学浅,harbor装了不下20遍,百度上能看到的harbor报错我基本上都碰到过一遍了,哎,要么就是装好了,登录harbor网页端的时候提示核心服务不可用登录不进去,要么就是在推送镜像前docker login一直报错,建议安装基于https协议使用域名访问的harbor仓库,测试环境搭建的话可以使用自签名证书,至于http部署的服务总是有一大堆问题搞不明白

部署大致分为两个部分:
第一步:部署docker服务,部署docker-compose(部署这两个服务的过程这里不做赘述,我最下面的脚本可以自动部署,实在不懂的留言私信我都行),生成服务器自签名证书;
第二步:配置启动服务,启动harbor。

第一步:生成证书

cd /root && openssl rand -writerand .rnd     #需要使用IP地址访问时执行,生成随机数种子文件
mkdir -p /data/ssl && cd /data/ssl          #这个目录随便建立,就是临时存一下生成的证书
openssl genrsa -out ca.key 4096     #生成一个4096位的RSA私钥作为自签CA的密钥
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Zhuhai/L=Zhuhai/O=example/OU=Personal/CN=$hostname" -key ca.key -out ca.crt     #使用上面的私钥创建一个新的自签名CA证书,$hostname改成自己的地址,你要用IP访问就改成IP,用域名访问就改成域名

openssl genrsa -out $hostname.key 4096     #为Harbor生成另一个4096位的RSA私钥,$hostname改成自己的地址,你要用IP访问就改成IP,用域名访问就改成域名
openssl req -sha512 -new -subj "/C=CN/ST=Zhuhai/L=Zhuhai/O=example/OU=Personal/CN=$hostname" -key $hostname.key -out $hostname.csr     #创建一个证书签名请求,用于harbor的ssl证书,$hostname改成自己的地址,你要用IP访问就改成IP,用域名访问就改成域名
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in $hostname.csr -out $hostname.crt     #这个命令使用上面创建的CA和v3.ext文件中的扩展来签署harbor的ssl证书,$hostname改成自己的地址,你要用IP访问就改成IP,用域名访问就改成域名
openssl x509 -inform PEM -in $hostname.crt -out $hostname.cert #$hostname改成自己的地址,你要用IP访问就改成IP,用域名访问就改成域名(下面都要注意改)
mkdir -p /etc/docker/certs.d/$hostname/
cp /data/ssl/$hostname.cert /etc/docker/certs.d/$hostname/
cp /data/ssl/$hostname.key /etc/docker/certs.d/$hostname/
cp /data/ssl/ca.crt /etc/docker/certs.d/$hostname/
systemctl restart docker

第二步:安装harbor服务

1.去官网下载harbor安装包,下载地址:Releases · goharbor/harbor · GitHub

然后你把安装包放到服务器的目录下解压

2.解压完后会在当前目录下出现一个名为harbor的目录,cd进入到该目录下复制一份配置文件:

cp harbor.yml.tmpl harbor.yml

3.进入harbor.yml配置文件修改,harbor服务初始化安装默认使用harbor.yml这个配置文件

vim harbor.yml

hostname: harbor.od.com     #这里的harbor.od.com改成自己的,用IP访问的改成IP,用域名访问的该域名
http:
 port: 80
https:
  port: 443
  certificate: /data/cert/harbor.od.com.crt   #这里的harbor.od.com改成自己的,用IP访问的改成IP,用域名访问的该域名
  private_key: /data/cert/harbor.od.com.key   #这里的harbor.od.com改成自己的,用IP访问的改成IP,用域名访问的该域名

4.最后执行当前目录下的install.sh脚本即可。注意,这里要注意先别着急执行这个安装脚本,因为我那台服务器的IP是172段的,可能harbor在启动的时候创建了容器的网段也是172段的,导致我执行安装脚本后服务器网络地址冲突所有的服务器终端都断开连接了,这里只是分享一下我确实有遇到过这个问题,我认为遇到这个问题的概率还是很小的,万幸是公司物理机上创建的一个测试虚拟机环境,去机房找到连上服务器,到harbor的安装目录下执行docker-compose down把harbor服务都停了即可,后续即使在重新启动也不会有终端断开连接的问题了,但是我们在生产环境中肯定是不能出现服务器无法连接的,所以经过我简单测试,最终发现是在安装时执行了prepare这个脚本后在安装目录下生成了docker-compose.yml文件,基于这个yml文件启动容器创建容器的网络时就跟本机网段冲突了,所以还是在测试环境没问题了在往生产上装。
 

./install.sh

安装完成后上浏览器访问:https://ip或域名;直接访问即可,网页的

账号为:admin
密码为: Harbor12345
 

自动化安装harbor脚本
 

#!/bin/bash

# 提示用户输入参数
echo "请选择访问方式(输入1或2):(1):IP (2):域名"
read access_type
echo "请输入访问地址(IP地址或域名): "
read hostname
echo "请输入admin账户默认密码: "
read adminpassword
echo "请输入服务器的IP地址: "
read server_ip

echo "$server_ip $hostname" | sudo tee -a /etc/hosts > /dev/null

if ! command -v docker &> /dev/null
then
    echo "Docker 未安装,正在安装..."
    
    # 移除旧版本的 Docker
    sudo yum remove -y docker \
                     docker-client \
                     docker-client-latest \
                     docker-common \
                     docker-latest \
                     docker-latest-logrotate \
                     docker-logrotate \
                     docker-engine

    # 设置 Docker 仓库
    sudo yum install -y yum-utils

    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
    # 安装 Docker CE
    sudo yum install -y docker-ce docker-ce-cli containerd.io unzip
    
    # 启动 Docker
    sudo systemctl start docker
else
    echo "Docker 已安装"
fi

# 检查 Docker Compose 是否已安装
if ! command -v docker-compose &> /dev/null
then
    echo "Docker Compose 未安装,正在安装..."
    # 安装 Docker Compose
    #sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo curl -L "http://media.zcloud.ac.cn/group1/HD/docker-compose" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
else
    echo "Docker Compose 已安装"
fi

[ -d /data/ssl ] || mkdir -p /data/ssl
[ -d /data/cert ] || mkdir -p /data/cert
cd /data/ssl

if [ "$access_type" == "1" ]; then
    # IP方式访问,生成v3.ext配置文件,使用用户输入的IP地址
    cat > v3.ext <<-EDF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:$hostname
EDF
else
    # 域名方式访问,生成v3.ext配置文件,使用用户输入的域名
    cat > v3.ext <<-EDF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=$hostname
DNS.2=$hostname
DNS.3=$hostname
EDF
fi


cd /root && openssl rand -writerand .rnd     #需要使用IP地址访问时执行,生成随机数种子文件
mkdir -p /data/ssl && cd /data/ssl
openssl genrsa -out ca.key 4096     #生成一个4096位的RSA私钥作为自签CA的密钥
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Zhuhai/L=Zhuhai/O=example/OU=Personal/CN=$hostname" -key ca.key -out ca.crt     #使用上面的私钥创建一个新的自签名CA证书

openssl genrsa -out $hostname.key 4096     #为Harbor生成另一个4096位的RSA私钥
openssl req -sha512 -new -subj "/C=CN/ST=Zhuhai/L=Zhuhai/O=example/OU=Personal/CN=$hostname" -key $hostname.key -out $hostname.csr     #创建一个证书签名请求,用于harbor的ssl证书

openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in $hostname.csr -out $hostname.crt     #这个命令使用上面创建的CA和v3.ext文件中的扩展来签署harbor的ssl证书
openssl x509 -inform PEM -in $hostname.crt -out $hostname.cert
mkdir -p /etc/docker/certs.d/$hostname/
cp /data/ssl/$hostname.cert /etc/docker/certs.d/$hostname/
cp /data/ssl/$hostname.key /etc/docker/certs.d/$hostname/
cp /data/ssl/ca.crt /etc/docker/certs.d/$hostname/
systemctl restart docker

if [ ! -f /data/harbor.tgz ]; then
    echo "harbor.tar.gz 不存在,正在下载..."
    wget -P /data http://media.zcloud.ac.cn/group1/wa/harbor.tgz
else
    echo "harbor.tgz 已存在"
fi

# 解压Harbor安装包
tar -xf /data/harbor.tgz -C /data
cd /data/harbor

# 加载Harbor Docker镜像
docker load -i /data/harbor/harbor.v2.9.2.tar.gz

# 复制并编辑Harbor配置文件
cp harbor.yml.tmpl harbor.yml
sed -i "s/hostname: .*/hostname: $hostname/" harbor.yml
sed -i "s/harbor_admin_password: .*/harbor_admin_password: $adminpassword/" harbor.yml
sed -i "s|certificate: .*|certificate: /data/ssl/$hostname.crt|" harbor.yml
sed -i "s|private_key: .*|private_key: /data/ssl/$hostname.key|" harbor.yml
# 安装Harbor
sed -i '67s/^/#/' /data/harbor/install.sh
cp /data/harbor/docker-compose.yml /tmp
/data/harbor/prepare
\cp /tmp/docker-compose.yml /data/harbor/
/data/harbor/install.sh

注:脚本执行时要传四个参数变量,该脚本部署的harbor版本固定为harbor-offline-installer-v2.9.2.tgz,脚本harbor安装路径为/data/harbor,安装完成后执行以下命令暂停启动harbor服务:
 

docker-compose stop  #关闭服务
docker-compose start  #启动服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值