本文主要记录在自己的测试环境上搭建基于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 #启动服务