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更多的操控,使得与其它管理软件集成变得更容易。

部署简单:提供在线和离线两种安装工具。

  1. nginxharbor 的一个反向代理组件,代理registry ui token 等服务。这个代理会转发harbor webdocker client的各种请求到后端服务上。
  2. harbor-adminserverharbor 系统管理接口,可以修改系统配置以及获取系统信息。
  3. harbor-db:存储项目的元数据、用户、规则、复制策略等信息。
  4. harbor-jobserviceharbor 里面主要是为了镜像仓库之前同步使用的。
  5. harbor-log:收集其他harbor的日志信息。
  6. harbor-ui:一个用户界面模块,用来管理registry
  7. registry:存储docker images的服务,并且提供pull/push服务。
  8. redis:存储缓存信息
  9. webhook:当registry 中的image状态发生变化的时候去记录更新日志、复制等
  10. 操作。
  11. token service:在docker client进行pull/push的时候负责token的发放。

2、安装前的准备

在安装之前需要满足是否安装了docker-compose、docker以及python2.7以上还有openssl,centos7以上版本都自带了python和openssl。所以我们先从docker-compose以及docker安装部署开始说起吧!

3、部署Docker-compose

  1. 1、安装所需依赖
  2. yum install py-pip python-dev libffi-dev openssl-dev gcc libc-dev make -y
  3. 2、运行以下命令下载Docker Compose的当前稳定版本
  4. curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  5. 3、将可执行权限应用于二进制文件
  6. chmod +x /usr/local/bin/docker-compose
  7. 4、测试是否安装成功
  8. $ docker-compose --version
  9. docker-compose version 1.27.4, build 40524192
  10. #详细参考官方安装文档
  11. https://docs.docker.com/compose/install/#install-compose

4、部署Docker

  1. #详细请参考此文档
  2. https://www.runoob.com/docker/centos-docker-install.html

