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 -y
2、运行以下命令下载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-compose
3、将可执行权限应用于二进制文件
chmod +x /usr/local/bin/docker-compose
4、测试是否安装成功
$ docker-compose --version
docker-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 -p
cd /data/harbor/cert
#配置证书颁发机构
1.生成CA证书私钥
openssl genrsa -out ca.key 4096
2.生成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 4096
2、生成证书签名请求(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.csr
3、生成x509 v3扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=xujun.com
DNS.2=xujun
DNS.3=harbor
EOF
4、使用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.crt
5、提供证书给Harbor和Docker
openssl x509 -inform PEM -in xujun.com.crt -out xujun.com.cert
mkdir -p /etc/docker/certs.d/xujun.com/
cp /data/harbor/cert/xujun.com.crt /etc/docker/certs.d/xujun.com/
四、配置harbor
修改如下配置:
hostname: xujun.com
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/harbor/cert/xujun.com.crt
private_key: /data/harbor/cert/xujun.com.key
data_volume: /data/harbor
五、安装harbor
cd /usr/local/harbor
cp -a harbor.yml.tmpl harbor.yml
./install.sh
六、访问
添加解析,修改hosts
192.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.101
Username: admin
Password:
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.service
ExecStart=/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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
xxg/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:v1
The push refers to repository [10.0.0.101/xxg/xxg/alpine-nginx]
a4fd258650c6: Pushed
ab44fa6c34ac: Pushed
c04d1437198b: Pushed
v1: 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 #退出之前的101
Removing login credentials for 10.0.0.101
[root@docker-100 ~]# docker login 10.0.0.102 #登陆102
Username: admin
Password:
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:latest
The push refers to repository [10.0.0.102/xxg/centos]
2653d992f4ef: Pushed
latest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529
- 我们可以看到102上面已经上传了centos镜像
- 那101有木有镜像呢?
到此为止,harbor的双向复制就算是完成了。