一、Harbor简介
1.Harbor介绍
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
2.Harbor特性
- 基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
- 镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
- 图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
- AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
- 审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
- RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
- 部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
3.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,供日后进行分析。
各个组件之间的关系如下图所示:
4.Harbor实现
Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;
# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/harbor_adminserver Up
harbor-db docker-entrypoint.sh mysqld Up 3306/tcp
harbor-jobservice /harbor/harbor_jobservice Up
harbor-log /bin/sh -c crond && rm -f ... Up 127.0.0.1:1514->514/tcp
harbor-ui /harbor/harbor_ui Up
nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
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 link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
二、安装部署
1、安装最新版的docker docker-compose
curl -fsSL https://get.docker.com/ | sh 或 yum install docker-ce-18.03.1.ce
curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
验证
docker version
docker-compose --version
2、安装harbor
登录下载相应版本的harbor
https://github.com/goharbor/harbor/releases
harbor-offline-installer-v1.8.1.tgz
解压
tar zxvf harbor-offline-installer-v1.8.1.tgz
编辑 harbor.yml然后执行./install.sh
安装完成后在浏览器使用 172.16.119.225即可登陆,如果用域名的话,可以配置nginx如下:
server {
listen 80;
server_name harbor.xxx.com;
location / {
proxy_pass http://172.16.119.225:80;
}
}
即可使用域名登陆,登陆账号密码在harbor.yml配置的,默认账号密码: admin / Harbor12345 登录后可修改密码。
Harbor的启动和停止
# 启动Harbor
docker-compose start
# 停止Harbor
docker-comose stop
# 重启Harbor
docker-compose restart
三、测试上传下载镜像
1、所有服务器修改docker客户端配置
vim /usr/lib/systemd/system/docker.service 增加 --insecure-registry=http://172.16.119.225:80 即可。
ExecStart=/usr/bin/dockerd --insecure-registry=http://172.16.119.225:80 #harbor.yml里配置的hostname值
重启docker
systemctl restart docker
或创建/etc/docker/daemon.json文件,在文件中指定仓库地址 ,然后重新docker
{
"insecure-registries":["172.16.119.225:80"]
}
2、创建Dockerfile
from docker.io/tomcat:latest
MAINTAINER zhangpan
RUN rm -rf /usr/local/openjdk-8
RUN rm -rf /usr/local/tomcat
COPY jdk1.8.0_92 /usr/local/jdk1.8.0_92
COPY tomcat /usr/local/tomcat
3、创建镜像
tag名称里 172.16.119.225:80/library/ 是不变的,172.16.119.225:80表示私库地址,library是仓库项目名,可以更改,但私库里要先创建好
docker build -t 172.16.119.225:80/library/tomcat:wuyun .
4、登录私库然后把镜像推送到Harbor仓库
docker push 172.16.119.225:80/library/tomcat:wuyun
如果不是自己创建的镜像,需要先执行 docker tags 给镜像做tag再推送,如:
docker pull flannel
docker tag quay.io/coreos/flannel:v0.11.0-amd64 172.16.119.225:80/library/flannel:v0.11.0-amd64
docker push 172.16.119.225:80/library/busybox:latest
删除这种同id不同tag的镜像
docker rmi 172.16.119.225:80/library/flannel:v0.11.0-amd64
5、登陆web页面查看镜像
6、在别的服务器上拉取镜像,服务器上要先更改好私库地址
四、Harbor配置TLS证书
参考文章:https://github.com/goharbor/harbor/blob/master/docs/configure_https.md
因为我们上面对Harbor的配置都是使用的http协议访问,但是我们工作中一般都是配置https访问。所以我给大家演示一下怎么配置Harbor可以使用https访问,以及配置TLS证书都需要做哪些工作。
因为Harbor默认使用http协议访问,所以我们这里在配置文件中,开启https配置;
1、编辑harbor.yml
http 和port前加上注释,同时取消https port certificate private_key前注释并修改证书路径
2、创建目录并生成ca文件
mkdir /etc/certs && cd /etc/certs/
openssl genrsa -out /etc/certs/ca.key 2048
3、创建自签名证书key文件,注意CN的值,更改和harbor.yml里hostname值一样即可
openssl req -x509 -new -nodes -key /etc/certs/ca.key -subj "/CN=172.16.119.225" -days 5000 -out /etc/certs/ca.crt
4、生成服务器端私钥和CSR签名请求
openssl genrsa -out 172.16.119.225.key 4096 #172.16.119.225是ip或者主机名
openssl req -sha512 -new -subj "/CN=172.16.119.225" -key 172.16.119.225.key -out 172.16.119.225.csr
5、签发服务器证书
创建文件v3.ext并生成crt文件
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=172.16.119.225
DNS.2=test-04
IP.1=172.16.119.225 #其他需要连接docker私库的服务器IP地址
IP.2=172.16.119.224
IP.3=172.16.119.223
IP.4=172.16.119.***
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in 172.16.119.225.csr -out 172.16.119.225.crt
全部证书生成后结果如下:
6、配置docker证书
为所有需要用https的 Docker服务器配置服务器证书,密钥和CA.
Docker守护程序将.crt
文件解释为CA证书,将.cert
文件解释为客户端证书。
将crt文件转换为cert文件
openssl x509 -inform PEM -in 172.16.119.225.crt -out 172.16.119.225.cert
将文件cert key和ca文件拷贝到 /etc/docker/certs.d/172.16.119.225 如果没有目录就新建,目录格式不能错。
# 如果如下目录不存在,请创建,如果有域名请按此格式依次创建
mkdir -p /etc/docker/certs.d/192.168.50.84
# mkdir -p /etc/docker/certs.d/[IP2]
# mkdir -p /etc/docker/certs.d/[example1.com]
# 如果端口为443,则不需要指定。如果为自定义端口,请指定端口
# /etc/docker/certs.d/yourdomain.com:port
mkdir -p /etc/docker/certs.d/172.16.119.225
cp 172.16.119.225.cert /etc/docker/certs.d/172.16.119.225
cp 172.16.119.225.key /etc/docker/certs.d/172.16.119.225
cp ca.crt /etc/docker/certs.d/172.16.119.225
7、重启docker然后为Harbor生成配置文件
systemctl restart docker
./prepare
如果Harbor已在运行,请停止并删除现有实例。然后重启实例
docker-compose down -v
docker-compose up -d
如果nginx无法启动且查看容器日志也查看不了,报如下错误
Error response from daemon: configured logging driver does not support reading
遇到此问题可以关注docker-compose.yml 以下选项是否对应
source: /data/cert/server.key
target: /etc/cert/server.key
source: /data/cert/server.crt
target: /etc/cert/server.crt
我这查看显示source 都是ca.crt,因为我复制错了,docker-compose.yml 是在./install 后映射的harbor.yml内容,所以更改harbor.yml后重新安装即可
8、测试
所有docker服务器先更改/etc/docker/daemon.json再重启docker
{
"insecure-registries":["172.16.119.225:443"]
}
然后docker login 172.16.119.225:443 如果提示x509: certificate signed by unknown authority错误,则需要添加主机信任,centos操作如下:
cp 172.16.119.225.crt /etc/pki/ca-trust/source/anchors/172.16.119.225.crt
update-ca-trust
再次登录即可,如果端口不是443端口,登录需要指明端口,如:docker login 172.16.119.225:9999
ps 删除 ~/.docker/config.json 文件内 auths内容可以删除登录记录
来源:oschina
链接:https://my.oschina.net/u/4271255/blog/3449991