一、Harbor

Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装,它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库【注:helm就相当于k8s的yum】。另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。
  
简单来说harbor就是VMWare公司提供的一个docker私有仓库构建程序,功能非常强大.

支持多租户签名和认证
支持安全扫描和风险分析
这次日志审计
基于角色的访问控制
支持可扩展的API和GUI
Image replication between instances
国际化做的很好(目前仅支持英文和中文)

二、安装部署harbor

部署harbor所需要的环境

harbor支持k8s的helm安装和本地安装,我这次先择的安装方式是本地安装。
1.需要安装docker并运行,harbor的运行依赖于docker服务
2.需要安装docker-compose,他可以把多容器运行构建出一个整体服务。harbor就是多个容器一起运行结果

curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

给docker-compose执行权限,运行命令:

chmod +x /usr/local/bin/docker-compose

检查,运行docker-compose --version,如下:

[root@server1 ~]# docker-compose --version
docker-compose version 1.23.2, build 1110ad01

安装

[root@server1 ~]# tar zxf harbor-offline-installer-v1.10.
[root@server1 ~]# cd harbor/
[root@server1 harbor]# ls
common.sh  harbor.v1.10.1.tar.gz  harbor.yml  install.sh  LICENSE  prepare

harbor.yml 就是harbor的配置文件,编辑harbor.yml,修改hostname、https证书路径、admin密码

helm 从仓库查找 helm 私有仓库_ubuntu

每次修改完配置文件后都需要运行

[root@server1 harbor]# ./prepare

运行 ./install.sh

[root@server1 harbor]# ./install.sh

helm 从仓库查找 helm 私有仓库_docker_02

常用管理命令,一定要在harbor目录中运行

停止服务: docker-compose stop
开始服务: docker-compose start
重启服务:docker-compose restart
停止服务并删除容器:docker-compose down
启动服务并运行容器:docker-compose up

制作证书

[root@server1 ~]# mkdir -p certs
[root@server1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/reg.westos.org.key -x509 -days 365 -out certs/reg.westos.org.crt
填写信息后打开certs目录即可看到证书:

[root@server1 ~]# cd certs/
[root@server1 certs]# ls
reg.westos.org.crt  reg.westos.org.key

三、GUIl界面使用

浏览器访问https://reg.westos.org:注意解析

helm 从仓库查找 helm 私有仓库_docker_03

这里的项目就是一私有化的Docker镜像仓库,默认的仓库是library。

四、本机上传拉取镜像

修改Docker配置

docker 默认是按 https 请求的
修改文件 /etc/docker/daemon.json,走非加密通道

[root@server1 harbor]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://ioeo57w5.mirror.aliyuncs.com"]
}
{
"insecure-registries": ["reg.westos.org"]
}

然后重启docker

systemctl daemon-reload 
systemctl restart docker

制作镜像

docker tag ubuntu:latest reg.westos.org/cl/ubuntu:latest

本机上传

首先登陆私有库

[root@server1 harbor]# docker login reg.westos.org
Username: admin
Password: 			
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store


Login Succeeded

接下来进行PUSH:

[root@server1 harbor]# docker push reg.westos.org/library/ubuntu
The push refers to repository [reg.westos.org/library/ubuntu]
16542a8fc3be: Pushed 
6597da2e2e52: Pushed 
977183d4e999: Pushed 
c8be1b8f4d60: Pushed 
latest: digest: sha256:e5dd9dbb37df5b731a6688fa49f4003359f6f126958c9c928f937bec6983

本机拉取

[root@server1 harbor]# docker rmi reg.westos.org/library/ubuntu		#删除原来的镜像
Untagged: reg.westos.org/library/ubuntu:latest
Untagged: reg.westos.org/library/ubuntu@sha256:e5dd9dbb37df5b731a6688fa49f4003359f6f126958c9c928f937bec69836320
[root@server1 harbor]# docker pull reg.westos.org/library/ubuntu			#拉取镜像
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:e5dd9dbb37df5b731a6688fa49f4003359f6f126958c9c928f937bec69836320
Status: Downloaded newer image for reg.westos.org/library/ubuntu:latest
reg.westos.org/library/ubuntu:latest

