Harbor简介:
Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能
可以用Harbor来搭建私有Docker镜像仓库
Harbor官网:
https://goharbor.io/
https://github.com/goharbor/harbor
截止目前最新版本的离线安装包下载地址(需要科学上网):
https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz
部署Harbor需要提前安装docker和Docker-Compose
Linux下安装部署Docker二进制版本
https://www.osyunwei.com/archives/13930.html
安装部署Harbor
1、为Harbor生成自签名证书
1.1. 生成CA私钥
openssl genrsa -out ca.key 2048
1.2. 生成自签名CA证书
openssl req -new -x509 -days 36500 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt
1.3. 生成服务器私钥和CSR,CN=192.168.21.201 表示证书的通用名称
openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=192.168.21.201" -out server.csr
1.4. 使用CA签发服务器证书并添加SAN
openssl x509 -req -extfile <(printf "subjectAltName=IP:192.168.21.201") -days 36500 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
#这里我们将 SAN 更改为 IP:192.168.21.201,以确保证书支持通过该IP地址访问
#如果是域名,subjectAltName=DNS:example.com
#IP和域名同时生成证书,subjectAltName=DNS:example.com,IP:192.168.21.201
#实际上要用到的是这2个文件
/data/server/harbor/ssl/server.crt
/data/server/harbor/ssl/server.key
2、安装部署Harbor
cd /data/server/harbor/ #进入安装包存放目录
tar -zxvf harbor-offline-installer-v2.11.1.tgz #解压
cd /data/server/harbor/harbor
cp harbor.yml.tmpl harbor.yml #拷贝模版文件
vi harbor.yml #修改配置文件
#修改hostname的值,如果没有域名就使用本机IP地址
hostname: 192.168.21.201 #设置主机名
#配置启动端口号
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80 #端口
https:
# https port for harbor, default is 443
port: 443 #端口
# The path of cert and key files for nginx
certificate: /data/server/harbor/ssl/server.crt #证书目录
private_key: /data/server/harbor/ssl/server.key #秘钥目录
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345 #设置登录账号密码
:wq! #保存退出
#配置文件修改成功后,执行 install.sh 脚本进行安装harbor
./install.sh
#显示如下信息,说明harbor已经安装部署好了
✔ ----Harbor has been installed and started successfully.----
浏览器打开https://192.168.21.201/
harbor的登录账号密码是:admin/Harbor12345
默认就是中文界面,可以创建项目,添加账号,设置访问权限等操作。
#重新启动 Harbor 所有的容器命令
cd /data/server/harbor/harbor
docker-compose down
docker-compose up -d
cd /data/server/harbor/harbor
每次修改配置文件的后都要重新执行./prepare否则配置文件不生效
3、使用Harbor
#私有仓库使用自签名证书,Docker 默认无法验证其 SSL/TLS 证书
#在这种情况下,将仓库地址添加到 insecure-registries 可以绕过证书验证,从而允许 Docker 连接到该仓库
#在docker中添加私有仓库的地址
vi /etc/docker/daemon.json #编辑,添加下面内容,保持 JSON 的格式正确,添加逗号分隔
"insecure-registries": ["192.168.21.201"],
:wq! #保存退出
sudo systemctl daemon-reload
sudo systemctl restart docker
登录私有仓库地址:
echo "Harbor12345" | docker login -u admin --password-stdin https://192.168.21.201
#出现Login Succeeded说明登录成功
#认证信息存储在~/.docker/config.json文件中,只要不删除,登录会一直生效无需要每次操作前都登录
#还可以给docker添加自签名证书,让它能够让验证我们的私有SSL/TLS 证书
#将上一步生成的自签名证书ca.crt拷贝到Docker 的证书存储位置
mkdir -p /etc/docker/certs.d/192.168.21.201 #在doker客户端创建目录
scp /data/server/harbor/ssl/ca.crt 192.168.21.203:/etc/docker/certs.d/192.168.21.201 #拷贝证书到客户端
4、docker客户端上传下载镜像
查看镜像:
docker images
删除镜像:
docker rmi 192.168.21.201/library/nginx:latest
在项目中标记镜像:
docker tag docker.rainbond.cc/nginx:latest 192.168.21.201/library/nginx:latest
登录私有仓库地址:
echo "Harbor12345" | docker login -u admin --password-stdin https://192.168.21.201
推送镜像到当前项目:
docker push 192.168.21.201/library/nginx:latest
可以在web页面查看,镜像已经上传上去了。
#拉取镜像
docker pull 192.168.21.201/library/nginx:latest
#一键查询Harbor仓库中所有镜像及版本号
sudo yum install jq #需要安装jq命令
vi get_images.sh
#!/bin/bash
# 使用时需先改以下3个变量参数,如果Harbor未启用https,需要去除curl中的-k参数
HARBOR_URL="http://192.168.21.130:80"
USERNAME="admin"
PASSWORD="123456"
# API endpoint to get all images
imges_head=$(echo "$HARBOR_URL"|awk -F // '{print $2}' )
projects_endpoint="$HARBOR_URL/api/v2.0/projects"
projects=$(curl -u $USERNAME:$PASSWORD -skX 'GET' $projects_endpoint |jq -r '.[].name')
for project in $projects;do
repo_count_endpoint="$HARBOR_URL/api/v2.0/projects?name=$project"
repo_count=$(curl -u $USERNAME:$PASSWORD -skX 'GET' $repo_count_endpoint |jq -r '.[].repo_count')
pages=$(expr $repo_count / 10 + 1)
for ((i=1;i<=$pages;i++));do
images_endpoint="$HARBOR_URL/api/v2.0/projects/$project/repositories?page_size=10&page=$i"
repos=$(curl -u $USERNAME:$PASSWORD -skX 'GET' $images_endpoint | jq -r '.[].name' |awk -F / '{print $2}')
for repo in $repos;do
tag_count_url="$HARBOR_URL/api/v2.0/projects/$project/repositories/$repo"
tag_count=$(curl -u $USERNAME:$PASSWORD -skX 'GET' $tag_count_url |jq '.artifact_count')
pages1=$(expr $tag_count / 10 + 1)
for ((j=1;j<=$pages1;j++));do
tags_endpoint="$HARBOR_URL/api/v2.0/projects/$project/repositories/$repo/artifacts?page_size=10&page=$j"
tags=$(curl -u $USERNAME:$PASSWORD -skX 'GET' $tags_endpoint |jq -r '.[].tags' |jq -r '.[].name')
for tag in $tags;do
echo "$imges_head/$project/$repo:$tag"
done
done
done
done
done
:wq! #保存退出
chmod +x get_images.sh
sh get_images.sh
至此,使用Harbor搭建Docker私有镜像仓库完成。