一、什么是Harbor仓库?

我们在日常 Docker 容器使用和管理过程中,渐渐发现部署企业私有仓库往往是很有必要的, 它可以帮助你管理企业的一些敏感镜像, 同时由于 Docker Hub 的下载速度和 GFW 的原因, 往往需要将一些无法直接下载的镜像导入本地私有仓库. 而 Harbor 就是部署企业私有仓库的一个不二之选。Harbor 是由 VMware 公司开源的企业级的 Docker Registry 管理项目,Harbor 主要提供 Dcoker Registry 管理 UI,提供的功能包括:基于角色访问的控制权限管理(RBAC)、AD/LDAP 集成、日志审核、管理界面、自我注册、镜像复制和中文支持等。Harbor 的目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 registry 为基础,额外提供了如下功能:-> 基于角色的访问控制(Role Based Access Control)-> 基于策略的镜像复制(Policy based image replication)-> 镜像的漏洞扫描(Vulnerability Scanning)-> AD/LDAP 集成(LDAP/AD support)-> 镜像的删除和空间清理(Image deletion & garbage collection)-> 友好的管理 UI(Graphical user portal)-> 审计日志(Audit logging)-> RESTful API-> 部署简单(Easy deployment)

Harbor 的所有组件都在 Dcoker 中部署,所以 Harbor 可使用 Docker Compose 快速部署。需要特别注意:由于 Harbor 是基于 Docker Registry V2 版本,所以 docker 必须大于等于 1.10.0 版本,docker-compose 必须要大于 1.6.0 版本!

二、Harbor的架构

Harbor 的每个组件都是以 Docker 容器的形式构建的,可以使用 Docker Compose 来进行部署。如果环境中使用了 kubernetes,Harbor 也提供了 kubernetes 的配置文件。Harbor 大概需要以下几个容器组成:ui(Harbor 的核心服务)、log(运行着 rsyslog 的容器,进行日志收集)、mysql(由官方 mysql 镜像构成的数据库容器)、Nginx(使用 Nginx 做反向代理)、registry(官方的 Docker registry)、adminserver(Harbor 的配置数据管理器)、jobservice(Harbor 的任务管理服务)、redis(用于存储 session)。

Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,整体架构还是很清晰的。如下面架构图:

image-20230913144655656

image-20230913144719674

三、Harbor的功能

Docker有官方自带的registry镜像仓库,我们为什么还需要使用harbor来做镜像仓库呢?那是因为不管在操作上
还是功能上,harbor都比registry简单易上手

harbor的功能:

  • 基于角色的访问控制
  • 基于策略的镜像复制
  • 镜像的漏洞扫描
  • 镜像的删除和空间清理
  • 友好的管理UI界面
  • 部署简单

Harbor的特点

  • 安全
    安全和漏洞分析
    内容签名和验证
  • 管理
    多租户
    可拓展的API和Web UI
    跨多个Harbor实例的镜像复制
    身份集成和基于角色的访问控制

四、Harbor部署安装

环境准备:

主机名 IP 角色
harbor 10.0.0.100 harbor私有镜像仓库
docker 10.0.0.101 镜像推送

4.1、安装Docker

harbor操作:

# 1.换源
[root@harbor ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
# 2.安装docker和docker-compose
[root@harbor ~]# yum install docker-ce docker-ce-cli containerd.io docker-compose -y
# 3.修改docker配置文件 //配置加速
[root@harbor harbor]# cat /etc/docker/daemon.json
{
    "registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"]
}
# 4.启动docker
[root@harbor harbor]# systemctl enable docker --now

4.2、安装harbor

# 1.下载
[root@harbor ~]# wget https://github.com/goharbor/harbor/releases/tag/v2.9.0
# 2.解压
[root@harbor ~]# tar xf harbor-offline-installer-v2.9.0.tgz  -C /var/local/
# 3.移动到解压目录,修改harbor docker-compose文件
[root@harbor ~]# cd /var/local/harbor/
[root@harbor harbor]# vim harbor.yml.tmpl
-----------------------------------------------------------------------------------------------------
hostname: 10.0.0.100                     #//主机IP,根据情况填写域名或者主机IP
harbor_admin_password: Harbor12345        #//默认密码,可自行修改
-----------------------------------------------------------------------------------------------------
# 注释https

image-20230913151218950

修改保存退出后,文件改名为harbor.yml

[root@harbor harbor]# mv harbor.yml.tmpl  harbor.yml
# 4.安装harbor
[root@harbor harbor]# ./install.sh
#安装完后界面如下:

image-20230913151508123

#打开浏览器访问
10.0.0.100

image-20230913152009206

4.3、将harbor注册到docker中

docker操作

## 修改docker配置文件  //添加  "insecure-registries": ["http://10.0.0.100"]
[root@docker ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://k3qec6ym.mirror.aliyuncs.com"],
  "insecure-registries": ["http://10.0.0.100"]
}
## 重启docker
[root@docker ~]# systemctl restart docker
## 登录harbor
[root@docker ~]# docker login

