harbor简介
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
harbor组件
Harbor在架构上主要由6个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。 Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。 Core services: 这是Harbor的核心功能,主要提供以下服务: UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。 webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。 token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。 Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。 Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。 Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析
Harbor实现组成
[root@localhost harbor]# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------- harbor-adminserver /harbor/start.sh Up (healthy) harbor-core /harbor/start.sh Up (healthy) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy)
每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,这个模板文件写明,Harbor是由7个容器组成的;
nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。 harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的; harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口; registry:registry就是docker原生的仓库,负责保存镜像。 harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。 这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。 harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中; harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
服务器准备
主机 |
系统及配置 |
docker版本 |
docker-compose版本 |
harbor版本 |
192.168.0.201(主) |
centos7.2 2核2G 30G盘 |
18.09.5 |
1.24.0 | 1.7.5 |
192.168.0.202(从) |
centos7.2 2核2G 30G盘 |
18.09.5 | 1.24.0 | 1.7.5 |
安装centos7.2系统,最小化安装
设置好网络和防火墙 网络需要能访问外网,
ip 192.168.0.201(主) 192.168.0.202(从)
下面关闭防火墙
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/g' /etc/sysconfig/selinux
设置yum源
cd /etc/yum.repos.d/
yum install vim unzip lrzsz wget net-tools -y
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install epel-release
安装docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
yum clean all && yum makecache fast
yum install docker-ce -y
systemctl enable docker && systemctl restart docker
修改docker启动文件并重启docker
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.0.201 #修改此处增加橙色内容(后面ip可换成域名)
systemctl daemon-reload
systemctl restart docker
[root@localhost harbor]# docker version Client: Version: 18.09.5 API version: 1.39 Go version: go1.10.8 Git commit: e8ff056 Built: Thu Apr 11 04:43:34 2019 OS/Arch: linux/amd64 Experimental: false
安装docker-compose
yum install python-pip -y
pip install --upgrade pip
pip install docker-compose #默认最新版本,可以使用 docker-compose==version指定安装版本
docker-compose -version
[root@localhost harbor]# docker-compose -v docker-compose version 1.24.0, build 0aa5906
安装Harbor
harbor有offline和online两种,这里选offline,下载地址https://github.com/goharbor/harbor/releases
wget方式无法正常下载或者速度超慢,建议先用浏览器下载 然后上传到两个机器,
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz
cd /home
tar xf harbor-offline-installer-v1.7.5.tgz.tar
cd harbor/
修改配置文件
多数信息无需更改,把hostname变成自己的域名或者ip即可,其他可以保持不变,/data/cert 目录自行需要创建。
mkdir -p /data/cert
vim harbor.cfg
[root@localhost harbor]# cat harbor.cfg |grep -v "^#"|grep -v "^$"
_version = 1.7.0 hostname = 192.168.0.201 ui_url_protocol = http max_job_workers = 10 customize_crt = on ssl_cert = /data/cert/server.crt ssl_cert_key = /data/cert/server.key secretkey_path = /data admiral_url = NA log_rotate_count = 50 log_rotate_size = 200M http_proxy = https_proxy = no_proxy = 127.0.0.1,localhost,core,registry email_identity = email_server = smtp.mydomain.com email_server_port = 25 email_username = [email protected] email_password = abc email_from = adminemail_ssl = false email_insecure = false harbor_admin_password = Harbor12345 auth_mode = db_auth ldap_url = ldaps://ldap.mydomain.com ldap_basedn = ou=people,dc=mydomain,dc=com ldap_uid = uid ldap_scope = 2 ldap_timeout = 5 ldap_verify_cert = true ldap_group_basedn = ou=group,dc=mydomain,dc=com ldap_group_filter = objectclass=group ldap_group_gid = cn ldap_group_scope = 2 self_registration = on token_expiration = 30 project_creation_restriction = everyone db_host = postgresql db_password = root123 db_port = 5432 db_user = postgres redis_host = redis redis_port = 6379 redis_password = redis_db_index = 1,2,3 clair_db_host = postgresql clair_db_password = root123 clair_db_port = 5432 clair_db_username = postgres clair_db = postgres clair_updaters_interval = 12 uaa_endpoint = uaa.mydomain.org uaa_clientid = id uaa_clientsecret = secret uaa_verify_cert = true uaa_ca_cert = /path/to/ca.pem registry_storage_provider_name = filesystem registry_storage_provider_config = registry_custom_ca_bundle =
执行安装
./install
执行命令,Harbor服务就会根据当期目录下的docker-compose.yml
开始下载依赖的镜像,检测并按照顺序依次启动各个服务
用docker-compose ps 命令查看
[root@localhost harbor]# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------------------------- harbor-adminserver /harbor/start.sh Up (healthy) harbor-core /harbor/start.sh Up (healthy) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy)
Harbor的启动和停止命令:
启动Harbor
# docker-compose start
停止Harbor
# docker-comose stop
重启Harbor
# docker-compose restart
================================
以上步骤两个机器都做
================================
然后浏览器登陆http://192.168.0.201/
账户密码是默认admin / Harbor12345
创建test01项目,非公开
如果是非公开模式,要使用docker login 192.168.0.201 登陆 才能上传下载镜像;
如果想其他机器直接访问拉取,可以设置为公开,docker pull 192.168.0.201/test01/busybox:latest 命令才不会出login的错误。
项目创建完成后,回到201服务器上,用命令操作镜像
下载nginx和busybox原始镜像
docker pull nginx
docker pull busybox
给镜像打test01项目标签
docker tag busybox:latest 192.168.0.201/test01/busybox:latest
docker tag nginx:latest 192.168.0.201/test01/nginx:latest
接着登录 docker login 192.168.0.201
用admin,密码Harbor12345 Username (admin): admin Password: Login Succeeded
登陆后将镜像push到仓库
docker push 192.168.0.201/test01/nginx
docker push 192.168.0.201/test01/busybox
测试本地仓库中拉取镜像
docker pull 192.168.0.201/test01/nginx:latest
本机可以直接拉取
其他机器需要修改docker的配置 ,增加 --insecure-registry 192.168.0.201 然后重启docker才行
并且要求test01项目是设置为公开的,才能直接拉取,否则必须用docker login 192.168.0.201登录后才能拉取。
下面设置主从复制
从机器启动后,无需配置界面
主要在主机界面进行配置
仓库管理--新建目标--设置从仓库
然后 复制管理--新建规则
源项目是指主机器上要同步的项目,比如之前创建的test01
目标指的是 从机器
设置完成后 可以看到同步状态
然后打开从机器的web界面查看是否成功,这里看到已经成功同步
可参考文章:
https://www.cnblogs.com/panwenbin-logs/p/10218099.html
https://www.jianshu.com/p/4f9474081c8a
https://www.cnblogs.com/pangguoping/p/7650014.html
https://blog.51cto.com/10950710/2301257
Harbor配置TLS证书
上面对Harbor的配置都是使用的http协议访问,但是我们工作中一般都是配置https访问。
下面演示一下怎么配置Harbor可以使用https访问,以及配置TLS证书都需要做哪些工作。
下面是简要步骤,详细请结合自己项目调整。
1 修改harbor配置
hostname = docker-hub.vonechain.com ui_url_protocol = https customize_crt = on ssl_cert = /data/cert/server.crt ssl_cert_key = /data/cert/server.key
2 增加hosts解析
cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.0.201 docker-hub.vonechain.com
3 生成自签名证书
mkdir -p /data/cert
cd /data/cert/
生成key文件
openssl genrsa -out /data/cert/server.key 2048
生成crt文件 ##注意CN
openssl req -x509 -new -nodes -key /data/cert/server.key -subj "/CN=docker-hub.vonechain.com" -days 5000 -out /data/cert/server.crt
[root@localhost cert]# ll 总用量 8 -rw-r--r-- 1 root root 1135 4月 30 21:01 server.crt -rw-r--r-- 1 root root 1679 4月 30 21:00 server.key
4 执行安装harbor
cd /home/harbor
./install ##就会生成 https 连接了,https://docker-hub.vonechain.com.
Creating network "harbor_harbor" with the default driver Creating harbor-log ... done Creating harbor-db ... done Creating harbor-adminserver ... done Creating redis ... done Creating registryctl ... done Creating registry ... done Creating harbor-core ... done Creating harbor-portal ... 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 https://docker-hub.vonechain.com. For more details, please visit https://github.com/goharbor/harbor .
然后,windows访问https://docker-hub.vonechain.com
需要添加本地hosts,界面配置test01项目并设置公开 然后在本机上作一些镜像上传
docker pull busybox
docker tag busybox:latest docker-hub.vonechain.com/test01/busybox:latest
docker login -u admin -p 'Harbor12345' docker-hub.vonechain.com
docker push docker-hub.vonechain.com/test01/busybox:latest
5 配置客户端 192.168.0.88
安装docker
yum install docker -y
增加hosts解析
192.168.0.201 docker-hub.vonechain.com
创建证书目录
mkdir -p /etc/docker/certs.d/docker-hub.vonechain.com
回到harbor主机上把crt文件复制过去
scp server.crt [email protected]:/etc/docker/certs.d/docker-hub.vonechain.com/
重启客户端docker
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry docker-hub.vonechain.com
systemctl restart docker
执行拉取镜像
docker pull docker-hub.vonechain.com/test01/busybox:latest
[root@localhost ~]# docker pull docker-hub.vonechain.com/test01/busybox:latest Trying to pull repository docker-hub.vonechain.com/test01/busybox ... latest: Pulling from docker-hub.vonechain.com/test01/busybox fc1a6b909f82: Pull complete Digest: sha256:f79f7a10302c402c052973e3fa42be0344ae6453245669783a9e16da3d56d5b4 Status: Downloaded newer image for docker-hub.vonechain.com/test01/busybox:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-hub.vonechain.com/test01/busybox latest af2f74c517aa 3 weeks ago 1.2 MB
到此https模式可用了,所有客户端机器必须用ssl证书才能访问harbor
可参考:https://www.cnblogs.com/pangguoping/p/7650014.html