目录

一、Harbor概述

1.什么是Harbor

2.Harbor的特性

3.Harbor的构成

二、Harbor的数据流向

1.docker Harbor私有仓库的过程

2.私有仓库指向私有仓库的方式

三、Docker私有仓库(Registry)

1.Registry概述

2 Registry的部署

1.下载registry镜像

2.在daemon.json文件中添加私有镜像仓库地址

3.运行registry容器

4.为镜像打标签

5.上传到私有仓库

6.列出私有仓库的所有镜像

7.列出私有仓库的centos镜像有哪些tag

8.先删除原有的centos的镜像,在测试私有仓库下载

四、Harbor部署及配置

1、部署Docker-Compose

2、部署Harbor服务

1.下载或上传Harbor安装程序

2.修改Harbor安装的配置文件

3.启动Harbor

4.查看Harbor启动镜像

5.创建一个新项目

1、浏览器访问:http://192.168.10.100/harbor 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345

2、输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮

3.此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。

​编辑6.登录Harbor

6.1 登录Harbor

6.2 下载nginx镜像进行测试

6.3 将镜像打标签

6.4 上传镜像到 Harbor

6.5 在 Harbor 界面 myproject-hg 目录下可看见此镜像及相关信息

​编辑

6.7 在其他客户端上传镜像

6.8 再次登录Hurbar

6.9 下载镜像进行测试

6.10  上传镜像进行测试

1.客户端从公网下载tomcat镜像,上传到我们的Harbor仓库中

2.刷新 Harbor 的 Web 管理界面进行查看,会发现 myproject-hg 项目里面有两个镜像


一、Harbor概述

1.什么是Harbor

Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。

Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。

Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。

2.Harbor的特性

1、基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
2、基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
3、支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
4、镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
5、图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
6、审计管理:所有针对镜 像仓库的操作都可以被记录追溯,用于审计管理。
7、支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
8、Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。

3.Harbor的构成

Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。

  1. Proxy: 是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。
  2. Registry: 负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。
  3. Database(harbor-db):为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
  4. Job services: 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。
  5. Log collector(harbor-log): 负责收集其他组件的日志到一个地方。
  6. Core services: Harbor的核心功能,主要提供以下3个服务:
  •         UI(harbor-ui): 提供图形化界面,帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。
  •        WebHook:为了及时获取Registry上image 状态变化的情况,在Registry 上配置 Webhook,把状态变化传递给 UI 模块。
  •        Token 服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求, 如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求。

Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署。
总共分为7个容器运行,通过在docker-compose.yml所在目录中执行 docker-compose ps 命令来查看, 名称分别为:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。
其中 harbor-adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。harbor-ui 所要操作的所有数据都通过 harbor-adminserver 这样一个数据配置管理中心来完成。

二、Harbor的数据流向

1.docker Harbor私有仓库的过程

1.所有的请求或认为的操作都会首先交给proxy(反向代理)
2.proxy会先将请求转发给后端Core services,Core services 中包含 3.UI、token(身份验证服务)、webhook(网站的一些服务功能)
4.转发给registry(镜像存储),若需要下载镜像等权限操作,需要通过Core services中的token令牌的身份验证服务才行
5.每一次下载和上传都产生操作记录,生成日志,保存至database中
6.database记录保存镜像的元信息及用户与组的身份信息,通过验证授权才能允许相关操作

2.私有仓库指向私有仓库的方式

有两种:

1、/etc/docker/daemon.json
2、/usr/lib/systemd/system/docker.servce
   insecure-registrues $HARBOR_IP (私有仓库的IP地址

三、Docker私有仓库(Registry)

1.Registry概述

关于Docker的仓库分为私有库和公有仓库,共有仓库只要在官方注册用户,登录即可使用。但对于仓库的使用,企业还是会有自己的专属镜像,所以私有库的搭建也是很有必要的存在。

对于原生的仓库,Docker提供了Registry,它能帮助我们组建属于自己的私有库,但是缺点也比较明显,就是难管理,无法进行复杂的操作

2 Registry的部署

1.下载registry镜像

docker pull registry   ##拉取registry镜像
 
docker images

Docker 官方提供了一个搭建私有仓库的镜像 registry (注册服务器),只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库

2.在daemon.json文件中添加私有镜像仓库地址

[root@localhost ~]#cd /etc/docker/
[root@localhost docker]#ls
daemon.json
 
[root@localhost ~]#vim /etc/docker/daemon.json
 
{
  "insecure-registries": ["192.168.21.70:5000"],
  "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]
}
 
[root@localhost docker]#systemctldaemon-reload
[root@localhost docker]#systemctl restart docker.service
[root@localhost docker]#systemctl status docker.service

3.运行registry容器

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

-itd:在容器中打开一个伪终端进行交互操作,并在后台运行
 
-v:把宿主机的/data/registry目录绑定到容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
 
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了
 
--restart=always:这是重启的策略,在容器退出时总是重启容器
 
--name registry:创建容器命名为registry
 
registry:latest:这个是刚才pull下来的镜像

Docker容器的重启策略如下:

no:默认策略,在容器退出时不重启容器
 
on-failure:在容器非正常退出时(退出状态非0),才会重启容器
 
on-failure:3 :在容器非正常退出时重启容器,最多重启3次
 
always:在容器退出时总是重启容器
 
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

4.为镜像打标签

##首先检查自己是否有centos镜像
[root@localhost docker]#docker images
 
[root@localhost docker]#docker pull centos:7  ##拉取centos7的镜像

[root@localhost docker]#docker tag centos:7 192.168.21.70:5000/centos:v1
[root@localhost docker]#docker images

如果不对私有仓库命名的话,默认走的是公共仓库(docker hub),所以需要命名镜像。

私有仓库镜像的命名规则:宿主机ip地址:端口号/xxxx(需要更改的名称)

注意:当你对源镜像进行命名后,命名后的镜像名称也视为一个标签,因为id号是相同的。如果当源镜像删除,命名后的镜像依然会存在,因为删除的是一个标签。

5.上传到私有仓库

[root@localhost docker]#docker push 192.168.21.70:5000/centos:v1

6.列出私有仓库的所有镜像

[root@localhost docker]#curl http://192.168.21.70:5000/v2/_catalog

7.列出私有仓库的centos镜像有哪些tag

[root@localhost docker]#curl http://192.168.21.70:5000/v2/centos/tags/list

8.先删除原有的centos的镜像,在测试私有仓库下载

删除原有的centos镜像

[root@localhost docker]#docker images
 
[root@localhost docker]#docker rmi 192.168.21.70:5000/centos:v1

测试私有仓库下载

[root@localhost docker]#docker images
 
[root@localhost docker]#docker pull 192.168.21.70:5000/centos:v1
 
[root@localhost docker]#docker images

四、Harbor部署及配置

环境准备:

服务器类型IP地址需要安装的组件
Harbor服务器192.168.21.70docker-ce、docker-compose、harbor-offline-v1.2.2
Client服务器192.168.21.100docker-ce
systemctl stop firewalld
setenforce 0

1、部署Docker-Compose

下载或者直接上传 Docker-Compose的包

[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls 
containerd  docker-compose  rh
[root@localhost opt]#chmod +x docker-compose 
[root@localhost opt]#mv docker-compose /usr/local/bin/
[root@localhost opt]#ls /usr/local/bin/
docker-compose

2、部署Harbor服务

1.下载或上传Harbor安装程序

[root@localhost ~]#cd /opt/
[root@localhost opt]#ls
containerd  rh
 
##下载harbor包
wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
或
##上传harbor包
[root@localhost opt]#rz -E
rz waiting to receive.
[root@localhost opt]#ls
containerd  harbor-offline-installer-v1.2.2.tgz  rh
[root@localhost opt]#tar zxf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
[root@localhost opt]#ls /usr/local/
bin  etc  games  harbor  include  lib  lib64  libexec  sbin  share  src

2.修改Harbor安装的配置文件

[root@localhost opt]#pwd
/opt
[root@localhost opt]#cd /usr/local/harbor/
[root@localhost harbor]#pwd
/usr/local/harbor
[root@localhost harbor]#ls
common                    docker-compose.notary.yml  harbor_1_1_0_template  harbor.v1.2.2.tar.gz  LICENSE  prepare
docker-compose.clair.yml  docker-compose.yml         harbor.cfg             install.sh            NOTICE   upgrade
[root@localhost harbor]#vim harbor.cfg 

vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.21.70
--59行--指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345
harbor_admin_password = Harbor12345

3.启动Harbor

cd /usr/local/harbor/
在配置好了 harbor.cfg 之后,执行 ./prepare 命令,为 harbor 启动的容器生成一些必要的文件(环境)
再执行命令 ./install.sh 以 pull 镜像并启动容器

[root@localhost harbor]#pwd
/usr/local/harbor
[root@localhost harbor]#ls
common                    docker-compose.notary.yml  harbor_1_1_0_template  harbor.v1.2.2.tar.gz  LICENSE  prepare
docker-compose.clair.yml  docker-compose.yml         harbor.cfg             install.sh            NOTICE   upgrade
 
[root@localhost harbor]#./prepare
 
[root@localhost harbor]#./install.sh

4.查看Harbor启动镜像

[root@localhost harbor]#pwd
/usr/local/harbor
[root@localhost harbor]#docker-compose ps

5.创建一个新项目

1、浏览器访问:http://192.168.10.100/harbor 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345

2、输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮

填写项目名称为“xuzhou-hg”,点击“确定”按钮,创建新项目

3.此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。



6.登录Harbor

6.1 登录Harbor
[root@localhost harbor]#docker login -u admin -p Harbor12345 http://127.0.0.1

6.2 下载nginx镜像进行测试
[root@localhost harbor]#docker pull nginx

6.3 将镜像打标签

格式:docker tag 镜像:标签 仓库IP/项目名称/镜像名:标签

[root@localhost harbor]#docker tag nginx:latest 127.0.0.1/xuzhou-hg/nginx:v1

6.4 上传镜像到 Harbor
[root@localhost harbor]#docker push 127.0.0.1/xuzhou-hg/nginx:v1

6.5 在 Harbor 界面 myproject-hg 目录下可看见此镜像及相关信息
6.7 在其他客户端上传镜像

以上操作都是在 Harbor 服务器本地操作。如果其他客户端登录到 Harbor,就会报如下错误。出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。

解决方法:

在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。

//解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.21.70 --containerd=/run/containerd/containerd.sock

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.21.70

[root@localhost ~]#vim /usr/lib/systemd/system/docker.service

重启Docker服务,再次登录

[root@localhost ~]#systemctl daemon-reload
[root@localhost ~]#systemctl restart docker.service 

6.8 再次登录Hurbar
[root@localhost ~]#docker login -u admin -p Harbor12345 http://192.168.21.70

6.9 下载镜像进行测试
[root@localhost ~]#docker pull 192.168.10.100/myproject-hg/nginx:v1
 
[root@localhost ~]#docker images

6.10  上传镜像进行测试
1.客户端从公网下载tomcat镜像,上传到我们的Harbor仓库中
[root@localhost ~]#docker pull tomcat

[root@localhost ~]#docker tag tomcat:latest 192.168.21.70/xuzhou-hg/tomcat:v2
[root@localhost ~]#docker images

2.刷新 Harbor 的 Web 管理界面进行查看,会发现 myproject-hg 项目里面有两个镜像

GitHub 加速计划 / ha / harbor
23.24 K
4.68 K
下载
Harbor 是一个开源的容器镜像仓库,用于存储和管理 Docker 镜像和其他容器镜像。 * 容器镜像仓库、存储和管理 Docker 镜像和其他容器镜像 * 有什么特点:支持多种镜像格式、易于使用、安全性和访问控制
最近提交(Master分支:2 个月前 )
9e55afbb pull image from registry.goharbor.io instead of dockerhub Update testcase to support Docker Image Can Be Pulled With Credential Change gitlab project name when user changed. Update permissions count and permission count total Change webhook_endpoint_ui Signed-off-by: stonezdj <stone.zhang@broadcom.com> Co-authored-by: Wang Yan <wangyan@vmware.com> 9 天前
3dbfd422 Signed-off-by: wang yan <wangyan@vmware.com> 10 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