5、部署Harbor和配置HTTPS

  1. 一、下载harbor离线包
  2. https://github.com/goharbor/harbor/releases 到github官网上下载offline离线包,上传到所需安装的机器上
  3. [root@harbor src]# ll
  4. 总用量 543096
  5. -rw-r--r--. 1 root root 556130191 10 27 09:47 harbor-offline-installer-v2.1.0.tgz
  6. 二、解压Harbor安装包
  7. [root@harbor src]# tar xf harbor-offline-installer-v2.1.0.tgz
  8. [root@harbor src]# mv harbor /usr/local/
  9. 三、配置HTTPS
  10. #创建目录
  11. mkdir /data/harbor/cert -p
  12. cd /data/harbor/cert
  13. #配置证书颁发机构
  14. 1.生成CA证书私钥
  15. openssl genrsa -out ca.key 4096
  16. 2.生成CA证书
  17. openssl req -x509 -new -nodes -sha512 -days 3650 \
  18. -subj "/C=CN/ST=Shanghai/L=Shanghai/O=xxg/OU=myharbor/CN=xujun.com" \
  19. -key ca.key \
  20. -out ca.crt
  21. 字段含义:
  22. C:国家
  23. ST:省份
  24. L:城市
  25. O:组织单位
  26. OU:其他内容
  27. CN:一般填写域名
  28. 配置服务器证书
  29. 1、生成私钥
  30. openssl genrsa -out xujun.com.key 4096
  31. 2、生成证书签名请求(CSR
  32. openssl req -sha512 -new \
  33. -subj "/C=CN/ST=Shanghai/L=Shanghai/O=xxg/OU=myharbor/CN=xujun.com" \
  34. -key xujun.com.key \
  35. -out xujun.com.csr
  36. 3、生成x509 v3扩展文件
  37. cat > v3.ext <<-EOF
  38. authorityKeyIdentifier=keyid,issuer
  39. basicConstraints=CA:FALSE
  40. keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  41. extendedKeyUsage = serverAuth
  42. subjectAltName = @alt_names
  43. [alt_names]
  44. DNS.1=xujun.com
  45. DNS.2=xujun
  46. DNS.3=harbor
  47. EOF
  48. 4、使用v3.ext文件为harbor主机生成证书
  49. openssl x509 -req -sha512 -days 3650 \
  50. -extfile v3.ext \
  51. -CA ca.crt -CAkey ca.key -CAcreateserial \
  52. -in xujun.com.csr \
  53. -out xujun.com.crt
  54. 5、提供证书给HarborDocker
  55. openssl x509 -inform PEM -in xujun.com.crt -out xujun.com.cert
  56. mkdir -p /etc/docker/certs.d/xujun.com/
  57. cp /data/harbor/cert/xujun.com.crt /etc/docker/certs.d/xujun.com/
  58. 四、配置harbor
  59. 修改如下配置:
  60. hostname: xujun.com
  61. https:
  62. # https port for harbor, default is 443
  63. port: 443
  64. # The path of cert and key files for nginx
  65. certificate: /data/harbor/cert/xujun.com.crt
  66. private_key: /data/harbor/cert/xujun.com.key
  67. data_volume: /data/harbor
  68. 五、安装harbor
  69. cd /usr/local/harbor
  70. cp -a harbor.yml.tmpl harbor.yml
  71. ./install.sh
  72. 六、访问
  73. 添加解析,修改hosts
  74. 192.168.1.100 xujun.com
  75. 访问https://xujun.com

6、配置Harbor高可用

高可用实现方式:

image.png

Harbor支持基于策略的Docker镜像复制功能,这类似于MySQL的主从同步,其可以实现不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,已经有用很多互联网公司使用
harbor搭建内网docker仓库的案例,并且还有实现了双向复制的案列,本文将实现双向复制的部署:

  1. #首先需要搭建两台Harbor服务,具体的部署过程请参考前面的,这里就不详细说明了,直接进入如何配置双向复制
  • 双向复制是基于你的项目上的,所以我们先创建一个新的项目(101上面)

image-20210120230213361.png

image-20210120230408060.png

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

image-20210120230521392.png

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

image-20210120230725406.png

image-20210120233708497.png

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

image-20210120233746914.png

image-20210120233822800.png

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

image-20210120234132100.png

image-20210120234154526.png

好了,到此为止,双复制的配置就完成了,现在让我们来测试一下吧!

  1. #1、登陆的时候,会提示这个是不安全的仓库,这边我们需要修改docker的系统文件
  2. [root@docker-100 ~]# docker login http://10.0.0.101
  3. Username: admin
  4. Password:
  5. Error response from daemon: Get https://10.0.0.101/v2/: dial tcp 10.0.0.101:443: getsockopt: connection refused
  6. [root@docker-100 ~]# cat /usr/lib/systemd/system/docker.service
  7. ExecStart=/usr/bin/dockerd --insecure-registry 10.0.0.101 --insecure-registry 10.0.0.102 #新增两个私有仓库即可
  8. [root@docker-100 ~]# systemctl daemon-reload
  9. [root@docker-100 ~]# systemctl restart docker
  10. #2、上次镜像至harbor101
  11. [root@docker-100 ~]# docker images
  12. REPOSITORY TAG IMAGE ID CREATED SIZE
  13. xxg/alpine-nginx v1 7205d7afd77d 6 hours ago 199MB
  14. [root@docker-100 ~]# docker tag xxg/alpine-nginx:v1 10.0.0.101/xxg/xxg/alpine-nginx:v1
  15. 说明:修改images的名称,不修改成指定格式无法将镜像上传到harbor仓库,格式为:harbor IP/项目名/image名字:版本号
  16. [root@docker-100 ~]# docker push 10.0.0.101/xxg/xxg/alpine-nginx:v1
  17. The push refers to repository [10.0.0.101/xxg/xxg/alpine-nginx]
  18. a4fd258650c6: Pushed
  19. ab44fa6c34ac: Pushed
  20. c04d1437198b: Pushed
  21. v1: digest: sha256:68cf189050d1531f121be659654ce43395573ecde182c56571b0052cbc26374a size: 948
  • 我们可以看到harbor(10.0.0.101)上已经上传了之前的镜像

image-20210121000026302.png

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

image-20210121000111136.png

  • 可以看到已经复制成功,接下来我们在测试一下传到102,101是否可以同步呢?
  1. [root@docker-100 ~]# docker logout 10.0.0.101 #退出之前的101
  2. Removing login credentials for 10.0.0.101
  3. [root@docker-100 ~]# docker login 10.0.0.102 #登陆102
  4. Username: admin
  5. Password:
  6. Login Succeeded
  7. [root@docker-100 ~]# docker tag centos:latest 10.0.0.102/xxg/centos:latest
  8. [root@docker-100 ~]# docker push 10.0.0.102/xxg/centos:latest
  9. The push refers to repository [10.0.0.102/xxg/centos]
  10. 2653d992f4ef: Pushed
  11. latest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529
  • 我们可以看到102上面已经上传了centos镜像

image-20210121000620091.png

  • 那101有木有镜像呢?

image-20210121000643429.png

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