五、远程主机上传下载镜像

准备一台安装好docker的虚拟机server3
首先需要做解析:

[root@server2 ~]# cat /etc/hosts

172.25.63.3 server1 reg.westos.org

daemon文件配置:

[root@server2 ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://reg.westos.org"]
}

建立证书目录:

[root@server2 ~]#  mkdir -p /etc/docker/certs.d/reg.westos.org

把crt证书放到/etc/docker/certs.d/harbor.dinginfo.com目录下并命名为ca.crt:

[root@server2 ~]# ls /etc/docker/certs.d/reg.westos.org
ca.cr

然后,重启docker

systemctl daemon-reload
systemctl restart docker

再来登录:

[root@server2 ~]# docker login reg.westos.org
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

上传镜像:

[root@server2 ~]# docker tag nginx:latest reg.westos.org/library/nginx
[root@server2 ~]# docker push reg.westos.org/library/nginx

测试下载:

[root@server2 ~]# docker pull reg.westos.org/library/ubuntu

六、为harbor添加内容扫描

首先需要关闭之前的容器:

[root@server1 harbor]# docker-compose down

清理配置文件:

[root@server1 harbor]# ./prepare

加上内容信任,扫描器和helm仓库重新安装:

[root@server1 harbor]# ./install.sh --with-notary --with-clair --with-chartmuseum

刷新网页端可以看到多了一些配置:

helm 从仓库查找 helm 私有仓库_helm 从仓库查找_04

可以看到以前上传的镜像都是没有经过扫描的,可以对已经上传的镜像进行扫描:

helm 从仓库查找 helm 私有仓库_ubuntu_05

helm 从仓库查找 helm 私有仓库_ubuntu_06

也可以配置镜像上传的时候自动扫描:

helm 从仓库查找 helm 私有仓库_上传_07

测试上传镜像:

[root@server1 harbor]# docker push reg.westos.org/library/base-debian10

七、配置harbor内容签名

签名属于内容信任,没有签名的内容可以选择不部署。

helm 从仓库查找 helm 私有仓库_上传_08

可以看到刚上传的内容是没有签名的。

内容信任的服务端口是4443,接下来就进行harbor内容信任的配置:
1.将证书放在指定位置

[root@server1 ~]# mkdir /root/.docker/tls/reg.westos.org\:4443/
[root@server1 reg.westos.org:4443]# cp /etc/docker/certs.d/reg.westos.org/ca.crt .
[root@server1 reg.westos.org:4443]# ls
ca.crt

2.打开内容信任功能:

[root@server1 reg.westos.org:4443]# export DOCKER_CONTENT_TRUST=1
[root@server1 reg.westos.org:4443]# export DOCKER_CONTENT_TRUST_SERVER=https://reg.westos.org:4443

配置完成。

3.测试上传

在网页端将刚上传的镜像删除后再进行上传测试:
注意:,签名与tag中的v1绑定,上传时必须指定tag中版本,要不然会跳过签名。

helm 从仓库查找 helm 私有仓库_docker_09

之后上传时每次都需要输入根密钥和仓库密钥,而仅当tag不同时仅需要输入仓库密钥。

4.打开项目内容信任功能

即不允许没有签名的镜像上传下载。

helm 从仓库查找 helm 私有仓库_ubuntu_10

5.删除签名镜像

以签名的镜像时不能删除的,如果需要删除则需要先删除签名:

先查看签名信息:

[root@server1 ~]# docker trust inspect reg.westos.org/library/base-debian10

删除签名:

[root@server1 ~]# docker trust revoke reg.westos.org/library/base-debian10