Harbor企业级私有镜像仓库

学习欲无止境,加油吧年轻人

Harbor介绍

1.Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装箱的原理。所以,Harbor正是一个用于存储Docker镜像的企业级Registry服务。

Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

2.Harbor特性
基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制: 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
图形化用户界面: 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
AD/LDAP 支持: Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理: 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化: 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
部署简单: 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

3.Harbor组件
Harbor在架构上主要由6个组件构成:

Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。

Core services: 这是Harbor的核心功能,主要提供以下服务:

UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析

各个组件之间的关系如下图所示:
高可用方案

基础环境安装

本次示例是在Centos中安装

安装docker

  • 旧版本的卸载docker
yum -y remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 设置存储库
yum install -y yum-utils &>/dev/null
  • 设置镜像的仓库
 #(默认是国外的!在你安装Docker引擎时特别特别慢)
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo     
    
# 推荐使用阿里国内源安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 更新软件包索引
yum makecache fast
  • 安装最新的Docker引擎 docker-ce:社区版 ee企业版
yum -y install docker-ce docker-ce-cli containerd.io
systemctl stop docker && systemctl daemon-reload && systemctl enable docker && systemctl start docker	
		
使用docker version查看版本
[root@localhost harbor]# docker version
Client: Docker Engine - Community
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:49:57 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.15
  Git commit:       87a90dc
  Built:            Thu Mar 24 01:48:24 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

安装Docker Compose

Compose是一个用于定义和运行多容器Docker应用程序的工具。通过编写,您可以使用YAML文件配置应用程序的服务。然后,使用一个命令就可以从yml文件配置中创建并启动配置中的所有服务。

Compose在所有环境中编写工作:生产、分期、开发、测试以及CI工作流。

使用Compose基本上是一个三步的过程:

  1. Dockerfile定义应用程序的环境,这样它就可以在任何地方复制。
  2. docker-compose.yml中定义构成应用程序的服务。这样它们就可以在一个孤立的环境中一起运行。
  3. 运行docker-compose up然后编写、启动和运行整个应用程序。

作用:批量容器服务编排。
官网安装地址

# 1、下载DockerCompose当前的稳定版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose  #国外比较慢

curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose       #国内比较快 
# 2、授权
chmod +x /usr/local/bin/docker-compose

*如果命令docker-compose安装后失败,请检查您的路径。您还可以创建一个指向/usr/bin或者路径中的任何其他目录。
例如:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 3、测试安装
docker-compose --version

编写Harbor的Https认证

【1】编写认证shell,auth.sh
SSL证书创建

选项参数说明:
genrsa        生成私钥
-out filename 标准输出到filename文件
req           生成证书请求
-new          生成新证书签署请求
-x509         专用于CA生成自签证书;不自签的时候不要加该选项
-days num     证书的有效期限
-key file     生成请求时用到的私钥文件
-out filename 标准输出到filename文件

subj内容详解:
C             = 国家
ST            = 省/州
L             = 城市
O             = Organization Name
OU            = Organizational Unit Name
CN            = Common Name
emailAddress  = test@email.address
#!/bin/bash
mkdir -p /data/cert
cd /data/cert
# 创建根证书
openssl genrsa -out /data/cert/ca.key 4096			# 创建CA私钥
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=121.37.255.40" -key ca.key -out ca.crt		# 制作CA公钥
openssl genrsa -out /data/cert/$1.key 4096
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=$1" -key /data/cert/$1.key -out /data/cert/$1.csr

# 生成一个x509 v3扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:$1
EOF

# 证书签发(使用CA证书进行签发)
openssl x509 -req -sha512 -days 3650 -extfile /data/cert/v3.ext -CA /data/cert/ca.crt -CAkey /data/cert/ca.key -CAcreateserial -in /data/cert/$1.csr -out /data/cert/$1.crt

# 转换 /data/cert/$1.crt 为 /data/cert/$1.cert
openssl x509 -inform PEM -in /data/cert/$1.crt -out /data/cert/$1.cert

# 将服务器证书,密钥和 CA 文件复制到 Harbor主机上的 Docker 证书文件夹中
mkdir -p /etc/docker/certs.d/$1/
cp /data/cert/$1.cert /etc/docker/certs.d/$1/
cp /data/cert/$1.key /etc/docker/certs.d/$1/
cp /data/cert/$1.crt /etc/pki/ca-trust/source/anchors/

# 更新系统的证书
update-ca-trust

【2】运行auth.sh

chmod +x auth.sh 		  #添加执行权限
./auth.sh 192.168.235.10  #(192.168.235.10 表示安装harbor的地址,是传递给auth.sh的参数)

【3】修改daemon.json
添加一行insecure-registries配置即可,允许使用安全方式访问Harbor镜像仓库
#192.168.235.10表示harbor仓库的地址

[root@localhost harbor]# cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://cy1sz59q.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.235.10"] 
}

安装Harbor

到Github上获取自己想要安装的版本 官网地址

wget https://github.com/goharbor/harbor/releases/download/v2.4.2/harbor-online-installer-v2.4.2.tgz

【1】解压

[root@localhost ~]# tar -zxvf harbor-online-installer-v2.4.2.tgz
[root@localhost ~]# cd harbor
[root@localhost harbor]# ll
总用量 56
drwxr-xr-x. 3 root root    20 4   6 18:34 common
-rw-r--r--. 1 root root  3361 3  15 11:51 common.sh
-rw-r--r--. 1 root root  5889 4   6 21:52 docker-compose.yml
-rw-r--r--. 1 root root  9680 4   6 21:48 harbor.yml
-rw-r--r--. 1 root root  9668 3  15 11:51 harbor.yml.tmpl
-rwxr-xr-x. 1 root root  2500 3  15 11:51 install.sh
-rw-r--r--. 1 root root 11347 3  15 11:51 LICENSE
-rwxr-xr-x. 1 root root  1881 3  15 11:51 prepare

