大家好,我是SuieKa。一个在学计算机网络方面的小白,也是在校大二学生,学以致用,实操记载,博文若有毛病,请一定留言哟
今天写了这篇简单介绍harbor私有仓的博文。有不对,请指教。
目录
- 一、什么是harbor?
- 1、harbor介绍
- 2、harbor原理介绍
- 二、安装harbor.v2.0.0私有仓库
- 三、进行客户端实现pull、push
一、什么是harbor?
1、harbor介绍
1)、harbor:港口之意
Harbor是一个开放源代码容器映像注册表,可通过基于角色的访问控制来保护映像,扫描映像中的漏洞并将映像签名为受信任。作为CNCF孵化项目,Harbor提供合规性,性能和互操作性,以帮助您跨Kubernetes和Docker等云原生计算平台持续,安全地管理映像。
Harbor正是一个用于存储Docker镜像的企业级Registry服务。
Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。
2)、Harbor核心组件
Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
Registry:镜像仓库,负责存储镜像文件。
Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
3)、Harbor和Registry的比较
Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。
(1).提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
(2).提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
(3).支持水平扩展集群
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
(4).良好的安全机制
企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
(5).Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
2、harbor原理介绍
1)、软件资源
Harbor是VMware公司开源的企业级DockerRegistry项目。
项目地址为https://github.com/vmware/harbor。 其目标是帮助用户迅速搭建一个企业级Dockerregistry服务。 它以Docker公司开源的registry为基础, 提供了管理UI, 基于角色的访问控制(Role Based Access Control), AD/LDAP集成、 以及审计日志(Auditlogging)等企业用户需求的功 能, 同时还原生支持中文。 Harbor的每个组件都是以Docker容器的形式构建的, 使用Docker Compose来对它进行部 署。
用于部署Harbor的Docker Compose模板位于 /Deployer/docker-compose.yml, 由5个容器组成, 这几个容器通过 Docker link的形式连接在一起,在容器之间通过容器名字互相访问。 对终端用户而言, 只需要暴露 proxy ( 即Nginx) 的服务端口。
Proxy: 由Nginx 服务器构成的反向代理。
Registry: 由Docker官方的开源 registry 镜像构成的容器实例。
UI: 即架构中的 core services, 构成此容器的代码是 Harbor项目的主体。
MySQL: 由官方 MySQL 镜像构成的数据库容器。
Log: 运行着 rsyslogd的容器, 通过 log-driver的形式收集其他容器的日志。
2)、 Harbor特性
a、 基于角色控制: 用户和仓库都是基于项目进行组织的, 而用户基于项目可以拥有不同的权限。
b、 基于镜像的复制策略: 镜像可以在多个Harbor实例之间进行复制。
c、 支持LDAP: Harbor的用户授权可以使用已经存在LDAP用户。
d、 镜像删除 &垃圾回收: Image可以被删除并且回收Image占用的空间, 绝大部分的用户操作API, 方便 用户对系统进行扩展。
e、 用户UI:用户可以轻松的浏览、 搜索镜像仓库以及对项目进行管理 。
f、 轻松的部署功能: Harbor提供了online、 offline安装,除此之外还提供了virtualappliance安装 。
g、 Harbor和 docker registry 关系: Harbor实质上是对docker registry 做了封装, 扩展了自己的业务模块。
二、安装harbor.v2.0.0私有仓库
安装docker-compose(不然后面使用脚本安装harbor会报错)
使用国内(快)
17:50:22 root@harbor-server ~]#curl -L https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 425 100 425 0 0 486 0 --:--:-- --:--:-- --:--:-- 486
100 16.4M 100 16.4M 0 0 3614k 0 0:00:04 0:00:04 --:--:-- 5111k
[17:51:31 root@harbor-server ~]#chmod +x /usr/local/bin/docker-compose
[17:51:45 root@harbor-server ~]#docker-compose --version
docker-compose version 1.25.2, build 698e2846
CentOS8.1
[16:22:58 root@wang-tuxing network-scripts]#uname -rvs
Linux 4.18.0-147.el8.x86_64 #1 SMP Wed Dec 4 21:51:45 UTC 2019
前提:
[16:39:08 root@harbor-server ~]#python3.6
Python 3.6.8 (default, Nov 21 2019, 19:31:34)
[16:39:25 root@harbor-server ~]#docker-compose --version
docker-compose version 1.25.2, build 698e2846
[16:39:34 root@harbor-server ~]#docker -v
Docker version 19.03.8, build afacb8b
做一个证书:
[17:03:04 root@harbor-server software]#cd
[17:03:57 root@harbor-server ~]#openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........................................+++++
........+++++
e is 65537 (0x010001)
Enter pass phrase for server.key: ####输入root密码
Verifying - Enter pass phrase for server.key: ####输入root密码
生成证书:
[17:04:41 root@harbor-server ~]#openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: ####root密码
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:ZG ####我写中国简称
State or Province Name (full name) []:SC ####四川简称
Locality Name (eg, city) [Default City]:CD ####成都简称
Organization Name (eg, company) [Default Company Ltd]:HUAWEI ####这里是写组织名称,看个人填写
Organizational Unit Name (eg, section) []:hub.huawei.com ###组织单位名称,看个人填写
Common Name (eg, your name or your server's hostname) []:wang-tuxing ###本CentOS的hostname主机名
Email Address []:15228416354@163.com ####邮箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ###回车
An optional company name []: ###回车
当前下生成两个文件server.csr server.key
[17:09:50 root@harbor-server ~]#ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg initial-setup-ks.cfg server.csr server.key
[17:14:12 root@harbor-server ~]#cp server.key server.key.org
###证书启动时候,需要输入私钥的密码,但而nginx是在容器中运行,启动无法写入证书密码,会报错退出的。让证书启动时候不包含秘钥,退秘钥
[17:16:33 root@harbor-server ~]#openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:“password” ###写入root密码
writing RSA key
[17:17:22 root@harbor-server ~]#openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = ZG, ST = SC, L = CD, O = HUAWEI, OU = hub.huawei.com, CN = wang-tuxing, emailAddress = 15228416354@163.com
Getting Private key
[17:18:10 root@harbor-server ~]#mkdir -p /data/cert ####存放地
root@harbor-server ~]#mv server.* /data/cert/
[17:20:43 root@harbor-server ~]#cd /data/cert/
[17:20:48 root@harbor-server cert]#ll
总用量 16
-rw-r--r-- 1 root root 1318 5月 21 17:18 server.crt
-rw-r--r-- 1 root root 1054 5月 21 17:09 server.csr
-rw------- 1 root root 1679 5月 21 17:17 server.key
-rw------- 1 root root 1751 5月 21 17:16 server.key.org
离线下载包地址:https://github.com/goharbor/harbor/releases/download/v2.0.0/harbor-offline-installer-v2.0.0.tgz
使用迅雷下载(快)
[16:54:48 root@harbor-server ~]#cd /software/
[16:54:50 root@harbor-server software]#ll
总用量 843504
-rw-r--r-- 1 root root 863747205 5月 21 16:46 harbor-offline-installer-v2.0.0.tgz
[17:01:39 root@harbor-server software]#tar xf harbor-offline-installer-v2.0.0.tgz
[17:02:32 root@harbor-server software]#mv harbor /usr/local/
[17:02:32 root@harbor-server software]#cd /usr/local/harbor
[19:30:03 root@wang-tuxing harbor]#ls
common.sh harbor.v2.0.0.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
配置harbor:harbor的模板配置文件是harbor.yml.tmpl
vi harbor.yml.tmpl
[19:42:02 root@wang-tuxing harbor]#./install.sh
。。。。。。。。。。。。。。。。。。。。。。。。。。。。
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-portal ... done
Creating registry ... done
Creating registryctl ... done
Creating redis ... done
Creating harbor-db ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
若报错:
[Step 5]: starting Harbor ...
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-7213c023fb07 -j RETURN: iptables: Index of insertion too big.
(exit status 1))
重启docker:systemctl restart docker
再执行脚本
docker查看进程:
[19:52:18 root@wang-tuxing harbor]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff077c97b5cd goharbor/nginx-photon:v2.0.0 "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes (healthy) 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp nginx
8a4a8e857503 goharbor/harbor-jobservice:v2.0.0 "/harbor/entrypoint.…" 13 minutes ago Up 13 minutes (healthy) harbor-jobservice
d32f28a8fb06 goharbor/harbor-core:v2.0.0 "/harbor/entrypoint.…" 13 minutes ago Up 13 minutes (healthy) harbor-core
a5718b941027 goharbor/harbor-db:v2.0.0 "/docker-entrypoint.…" 13 minutes ago Up 13 minutes (healthy) 5432/tcp harbor-db
523e86ee40c2 goharbor/redis-photon:v2.0.0 "redis-server /etc/r…" 13 minutes ago Up 13 minutes (healthy) 6379/tcp redis
32d784066aeb goharbor/harbor-registryctl:v2.0.0 "/home/harbor/start.…" 13 minutes ago Up 13 minutes (healthy) registryctl
80bf03f0e4b1 goharbor/registry-photon:v2.0.0 "/home/harbor/entryp…" 13 minutes ago Up 13 minutes (healthy) 5000/tcp registry
e39ed6e07588 goharbor/harbor-portal:v2.0.0 "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes (healthy) 8080/tcp harbor-portal
8ee4ce2d4db0 goharbor/harbor-log:v2.0.0 "/bin/sh -c /usr/loc…" 13 minutes ago Up 13 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log
访问harbor服务器:
修改Windows hosts文件
添加192.168.1.103 hub.huawei.com
保存退出!
登录admin密码password(前面设置的密码)
Harbor 的日常运维管理是通过 docker-compose 来完成的,Harbor 本身有多个服务进程,都放在 docker 容器之中运行,我们可以通过 docker ps 命令查看。
启动
docker-compose start
停止
docker-compose stop
重启
docker-compose restart
三、进行客户端实现pull、push
环境:
CentOS8.1(harbor仓库):192.168.1.103
CentOS7.5(harbor客户端):192.168.1.105
1、创建用户
根据提示写
退出,就可以使用wang用户登录
2、新建项目
3、推送镜像
[21:09:22 root@harbor-server ~]# vim /etc/docker/daemon.json
修改centos8的hosts文件
[21:13:11 root@harbor-server ~]#echo "192.168.1.103 hub.huawei.com" >> /etc/hosts
再这里就有推送示例
测试:是否可以推送镜像
登录到用户
[21:14:25 root@harbor-server ~]#[22:15:23 root@harbor-server harbor]#docker login -u admin -p password hub.huawei.com
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
本地server推送:
[22:16:54 root@harbor-server harbor]#docker tag centos:latest hub.huawei.com/wa/centos:latest
[22:14:31 root@harbor-server harbor]#docker push hub.huawei.com/wa/centos:latest
The push refers to repository [hub.huawei.com/wa/centos]
0683de282177: Pushed
latest: digest: sha256:9e0c275e0bcb495773b10a18e499985d782810e47b4fce076422acb4bc3da3dd size: 529
刷新查看:
docker pull hub.huawei.com/wa/centos:latest ###可以使用这个命令进行下载
centos7.5客户端推送:
[22:24:05 root@harbor-client ~]#cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[22:38:46 root@harbor-client ~]#echo "10.10.10.12 hub.huawei.com" >> /etc/hosts
[22:39:12 root@harbor-client ~]#cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.12 hub.huawei.com
[22:40:28 root@harbor-client ~]#cat /etc/docker/daemon.json
{
"insecure-registries": ["hub.huawei.com"]
}
[22:41:13 root@harbor-client ~]#docker login -u admin -p password hub.huawei.com ##登录
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
查看:
在centos8上pull下来
[22:17:07 root@harbor-server ~]#docker pull hub.huawei.com/wa/tomcat9
Using default tag: latest
latest: Pulling from wa/tomcat9
8a29a15cefae: Already exists
974749c98d4f: Pull complete
32bfbcbfe866: Pull complete
b728187a4211: Pull complete
Digest: sha256:57d08218638d0c7cab441b4787e84396e17ae1b3a903d31629c0813dc2a63f9d
Status: Downloaded newer image for hub.huawei.com/wa/tomcat9:latest
hub.huawei.com/wa/tomcat9:latest
成功!