Harbor是VMware公司开源的企业级Docker Registry 项目,可以帮助用户快速搭建企业级Docker Registry仓库服务。它以开源的Registry为基础,提供管理UI,基于角色的访问控制,AD/LDAP集成,审计日志等企业用户需求的功能。提升了用户使用Registry构建和运行环境传输镜像的效率。
ps:AD活动目录,企业用户和进程进行管理的。
1)基于角色控制:用户和项目都是基于项目进行组织的。而用户基于项目可以拥有不同的权限。
2)基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。适用于负载均衡、高可用性、多数据中心、混合和多云场景。
3)支持LDAP/AD:Harbor与现有的企业LDAP/AD集成,用于用户认证和管理。
4)图像删除和垃圾收集:镜像可以被删除,也可以回收镜像占用的空间。
5)图形UI:用户可以轻松浏览、搜索镜像仓库以及对项目进行管理。
6)审计:对存储库的所有操作都进行记录。
7)RESTfuIAPI:用于大多数管理操作的RESTfuIAPI,易于与外部系统集成。
1)Proxy:Harbor通过前置反向代理统一接收浏览器,将请求转发给后端不同服务器。
2)Registry:负责存储docker镜像,处理docker push/pull命令。对用户每次执行push/pull时进行token验证。
3)Core services:Harbor核心功能,提供以下服
*UI:提供图形界面,帮助用户管理Registry上的镜像和授权
*Webhook:及时获取镜像变化状态工具
*Token:对pish/pull等操作进行用户验证
4)Database:为core service提供数据库服务,储存用户权限,审计日志等
5)Log collector:收集其他组件的日志,方便日后分析
ps:Harbor每个组件都是以Docker容器形式构建的,所以需要使用docker-compose
两台主机安装(master、slave)docker、docker-compose、harbor
一台机子(ldns-nfs)做docker、nfs共享,dns轮询负载均衡
[root@master ~]# hostnamectl set-hostname master
[root@master ~]# bash
[root@master ~]# hostnamectl set-hostname slave
[root@master ~]# bash
[root@master ~]# hostnamectl set-hostname ldns-nfs
[root@master ~]# bash
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# yum makecache fastyum makecache fast
[root@docker ~]# yum -y install wget
[root@docker ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@docker ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@docker ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@docker ~]# yum -y install docker-ce
[root@docker ~]# service docker start
sudo mkdir -p /etc/docker //一般都有,就不用创建了
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://naa7mog3.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker info 查看
[root@master ~]# mv docker-compose /usr/bin/
[root@master ~]# chmod +x /usr/bin/docker-compose
[root@master ~]# docker-compose -version
[root@ldns-nfs ~]# mkdir -p /data/nfs
[root@ldns-nfs ~]# yum -y install nfs-utils rpcbind
[root@ldns-nfs ~]# vim /etc/exports
/data/nfs 192.168.9.0/24(rw,no_root_squash)
[root@ldns-nfs ~]# systemctl restart rpcbind
[root@ldns-nfs ~]# systemctl restart nfs
两台主从部署
[root@master ~]# yum -y install nfs-utils rpcbind
[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl start nfs
[root@master ~]# showmount -e 192.168.9.11
[root@master ~]# mount 192.168.9.11:/data/nfs /data/storage/
[root@master ~]# df -hT
[root@master ~]# vim /etc/fstab
192.168.9.11:/data/nfs /data/storage nfs4 defaults,_netdev 0 0
[root@ldns-nfs ~]# docker pull redis:alpine
[root@ldns-nfs ~]# docker pull postgres
[root@ldns-nfs ~]# docker pull mysql:5.6
[root@ldns-nfs ~]# docker run -itd --name redis_test -p 6379:6379 redis:alpine
[root@ldns-nfs ~]# docker run -itd --name postgres_test -p 5432:5432 -e POSTGRES_PASSWORD=123123 postgres:latest
[root@ldns-nfs ~]# docker run -itd --name mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6 --character-set-server=utf8
若出现报错:WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方法:
[root@ldns-nfs ~]# vim /usr/lib/sysctl.d/00-system.conf
net.ipv4.ip_forward=1
[root@ldns-nfs ~]# systemctl restart network && systemctl restart docker
改名字:
[root@ldns-nfs ~]# docker rename postgres_test clair_db
[root@ldns-nfs ~]# docker rename mysql_test harbor_db
[root@ldns-nfs ~]# docker rename redis_test session
[root@master ~]# tar xf harbor-offline-installer-v1.5.0.tgz
下载数据库,连接nfs容器数据库并导入文件registry.sql
[root@master ~]# yum -y insatall mariadb
[root@master ~]# mysql -uroot -p123123 -h192.168.9.11 -P3306
[root@master ~]# mysql -uroot -p123123 -h192.168.9.11 -P3306 < harbor/ha/registry.sql
报错解决方式:
[root@master ha]# vim registry.sql
220 repository varchar(254) NOT NULL,
291 resource_name varchar(254),
修改docker-compose.yml配置文件
[root@master harbor]# vim ha/docker-compose.yml
19 - /data/storage:/storage:z
修改harbor.cfg配置文件
[root@master harbor]# vim harbor.cfg
7 hostname = www.hannibal.com
11 ui_url_protocol = https
23 ssl_cert = /etc/ssl/harbor/www.hannibal.com.crt
24 ssl_cert_key = /etc/ssl/harbor/www.hannibal.com.key
68 harbor_admin_password = Harbor12345
130 db_host = 192.168.9.11
133 db_password = 123123
136 db_port = 3306
139 db_user = root
145 redis_url = 192.168.9.11:6379
150 clair_db_host = 192.168.9.11
154 clair_db_password = 123123
157 clair_db_port = 5432
160 clair_db_username = postgres
163 clair_db = postgres
[root@slave harbor]# yum -y install opssl
[root@master harbor]# mkdir -p /data/ssl
[root@slave harbor]# cd /data/ssl
[root@master ssl]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
生成签名证书
[root@master ssl]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.hannibal.com.key -out www.hannibal.com.csr
生成注册表主机的证书
[root@master ~]# openssl x509 -req -days 365 -in www.hannibal.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.hannibal.com.crt
将自签ca添加到系统信任
[root@master ssl]# cp www.hannibal.com.crt /etc/pki/ca-trust/source/anchors/
立即生效
[root@master ssl]# update-ca-trust extract
[root@master ssl]# update-ca-trust enable
创建harbor证书目录,并复制
[root@master ssl]# mkdir -p /etc/ssl/harbor
[root@master ssl]# cp /data/ssl/www.hannibal.com.key /etc/ssl/harbor/
[root@master ssl]# cp /data/ssl/www.hannibal.com.crt /etc/ssl/harbor/
[root@master ssl]# ll /etc/ssl/harbor/
[root@master ]# cd harbor/
[root@master harbor]# ./install.sh --with-clair --ha
[root@master harbor]# docker-compose ps
访问192.168.9.9
点高级,继续。
用户:admin
密码:Harbor12345
使用安装docker主机连接测试,这里我们使用ldns-nfs主机测试。
[root@ldns-nfs ~]# vim /etc/hosts
192.168.9.9 www.hannibal.com
将master主机的证书发送给测试机
[root@master harbor]# scp www.hannibal.com.crt 192.168.9.11:/etc/pki/ca-trust/source/anchors/
测试机立即设置生效
[root@ldns-nfs ~]# update-ca-trust enable
[root@ldns-nfs ~]# update-ca-trust extract
[root@ldns-nfs ~]# systemctl restart docker
开启容器
[root@ldns-nfs ~]# docker start ea0
ea0
[root@ldns-nfs ~]# docker start 827
827
[root@ldns-nfs ~]# docker start e3e
e3e
登录harbor
[root@ldns-nfs ~]# docker login www.hannibal.com
username:admin
password:Harbor12345
上传镜像到仓库中的项目中
[root@ldns-nfs ~]# docker images
[root@ldns-nfs ~]# docker tag redis:alpine www.hannibal.com/library/redis
[root@ldns-nfs ~]# docker push www.hannibal.com/library/redis
ps:
别忘了若想使用http修改docker启动文件
[root@ldns-nfs ~]# vim /usr/lib/systemd/system/docker.service
13 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containe rd.sock --insecure-registry 192.168.9.9
[root@ldns-nfs ~]# systemctl restart docker
部署docker-ce
阿里云镜像加速器
上传Harbor压缩包解压。
[root@slave harbor]# cd harbor
[root@slave harbor]# vim ha/docker-compose.yml
19 - /data/storage:/storage:z
修改harbor.cfg配置文件
[root@slave harbor]# vim harbor.cfg
7 hostname = www.hannibal.com
11 ui_url_protocol = https
23 ssl_cert = /etc/ssl/harbor/www.hannibal.com.crt
24 ssl_cert_key = /etc/ssl/harbor/www.hannibal.com.key
68 harbor_admin_password = Harbor12345
130 db_host = 192.168.9.11
133 db_password = 123123
136 db_port = 3306
139 db_user = root
145 redis_url = 192.168.9.11:6379
150 clair_db_host = 192.168.9.11
154 clair_db_password = 123123
157 clair_db_port = 5432
160 clair_db_username = postgres
163 clair_db = postgres
[root@slave ~]# mkdir /etc/ssl/harbor
[root@slave ~]# cd /etc/ssl/harbor/
[root@slave harbor]# scp 192.168.9.9:/etc/ssl/harbor/www.hannibal.com.* ./
[root@slave harbor]# ls
www.hannibal.com.crt www.hannibal.com.key
[root@slave harbor]# cp www.hannibal.com.crt /etc/pki/ca-trust/source/anchors/
[root@slave harbor]# update-ca-trust extract
[root@slave harbor]# update-ca-trust enable
[root@slave harbor]# cd
[root@slave ~]# cd harbor/
[root@slave harbor]# ./install.sh --with-clair --ha
yes
[root@ldns-nfs ~]# docker pull busybox
[root@ldns-nfs ~]# docker tag busybox:latest www.hannibal.com/library/busybox
[root@ldns-nfs ~]# docker push www.hannibal.com/library/busybox
主从都有了。
两个Harbor都有了
再上传时,可以修改docker tag 改成abc,就可以添加到abc项目了。
可以修改hosts文件指定为备库实现高可用
[root@ldns-nfs ~]# vim /etc/hosts
192.168.9.10 www.hannibal.com
[root@ldns-nfs ~]# docker logout
[root@ldns-nfs ~]# docker login www.hannibal.com
[root@ldns-nfs ~]# docker push www.hannibal.com/library/busybox
可以上传,高可用完成
[root@ldns-nfs ~]# yum -y install bind
[root@ldns-nfs ~]# vim /etc/named.conf
options {
directory "/var/named";
};
zone "hannibal.com" IN {
type master;
file "hannibal.zheng";
};
[root@ldns-nfs ~]# vim /var/named/hannibal.zheng
[root@ldns-nfs ~]# systemctl start named
[root@ldns-nfs ~]# vim /etc/resolv.conf
2 nameserver 192.168.9.11
[root@ldns-nfs ~]# nslookup www.hannibal.com
1)NFS单点问题
2)镜像太多导致占用大量的磁盘空间及镜像访问磁盘io压力大
解决方案
1)NFS 做成高可用 NFS+DRBD+Heartbeat
2)存储使用分布式文件系统(GlusterFS)
3)Harbor支持主从复制(双向) + Keepalived (类似第一种解决方案,但是使用服务器数量少)
[root@ldns-nfs ~]# docker logout
[root@ldns-nfs ~]# docker login www.hannibal.com
[root@master ~]# cd harbor/
[root@master harbor]# docker-compose stop | start | restart
[root@master harbor]# docker-compose down -v //先关闭所有Harbor实例
[root@master harbor]# vim harbor.cfg
[root@master harbor]# ./prepare //适配更改配置文件
[root@master harbor]# docker-compose up -d //启动Harbor
[root@master harbor]# docker-compose down -v
[root@master harbor]# rm -r /data/database
[root@master harbor]# rm -r /data/registry
配置https,具体操作看前面部署。
详见前面Harbor部署