Harbor搭建
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由vmware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry 服务器,Harbor提供 了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控,另外, Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
1、Harbor功能官方介绍
基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间( project)里有不同的权限。
镜像复制:镜像可以在多个Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker 镜像仓库,管理项目和命名空间。
AD/LDAP支持:Harbor 可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来
RESTful API- RESTfulAPI:提供给管理员对于Harbor更多的操控,使得与其它管理软件集成变得更容易。
部署简单:提供在线和离线两种安装工具。
nginx:harbor 的一个反向代理组件,代理registry ui、 token 等服务。这个代理会转发harbor web和docker client的各种请求到后端服务上。harbor-adminserver:harbor 系统管理接口,可以修改系统配置以及获取系统信息。harbor-db:存储项目的元数据、用户、规则、复制策略等信息。harbor-jobservice:harbor 里面主要是为了镜像仓库之前同步使用的。harbor-log:收集其他harbor的日志信息。harbor-ui:一个用户界面模块,用来管理registry。registry:存储docker images的服务,并且提供pull/push服务。redis:存储缓存信息webhook:当registry 中的image状态发生变化的时候去记录更新日志、复制等操作。token service:在docker client进行pull/push的时候负责token的发放。
2、安装前的准备
在安装之前需要满足是否安装了docker-compose、docker以及python2.7以上还有openssl,centos7以上版本都自带了python和openssl。所以我们先从docker-compose以及docker安装部署开始说起吧!
3、部署Docker-compose
1、安装所需依赖yum install py-pip python-dev libffi-dev openssl-dev gcc libc-dev make -y2、运行以下命令下载Docker Compose的当前稳定版本curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose3、将可执行权限应用于二进制文件chmod +x /usr/local/bin/docker-compose4、测试是否安装成功$ docker-compose --versiondocker-compose version 1.27.4, build 40524192#详细参考官方安装文档https://docs.docker.com/compose/install/#install-compose
4、部署Docker
#详细请参考此文档https://www.runoob.com/docker/centos-docker-install.html
5、部署Harbor和配置HTTPS
一、下载harbor离线包去https://github.com/goharbor/harbor/releases 到github官网上下载offline离线包,上传到所需安装的机器上[root@harbor src]# ll总用量 543096-rw-r--r--. 1 root root 556130191 10月 27 09:47 harbor-offline-installer-v2.1.0.tgz二、解压Harbor安装包[root@harbor src]# tar xf harbor-offline-installer-v2.1.0.tgz[root@harbor src]# mv harbor /usr/local/三、配置HTTPS#创建目录mkdir /data/harbor/cert -pcd /data/harbor/cert#配置证书颁发机构1.生成CA证书私钥openssl genrsa -out ca.key 40962.生成CA证书openssl req -x509 -new -nodes -sha512 -days 3650 \-subj "/C=CN/ST=Shanghai/L=Shanghai/O=xxg/OU=myharbor/CN=xujun.com" \-key ca.key \-out ca.crt字段含义:C:国家ST:省份L:城市O:组织单位OU:其他内容CN:一般填写域名配置服务器证书1、生成私钥openssl genrsa -out xujun.com.key 40962、生成证书签名请求(CSR)openssl req -sha512 -new \-subj "/C=CN/ST=Shanghai/L=Shanghai/O=xxg/OU=myharbor/CN=xujun.com" \-key xujun.com.key \-out xujun.com.csr3、生成x509 v3扩展文件cat > v3.ext <<-EOFauthorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSEkeyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEnciphermentextendedKeyUsage = serverAuthsubjectAltName = @alt_names[alt_names]DNS.1=xujun.comDNS.2=xujunDNS.3=harborEOF4、使用v3.ext文件为harbor主机生成证书openssl x509 -req -sha512 -days 3650 \-extfile v3.ext \-CA ca.crt -CAkey ca.key -CAcreateserial \-in xujun.com.csr \-out xujun.com.crt5、提供证书给Harbor和Dockeropenssl x509 -inform PEM -in xujun.com.crt -out xujun.com.certmkdir -p /etc/docker/certs.d/xujun.com/cp /data/harbor/cert/xujun.com.crt /etc/docker/certs.d/xujun.com/四、配置harbor修改如下配置:hostname: xujun.comhttps:# https port for harbor, default is 443port: 443# The path of cert and key files for nginxcertificate: /data/harbor/cert/xujun.com.crtprivate_key: /data/harbor/cert/xujun.com.keydata_volume: /data/harbor五、安装harborcd /usr/local/harborcp -a harbor.yml.tmpl harbor.yml./install.sh六、访问添加解析,修改hosts192.168.1.100 xujun.com访问https://xujun.com
6、配置Harbor高可用
高可用实现方式:

Harbor支持基于策略的Docker镜像复制功能,这类似于MySQL的主从同步,其可以实现不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,已经有用很多互联网公司使用
harbor搭建内网docker仓库的案例,并且还有实现了双向复制的案列,本文将实现双向复制的部署:
#首先需要搭建两台Harbor服务,具体的部署过程请参考前面的,这里就不详细说明了,直接进入如何配置双向复制
- 双向复制是基于你的项目上的,所以我们先创建一个新的项目(101上面)


- 我们在另外一台harbor上面也要创建一个一模一样的项目名称

- 然后我们点击仓库管理,创建新的仓库名称


- 点击复制管理,然后在点击新建规则


以上10.0.0.101已完成复制功能的操作,现在我们来完成102的操作吧,大致过程一致,只需要IP地址修改一下即可


好了,到此为止,双复制的配置就完成了,现在让我们来测试一下吧!
#1、登陆的时候,会提示这个是不安全的仓库,这边我们需要修改docker的系统文件[root@docker-100 ~]# docker login http://10.0.0.101Username: adminPassword:Error response from daemon: Get https://10.0.0.101/v2/: dial tcp 10.0.0.101:443: getsockopt: connection refused[root@docker-100 ~]# cat /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd --insecure-registry 10.0.0.101 --insecure-registry 10.0.0.102 #新增两个私有仓库即可[root@docker-100 ~]# systemctl daemon-reload[root@docker-100 ~]# systemctl restart docker#2、上次镜像至harbor101[root@docker-100 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZExxg/alpine-nginx v1 7205d7afd77d 6 hours ago 199MB[root@docker-100 ~]# docker tag xxg/alpine-nginx:v1 10.0.0.101/xxg/xxg/alpine-nginx:v1、说明:修改images的名称,不修改成指定格式无法将镜像上传到harbor仓库,格式为:harbor IP/项目名/image名字:版本号[root@docker-100 ~]# docker push 10.0.0.101/xxg/xxg/alpine-nginx:v1The push refers to repository [10.0.0.101/xxg/xxg/alpine-nginx]a4fd258650c6: Pushedab44fa6c34ac: Pushedc04d1437198b: Pushedv1: digest: sha256:68cf189050d1531f121be659654ce43395573ecde182c56571b0052cbc26374a size: 948
- 我们可以看到harbor(10.0.0.101)上已经上传了之前的镜像

- 我们可以看一下harbor(10.0.0.102)是否已经同步

- 可以看到已经复制成功,接下来我们在测试一下传到102,101是否可以同步呢?
[root@docker-100 ~]# docker logout 10.0.0.101 #退出之前的101Removing login credentials for 10.0.0.101[root@docker-100 ~]# docker login 10.0.0.102 #登陆102Username: adminPassword:Login Succeeded[root@docker-100 ~]# docker tag centos:latest 10.0.0.102/xxg/centos:latest[root@docker-100 ~]# docker push 10.0.0.102/xxg/centos:latestThe push refers to repository [10.0.0.102/xxg/centos]2653d992f4ef: Pushedlatest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529
- 我们可以看到102上面已经上传了centos镜像

- 那101有木有镜像呢?

到此为止,harbor的双向复制就算是完成了。
