Harbor

  • 在生产运维环境中,伴随镜像和项目越来越多,单台docker主机无法支撑那么多业务,而Harbor是一个企业级镜像仓库Harbor,将作为我们容器云平台的镜像仓库中心。
  • 官网直通车

Harbor功能

  • 基于角色访问控制(RBAC)

    在企业中,通常有不同的开发团队负责不同的项目,镜像像代码一样,每个人角色不同需求也不同,因此就需要访问权限控制,根据角色分配相应的权限。

    例如,开发人员需要对项目构建这就用到读写权限(push/pull),测试人员只需要读权限(pull),运维一般管理镜像仓库,具备权限分配能力,项目经理具有所有权限。

  • 镜像复制

    可以将仓库中的镜像同步到远程的Harbor,类似于MySQL主从同步功能。

  • LDAP

    Harbor支持LDAP认证,可以很轻易接入已有的LDAP。

  • 镜像删除和空间回收

    Harbor支持在Web删除镜像,回收无用的镜像,释放磁盘空间。

  • 图形页面管理

    用户很方面搜索镜像及项目管理。

  • 审计

    对仓库的所有操作都有记录。

  • REST API

    完整的API,方便与外部集成。

Harbor组件组成

组件 功能
harbor-adminserver 配置管理中心
harbor-db Mysql数据库
harbor-jobservice 负责镜像复制
harbor-log 记录操作日志
harbor-ui Web管理页面和API
nginx 前端代理,负责前端页面和镜像上传/下载转发
redis 会话
registry 镜像存储

环境准备工作

1. 关闭防火墙及selinux,生产环境建议不要关闭。

1
2
3
4
5
6
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
# 临时关闭selinux
setenforce 0
# 永久关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

2. 安装docker 安装依赖工具

1
yum install -y yum-utils

设置稳定的存储库

1
2
3
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

直接安装最新docker版本

1
yum -y install docker-ce docker-ce-cli containerd.io

启动docker并设置开机启动

1
systemctl start docker && systemctl enable docker

3. 安装docker-compose

下载docker-compose,最新版地址:docker-compose

1
curl -L https://github.com/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

若是github访问太慢,可以用daocloud下载

1
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

设置权限

1
chmod +x /usr/local/bin/docker-compose

检查

1
docker-compose -version

安装Harbor

这里使用离线方式安装,安装版本是:Harbor

解压

1
tar -xzvf harbor-offline-installer-xxx.tgz

编辑:harbor.yml

1
2
3
4
# 拷贝副本
cp harbor.yml.tmpl harbor.yml
# 编辑
nano harbor.yml

HTTP方式

修改:hostname为自己服务器IP,此处为内网部署,注释https相关选项,设置管理员密码:harbor_admin_password: xxxx

执行生成配置文件

1
./prepare

安装并启动Harbor

1
./install.sh

HTTPS方式

在生产环境中,我们应该从CA获得证书。在测试或开发环境中,我们可以生成自己的CA。要生成CA证书,请运行以下命令。

1. 生成CA证书私钥。

创建保存证书的位置(可选)

1
2
3
4
5
6
# 创建目录
midir -p /home/harbor/ssl
# 进入目录
cd /home/harbor/ssl
# 生成证书
openssl genrsa -out ca.key 4096

2. 生成CA证书。

如果使用IP地址,需要先执行以下操作:

1
2
3
cd /root
openssl rand -writerand .rnd
cd -

调整-subj选项中的值以反映您的组织。如果使用FQDN连接Harbor主机,则必须将其指定为通用名称(CN)属性。

1
2
3
4
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Chengdu/L=Chengdu/O=meatball/OU=Personal/CN=192.168.3.211" \
-key ca.key \
-out ca.crt

编辑配置文件harbor.yml 设置证书路径

执行生成配置文件

1
./prepare

安装并启动Harbor

1
./install.sh

使用

根据页面提示使用,默认端口80,此处以springboot本地项目示例

1. 创建镜像 编写Dockefile文件,并放入springboot项目根目录。

注意:ADD build/libs/*.jar 修改为您的jar包所在目录

创建Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指定基础镜像
FROM openjdk:18
#
MAINTAINER 张翔宇<zhang.xiangyu@foxmail.com>
# 配置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 解决字体问题
# RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
# 将本地文件挂载到当前容器
VOLUME /tmp
# 复制文件到容器
ADD build/libs/*.jar app.jar
#配置容器启动后执行的命令
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS"]

在Dockerfile同级目录执行构建命令

1
docker build -t yh-university-macau:20220723 .

2. 推送镜像

如果是Windows本地推送镜像请修改用户目录下(如:C:\Users\zhang\.docker)的daemon.json文件增加”insecure-registries”:[“192.168.3.212”]配置

1

1
2
3
4
5
6
# 登录
docker login -u admin -p xxxx 192.168.3.212
# 打tag
docker tag yh-university-macau:20220723 192.168.3.212/library/yh-university-macau:20220723
# push
docker push 192.168.3.212/library/yh-university-macau:20220723

3. 拉取镜像

由于k8s中的container默认拉取镜像使用的是HTTPS方式,因此需要在k8s的每个节点都设置配置文件内容如下: 搜索:[plugins.”io.containerd.grpc.v1.cri”.registry] 并更改如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = ""

[plugins."io.containerd.grpc.v1.cri".registry.auths]

[plugins."io.containerd.grpc.v1.cri".registry.configs]
# 修改部分,ip地址根据实际情况修改
[plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.3.212".tls]
insecure_skip_verify = true

[plugins."io.containerd.grpc.v1.cri".registry.headers]

# 修改部分同上
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.3.212"]
endpoint = ["https://192.168.3.212"]

[plugins."io.containerd.grpc.v1.cri".x509_key_pair_streaming]
tls_cert_file = ""
tls_key_file = ""

重启container

1
systemctl restart containerd