image-20230913152612962

使用 docker login命令是默认登录到dockerhub镜像网站,而不是我们安装部署的harbor,所有这里的是登录不上去的

那正确的应该是什么方式呢?

## 登录harbor  //指定主机IP,如果端口有修改,后面指定端口即可
[root@docker ~]# docker login 10.0.0.100
Username: admin
Password:
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    #//出现此行表示登录成功

image-20230913154009988

4.4、推送镜像到harbor

推送镜像的格式标准为:harbor地址/项目名称/镜像名称:标签

#查看当前镜像
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
wp           v1        514fefe3c741   42 hours ago    728MB
busybox      latest    beae173ccac6   20 months ago   1.24MB
nginx        alpine    cc44224bfe20   20 months ago   23.5MB
mysql        5.7       c20987f18b13   21 months ago   448MB
alpine       latest    c059bfaa849c   21 months ago   5.59MB
registry     latest    b8604a3fe854   22 months ago   26.2MB
centos       7         eeb6ee3f44bd   24 months ago   204MB
#修改nginx tag
[root@docker ~]# docker tag nginx:alpine 10.0.0.100/nginx/nginx:v1.2
#查看修改后的镜像
[root@docker ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED         SIZE
wp                       v1        514fefe3c741   42 hours ago    728MB
busybox                  latest    beae173ccac6   20 months ago   1.24MB
10.0.0.100/nginx/nginx   v1.2      cc44224bfe20   20 months ago   23.5MB
nginx                    alpine    cc44224bfe20   20 months ago   23.5MB
mysql                    5.7       c20987f18b13   21 months ago   448MB
alpine                   latest    c059bfaa849c   21 months ago   5.59MB
registry                 latest    b8604a3fe854   22 months ago   26.2MB
centos                   7         eeb6ee3f44bd   24 months ago   204MB
#会发现多了一个以IP开头的nginx镜像包
# 推送镜像   //推送镜像前,记得仓库项目优先创建好
[root@docker ~]# docker push 10.0.0.100/nginx/nginx:v1.2 

image-20230913154852671

#浏览器查看推送结果

image-20230913155117040

4.5、拉取镜像

image-20230913155214654

docker pull 10.0.0.100/nginx/nginx@sha256:544ba2bfe312bf2b13278495347bb9381ec342e630bcc8929af124f1291784bb

会发现命令特别长,且拉取下来后没有TAG说明,那是因为这部分是镜像的SHA-256哈希值。Docker支持使用哈希值来唯一标识镜像的特定版本。这样可以确保你获取的是精确的镜像版本,而不会受到标签(tags)的影响如果需要TAG说明,把SHA-256哈希值换成Tags版本号即可,如下命令:

docker pull 10.0.0.100/nginx/nginx:v1.2

五、docker官方私有仓库register(了解即可)

5.1、安装部署

# 1.拉register镜像
[root@docker02 ~]# docker pull registry
# 2.查看镜像详细信息
[root@docker02 ~]# docker inspect registry
# 3.启动镜像
[root@docker02 ~]# docker run -d -p 5000:5000 --restart=always --name registry -v  /opt/myregistry:/var/lib/registry registry

5.2、推送镜像到registry

推送镜像的格式为:registry地址/镜像名称:标签

# 1.修改镜像名
[root@docker01 ~]# docker tag centos:7 10.0.0.102:5000/centos:7
# 2.修改配置文件
[root@docker01 ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"],
    "insecure-registries": ["http://10.0.0.100","http://10.0.0.102:5000"]
}
# 3.重启docker
[root@docker01 ~]# systemctl restart docker
# 4.推送镜像
[root@docker01 ~]# docker push 10.0.0.102:5000/centos:7
# 5.查看镜像
[root@docker01 ~]# curl http://10.0.0.102:5000/v2/_catalog
{"repositories":["centos","wp"]}
# 6.查看json格式   
[root@docker01 ~]# curl -s http://10.0.0.102:5000/v2/_catalog|jq
{
    "repositories": [
    "centos",
    "wp"
    ]
}
# 7.查看镜像及标签
[root@docker01 ~]# curl -s http://10.0.0.102:5000/v2/centos/tags/list
{"name":"centos","tags":["7"]}
[root@docker01 ~]# curl -s http://10.0.0.102:5000/v2/wp/tags/list
{"name":"wp","tags":["v4"]}
[root@docker01 ~]# curl -s http://10.0.0.102:5000/v2/wp/tags/list|jq
{
    "name": "wp",
    "tags": [
    "v4",
    "v5"
    ]
}

5.3、删除镜像

1)进入docker registry 的容器中
[root@docker01 ~]# docker exec -it registry /bin/sh
2) 删除指定镜像目录文件
# rm -fr /var/lib/registry/docker/registry/v2/repositories/centos7
[root@master mnt]# curl http://192.168.91.8:5000/v2/_catalog
{"repositories":[]}