Harbor私有仓库搭建与管理解析

一、Harbor 简介

  • Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装箱的原理。所以,Harbor正是一个用于存储Docker镜像的企业级Registry服务。
  • Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。

二、核心组件介绍

Harbor私有仓库搭建与管理解析

  • Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
  • db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。 UI:提供图形化界面,帮助用户管理registry上的镜像,并对用户进行授权。
  • jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registrypull镜像然后push到另一个registry,并记录job_log。
  • Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
  • Registry:镜像仓库,负责存储镜像文件。 Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

三、Harbor 和 Registry 的比较

Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。

1.提供分层传输机制,优化网络传输 Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。

2.提供WEB界面,优化用户体验 只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。

3.支持水平扩展集群 当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。

4.良好的安全机制 企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。

5.Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。

四、Harbor私有仓库 搭建

1.确保docker-compose已能使用
[root@docker ~]# docker-compose version
docker-compose version 1.21.1, build 5a3f1a3
docker-py version: 3.3.0
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

2、将harbor-offline-installer-v1.2.2.tgz软件包上传到/root目录下,解压到/usr/local/目录下
[root@docker ~]# tar zxf harbor-offline-installer-v1.2.2.tgz -C /usr/local

3、配置 Harbor 参数文件
[root@docker ~]# vim /usr/local/harbor/harbor.cfg
hostname = 192.168.40.11

4、启动 Harbor
[root@docker ~]# cd /usr/local/harbor/
[root@docker harbor]# ls
common                     docker-compose.yml     harbor.v1.2.2.tar.gz  NOTICE
docker-compose.clair.yml   harbor_1_1_0_template  install.sh            prepare
docker-compose.notary.yml  harbor.cfg             LICENSE               upgrade
[root@docker harbor]# sh install.sh 
...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-adminserver ... done
Creating harbor-db          ... done
Creating registry           ... done
Creating harbor-ui          ... done
Creating harbor-jobservice  ... done
Creating nginx              ... done

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.40.11. 
For more details, please visit https://github.com/vmware/harbor .

5、查看Harbor启动镜像及容器
///docker images ##镜像
///docker ps -a  ##容器
///docker-compose ps  ##compose编排的容器

6、查看首页
http://192.168.40.11
用户名:admin
密码:Harbor12345

Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析
7、添加项目
Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析

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

(1) 登录 
[root@docker ~]# docker login -u admin -p Harbor12345 http://127.0.0.1
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

(2) 下载镜像进行测试 下载镜像进行测试 
[root@docker ~]# docker pull nginx

(3) 镜像打标签 
[root@docker ~]# docker tag nginx 127.0.0.1/myapps/nginx:v1

(4) 上传镜像到 上传镜像到 Harbor 
[root@docker ~]# docker push 127.0.0.1/myapps/nginx:v1

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

[root@docker ~]# docker login -u admin -p Harbor12345 http://192.168.40.11
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.40.11/v2/: dial tcp 192.168.40.11:443: connect: connection refused

解决办法(客户机修改):

[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.40.11 --containerd=/run/containerd/containerd.sock

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

Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析

五、管理维护Harbor

可以使用 docker-compose 来管理 Harbor。一些有用的命令如下所示,必须在与 docker-compose.yml 相同的目录中运行。
修改 Harbor.cfg 配置文件
要更改 Harbour 的配置文件时,请先停止现有的 Harbor 实例并更新 Harbor.cfg;
然后运行 prepare 脚本来填充配置;最后重新创建并启动 Harbor 的实例。

1.停止现有的 Harbor 实例(服务器端)
[root@localhost harbor]# docker-compose down -v

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

2、更新 Harbor.cfg
[root@dockert harbor]# vim harbor.cfg

3、运行 prepare 脚本来填充配置
[root@localhostdocker harbor]# ./prepare

4、重新创建并启动 Harbor 的实例
[root@docker harbor]# docker-compose up -d
harbor-log is up-to-date
Recreating harbor-adminserver ... 
harbor-db is up-to-date
Recreating harbor-adminserver ... done
Recreating harbor-ui          ... done
Recreating harbor-jobservice  ... done
Recreating nginx              ... done

如果出现如下报错: 
Creating network "harbor_harbor" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables -- wait -t nat -I DOCKER -i br-25094fc09b3c -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
解决方法:关闭防火墙后, 解决:关闭防火墙后, docker需要重启 
systemctl restart docker 
docker-compose up -d

创建用户xu,并将其创建为myapps项目的开发人员

Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析
Harbor私有仓库搭建与管理解析

Harbor私有仓库搭建与管理解析

Harbor私有仓库搭建与管理解析
在客户端上操作:使用新创建的开发人员用户登录

[root@docker ~]# docker logout 192.168.40.11
Removing login credentials for 192.168.40.11
[root@docker~]# docker login 192.168.40.11
Username: xu
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

[root@docker ~]# docker pull 192.168.40.11/myapps/nginx:v1
v1: Pulling from myapps/nginx
Digest: sha256:0b159cd1ee1203dad901967ac55eee18c24da84ba3be384690304be93538bea8
Status: Downloaded newer image for 192.168.40.11/myapps/nginx:v1
192.168.40.11/myapps/nginx:v1

[root@docker ~]# docker images
REPOSITORY                   TAG               IMAGE ID       CREATED        SIZE
192.168.40.11/myapps/nginx   v1                f6d0b4767a6c   2 months ago   133MB

移除 Harbor 服务容器同时保留镜像数据/数据库

在 Harbor服务器上操作 docker-compose down -v
[root@docker ~]# cd /usr/local/harbor/
[root@docker harbor]# docker-compose down -v
Stopping harbor-jobservice  ... done
Stopping nginx              ... done
Stopping harbor-ui          ... done
Stopping harbor-db          ... done
……省略

如需重新部署,需要移除 Harbor 服务容器全部数据
持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下。

rm -rf /data/database/
rm -rf /data/registry/
上一篇:Docker之私有镜像仓库Harbor搭建


下一篇:SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么