docker-compose.yml是安装harbor的方式,里面都是安装harbor所需要,如果我们想进行修改可以在里面进行修改,比如修改harbor的数据库
install.sh:      是一键安装harbor的指令

【2】编辑harbor配置文件

[root@localhost harbor]# cp harbor.yml.tmpl harbor.yml
[root@localhost harbor]# vi harbor.yml
# 1、如果所有机器都在一个局域网,那么配置内网IP
# 2、如果机器跨网络,只能通过公网访问,那么配置本机外网IP或域名
  5 hostname: 192.168.235.10          #IP地址或者域名
# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80
# https related config(https认证) 如果使用了https协议且端口是443,那么当使用http访问时,会自动跳转到https。
https:	
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /data/cert/192.168.235.10.crt
  private_key: /data/cert/192.168.235.10.key
# Harbor admin的初始密码,只在第一次安装Harbor时有效  
# 记住在启动Harbor后从UI更改管理员密码。 
  34 harbor_admin_password: Harbor12345
# 数据存储路径
  47 data_volume: /data

【3】部署Harbor
修改完配置文件后,在当前目录执行./install.sh,Harbor服务就会根据当前目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动。
使用install.sh一键安装,因为要下载好多镜像,所以需要等待一段时间

./install.sh
		······
✔ ----Harbor has been installed and started successfully.----

配置Harbor

Harbor实现
Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;

[root@localhost harbor]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
goharbor/redis-photon         v2.4.2    61d136910774   3 weeks ago   158MB
goharbor/harbor-registryctl   v2.4.2    f43545bdfd12   3 weeks ago   138MB
goharbor/registry-photon      v2.4.2    1927be8b8775   3 weeks ago   80.8MB
goharbor/nginx-photon         v2.4.2    4189bfe82749   3 weeks ago   47.3MB
goharbor/harbor-log           v2.4.2    b2279d3a2ba5   3 weeks ago   162MB
goharbor/harbor-jobservice    v2.4.2    d22f0a749835   3 weeks ago   222MB
goharbor/harbor-core          v2.4.2    672a56385d29   3 weeks ago   199MB
goharbor/harbor-portal        v2.4.2    bc60d9eaf4ad   3 weeks ago   56.3MB
goharbor/harbor-db            v2.4.2    91d13ec46b2c   3 weeks ago   226MB
goharbor/prepare              v2.4.2    d2100ed70ba4   3 weeks ago   269MB
[root@localhost harbor]# docker-compose ps
      Name                     Command                  State                                          Ports                                    
------------------------------------------------------------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)                                                                               
harbor-db           /docker-entrypoint.sh 96 13      Up (healthy)                                                                               
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)                                                                               
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp                                                   
harbor-portal       nginx -g daemon off;             Up (healthy)                                                                               
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp,:::80->8080/tcp, 0.0.0.0:443->8443/tcp,:::443->8443/tcp
redis               redis-server /etc/redis.conf     Up (healthy)                                                                               
registry            /home/harbor/entrypoint.sh       Up (healthy)                                                                               
registryctl         /home/harbor/start.sh            Up (healthy)    

nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的dockerregistry;
harbor-jobservice: harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;
harbor-ui:		    web管理页面,主要是前端的页面和后端CURD的接口;
registry: 		    docker原生的仓库,负责保存镜像;
harbor-adminserver:harbor系统管理接口,可以修改系统配置以及获取系统信息;
harbor-db: harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中;
harbor-log:harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog;

这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy(即Nginx)的服务端口;

访问Harbor的管理界面,输入账号密码admin:Harbor12345登录即可,访问地址:https://192.168.235.10/ ,并创建test项目
项目内容
使用docker login命令访问Harbor镜像仓库
输入的用户和密码是harbor的用户和密码

[root@localhost ~]# docker login 192.168.235.10 -u admin -p Harbor12345
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@localhost ~]# cat /root/.docker/config.json 
{
        "auths": {
                "192.168.235.10": {
                        "auth": "YWRtaW46SGFyYm9yMTIzNDU="
                }
        }
}

测试
编写Dockerfile制作镜像

[root@localhost ~]# vim centos.yml 
FROM centos:7
MAINTAINER ZHZ<168@qq.com>
RUN yum -y install vim lrzsz bind-utils &>/dev/null
ARG 最初版本
ENV TZ "Asia/Shanghai"
[root@localhost ~]# docker build -f centos.yml -t 192.168.235.10/test/centos:zhz .

将192.168.235.10/test/centos:zhz推入到harbor的test中

[root@localhost ~]# docker push 192.168.235.10/test/centos:zhz 
The push refers to repository [192.168.235.10/test/centos]
e62aff74443a: Pushed 
174f56854903: Pushed 
zhz: digest: sha256:f42a34dfb70db0a93b172b9c0ba85eb3822e969cafbd9b8bca55ce98cf11235e size: 741

传输完成以后在harbor中查看!
简单

Harbor 高可用部署

按照前文的方法,可以部署两台 Harbor 主机,一台作为 master,一台作为 slave。安装完成后,登录 master 主机的 Harbor,在【系统管理】->【仓库管理】可以添加 slave 主机的 Harbor 连接,然后配置其复制规则,便可实现 slave 主机自动备份 master 主机仓库。

Harbor 添加漏洞扫描

./prepare --with-clair --with-clair
docker-compose up -d

都看到这里了点个赞在走呗~
有请赞助

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光落入你灰蒙蒙的眼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值