文章目录

  • 一、Harbor介绍
  • 二、核心组件介绍
  • 三、Harbor和Registry的比较
  • 四、Harbor仓库搭建
  • 五、维护管理Harbor


一、Harbor介绍

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

二、核心组件介绍

查看自己的harbor仓库 harbor仓库搭建_nginx

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@localhost ~]# 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@localhost ~]# tar zxf harbor-offline-installer-v1.2.2.tgz -C /usr/local

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

4、启动 Harbor
[root@localhost ~]# cd /usr/local/harbor/
[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
[root@localhost harbor]# sh install.sh 

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

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

查看自己的harbor仓库 harbor仓库搭建_linux_02


查看自己的harbor仓库 harbor仓库搭建_查看自己的harbor仓库_03


查看自己的harbor仓库 harbor仓库搭建_linux_04


查看自己的harbor仓库 harbor仓库搭建_nginx_05

7、添加项目

查看自己的harbor仓库 harbor仓库搭建_docker_06


查看自己的harbor仓库 harbor仓库搭建_docker_07

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

//登录 docker login -u admin -p Harbor12345 http://127.0.0.1
//下载镜像进行测试 下载镜像进行测试 
docker pull nginx
//镜像打标签 
docker tag nginx 127.0.0.1/myapps/nginx:v1
//上传镜像到 上传镜像到 Harbor 
docker push 127.0.0.1/myapps/nginx:v1

查看自己的harbor仓库 harbor仓库搭建_Docker_08


查看自己的harbor仓库 harbor仓库搭建_docker_09

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

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

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

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

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

查看自己的harbor仓库 harbor仓库搭建_linux_10


查看自己的harbor仓库 harbor仓库搭建_查看自己的harbor仓库_11


上传成功!

查看自己的harbor仓库 harbor仓库搭建_查看自己的harbor仓库_12

五、维护管理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@localhost harbor]# vim harbor.cfg

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

4、重新创建并启动 Harbor 的实例
[root@localhost harbor]# docker-compose up -d

如果出现如下报错: 
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

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

查看自己的harbor仓库 harbor仓库搭建_查看自己的harbor仓库_13


查看自己的harbor仓库 harbor仓库搭建_linux_14


查看自己的harbor仓库 harbor仓库搭建_nginx_15


查看自己的harbor仓库 harbor仓库搭建_nginx_16


查看自己的harbor仓库 harbor仓库搭建_nginx_17

#在客户端上操作:使用新创建的开发人员用户登录

[root@localhost ~]# docker logout 192.168.73.10
Removing login credentials for 192.168.73.10
[root@localhost ~]# docker login 192.168.73.10
Username: wu
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@localhost ~]# docker pull 192.168.73.10/myapps/nginx:v1
v1: Pulling from myapps/nginx
Digest: sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49
Status: Image is up to date for 192.168.73.10/myapps/nginx:v1
192.168.73.10/myapps/nginx:v1

[root@localhost ~]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
192.168.73.10/myapps/nginx   v1                  bc9a0695f571        6 days ago          133MB

查看自己的harbor仓库 harbor仓库搭建_查看自己的harbor仓库_18

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

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

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

rm -rf /data/database/
rm -rf /data/registry/