Docker 仓库之Harbor
简介
本文档介绍Harbor的安装。
Harbor简单介绍
- Harbor是一个开源镜像仓库,它通过策略和基于角色的访问控制来保护工件,确保图像被扫描并且没有漏洞,并将图像标记为可信的。
- Harbor是一个CNCF毕业的项目,它提供了法规遵从性、性能和互操作性,以帮助您在Kubernetes和Docker等云计算平台上一致、安全地管理工件。
Harbor 关键组件
组件名 | 组件版本 |
---|---|
Postgresql | 9.6.10-1.ph2 |
Redis | 4.0.10-1.ph2 |
Clair | 2.0.8 |
Beego | 1.9.0 |
Chartmuseum | 0.9.0 |
Docker/distribution | 2.7.1 |
Docker/notary | 0.6.1 |
Helm | 2.9.1 |
Swagger-ui | 3.22.1 |
安装
- 安装前准备
- 下载Harbor安装包
- 配置https访问Harbor
- 配置Harbor的YML文件
- 配置启用内部TLS
- 运行安装脚本
- 验证
前提条件
-
软件要求 软件|版本|描述 ---|---|---| Docker Engine|17.06.0-ce或者更高|参见Docker Engine安装文档 Docker Compose| 1.18.0或者更高|参见【Docker-Compose 安装手册】 Openssl|推荐使用latest|用于生成证书和Keys
-
资源要求 资源|最小配置|推荐配置 ---|---|--- CPU|2|4 MEM|4GB|8GB 磁盘|40GB|160GB
-
端口 端口|协议|描述 443|HTTPS|Harbor面板以及API访问,可以在配置文件中修改 4443|HTTPS|用于连接DCT service,只有启用Notray时需要,可以在配置文件中修改 80|HTTP|Harbor面板以及API访问,可以在配置文件中修改
下载安装包
- 下载二进制包
* 下载地址:http://harbor.orientsoft.cn/ 下载后的名称为:harbor-offline-installer-v1.5.0.tgz, 大概在:850M左右
* 2.0.1下载地址:https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-offline-installer-v2.0.1.tgz
- 解压
放入/app目录下
# cd /app
# tar -zxvf harbor-offline-installer-v1.5.0.tgz
#tar xvf harbor-offline-installer-v2.0.1.tgz
生成证书
- 生成CA私钥
# openssl genrsa -out ca.key 4096
- 生成ca证书
# openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
-key ca.key \
-out ca.crt
备注:yourdomain.com 修改为自己的域名,其它字段根据实际情况修改
- 生成服务端证书
* 生成私钥
# openssl genrsa -out yourdomain.com.key 4096
备注:yourdomain.com 修改为自己的域名
* 生成签名请求
# openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
-key yourdomain.com.key \
-out yourdomain.com.csr
备注:yourdomain.com 修改为自己的域名,其它字段根据实际情况修改
- 生成一个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=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF
备注:yourdomain.com 修改为自己的域名
- 使用v3.ext生成证书
# openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in yourdomain.com.csr \
-out yourdomain.com.crt
备注:yourdomain.com 修改为自己的域名
为Harbor和Docker提供证书
- 复制证书到指定目录
# cp yourdomain.com.crt /data/cert/
# cp yourdomain.com.key /data/cert/
备注:yourdomain.com 修改为自己的域名
- 证书格式转换
# openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert
备注:yourdomain.com 修改为自己的域名,docker daemon 会认为crt是ca证书,cert是client端证书
- 复制server端证书到docker证书文件夹
# cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
# cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
# cp ca.crt /etc/docker/certs.d/yourdomain.com/
备注:如果nginx的端口不是443,则目录为:/etc/docker/certs.d/yourdomain.com:port, 或者 /etc/docker/certs.d/harbor_IP:port
yourdomain.com 修改为自己的域名,如果文件夹不存在,手工创建
- 启动docker engine
systemctl restart docker
- 证书配置目录样例
/etc/docker/certs.d/
└── yourdomain.com:port
├── yourdomain.com.cert <-- Server certificate signed by CA
├── yourdomain.com.key <-- Server key signed by CA
└── ca.crt <-- Certificate authority that signed the registry certificate
- 修改配置
* 配置文件名称:/app/harbor/harbor.cfg
hostname = 192.168.44.131
配置Harbor的YML文件
- 最小配置项 参数|子参数|描述和额外的参数 ---|---|--- hostname|None|部署Harbor的IP地址或者FQDN,不要指定为:127.0.0.1或者0.0.0.0 http||不要用于生产环境 |port|http的端口号,默认是:80 https||适合生产环境 |port|默认值为:443 |certificate|ssl证书的路径 |private_key|ssl key的路径 internal_tls||harbor的组件间使用https进行通信 |enabled|true:表示使用https, |certificate|包含内部certs和keys的路径 harbor_admin_password|None|harbor管理员初始密码,管理员名:admin,初始密码:Harbor12345 database||可以设置为本地的postgreSql数据库 |password|本地数据库密码 |max_idle_conns|最大空闲连接,0:不保持;默认值:50,如果不配置,值为:2 |max_open_conns|harbor到数据库的最大连接数,默认值:100,0:表示不限制 data_volume|None|存放harbor后端数据的存储大小,默认为:/data clair|updaters_interval|clair更新间隔,0:禁用更新,默认:12小时 trivy||配置trivy扫描器 |ignore_unfixed|true:仅显示已经修复的漏洞;默认值为:false |skip_update|默认值为:false,如果启用:需要手工下载trivy.db文件并挂载到:/home/scanner/.cache/trivy/db/trivy.db |insecure|true:跳过验证仓库证书,默认:false |github_token| jobservice|max_job_workers|job服务的最大复制workers,默认值为:10,每个worker消耗网络/cpu/io,因此根据实际硬件情况决定 notification|webhook_job_max_retry|web hookjobs重试最大次数,默认:10 chart|absolute_url|enabled: chart使用绝对url,disabled:chart使用相对url log||配置logging,Harbor使用rsyslog收集容器的日志 |level|设置日志等级:debug,info,waring,error,fatal;默认:info |local|日志保留参数,rotate_count:删除前保留的日志文件数;0:删除就的版本日志,默认值为:50;rotate_size: 每个日志文件大小(k,M,G);location:日志文件目录,默认/var/log/harbor |external_endpoint|启用此参数前转日志到syslog服务。protocol:默认TCP host:syslog服务的URL port:syslog服务监听端口号 proxy||配置Clair,jobservice,Harbor使用的代理,空白表示不使用代理 |http_proxy|配置一个http代理 |https_proxy|配置https代理 |no_proxy|不适用代理的时候配置,例如:127.0.0.1 localhost,core,registry
* Harbor可选配置项
参数|子参数|描述和其它参数
---|---|---
external_url|None|启用此参数,hostname不再使用
storage_service||默认Harbor的后端存储为本地文件系统,可以设置为其它类型的后端存储
|ca_bundle|客户自定义CA证书路径
|filesystem|默认:fliesystem,可以设置为:azure,gcs,s3,swift,oss,参见:配置存储后端 章节
|redirect|将disable设置为:true,禁用registry前转
external_database||配置外部数据库设置,当前,Harbor只支持PostgreSQL数据库。
|harbor|配置一个外部数据库。host:harbor数据库的主机名;port:端口;db_name:数据库名;username:用户名;password:密码;ssl_mode:启用ssl模式;max_idle_conns:idle时,保持的最大连接数;max_open_conns:数据库最大连接数,默认值0,0:表示不限制;
|clair|为clair配置外部数据库。host:数据库的主机名;port:端口;db_name:数据库名;username:用户名;password:密码;ssl_mode:启用ssl模式
|notary_signer|为notary配置外部数据库。host:数据库的主机名;port:端口;db_name:数据库名;username:用户名;password:密码;ssl_mode:启用ssl模式
|notary_server|为notary server配置外部数据库。host:数据库的主机名;port:端口;db_name:数据库名;username:用户名;password:密码;ssl_mode:启用ssl模式
external_redis||配置外部redis实例
|host|外部redis实例的主机名
|port|外部redis的端口
|password|连接外部redis的密码
|registry_db_index|Harbor 仓库在redis的数据库index
|jobservice_db_index|jobservice的数据库index
|chartmuseum_db_index|chart 的 museum在redis中的数据库index
* 配置存储后端,以swift为例
storage_service: ca_bundle: swift: username: admin password: ADMIN_PASS authurl: http://keystone_addr:35357/v3/auth tenant: admin domain: default region: regionOne container: docker_images" redirect: disable: false
### Harbor内部通信配置TLS
* 默认情况下,Harbor各个组件间的访问使用http,在生产环境中为了更加安全,配置使用HTTPS。
* 可以通过设置harbor.yml文件中的internal_tls参数实现tls
* 设置enabled为:true,设置dir值为:证书所在目录
* 可以使用如下的prepare工具生成证书
docker run -v /:/hostfs goharbor/prepare:v2.0 gencert -p /path/to/internal/tls/cert
* 配置证书要求
名字|使用|CN
---|---|---
harbor_internal_ca.key|ca’s key file for internal TLS|N/A
harbor_internal_ca.crt|ca’s certificate file for internal TLS|N/A
core.key|core’s key file|N/A
core.crt|core’s certificate file|core
job_service.key|job_service’s key file|N/A
job_service.crt|job_service’s certificate file|jobservice
proxy.key|proxy’s key file|N/A
proxy.crt|proxy’s certificate file|proxy
portal.key|portal’s key file|N/A
portal.crt|portal’s certificate file|portal
registry.key|registry’s key file|N/A
registry.crt|registry’s certificate file|registry
registryctl.key|registryctl’s key file|N/A
registryctl.crt|registryctl’s certificate file|registryctl
notary_server.key|notary_server’s key file|N/A
notary_server.crt|notary_server’s certificate file|notary-server
notary_signer.key|notary_signer’s key file|N/A
notary_signer.crt|notary_signer’s certificate file|notary-signer
trivy_adapter.key|trivy_adapter.‘s key file|N/A
trivy_adapter.crt|trivy_adapter.‘s certificate file|trivy-adapter
clair.key|clair’s key file|N/A
clair.crt|clair’s certificate file|clair
clair_adapter.key|clair_adapter’s key file|N/A
clair_adapter.crt|clair_adapter’s certificate file|clair-adapter
chartmuseum.key|chartmuseum’s key file|N/A
chartmuseum.crt|chartmuseum’s certificate file|chartmuseum
### 运行安装脚本
* 修改harbor.yml.tmpl 内容,复制为harbor.yml
* 执行install.sh脚本安装
sh install.sh
* 不是所有的组件都必须安装,可以采用如下组合方式安装Harbor
- Harbor
- Harbor,Notary
- Harbor, Clair
- Harbor,Chart仓库服务
- Harbor,Notary,Clair,Chart仓库服务中的两个或者三个
* 默认不安装Notary,Clair,chart仓库服务
* 安装后可以访问:http://reg.yourdomain.com(reg.yourdomain.com为在harbor.yml中配置的主机名)
* 默认的用户名/密码:admin/Harbor12345
* 注意
- 如果使用https,必须为docker client提供证书,参见:配置HTTPS章节
- 如果使用http,必须为docker daemon配置--insecure-registry选项
### 带Notary一起安装
sh install.sh --with-notary
* 备注
安装notary,必须配置docker使用HTTPS
### 带Clair一起安装
./install.sh --with-clair
### 带Chart仓库服务一起安装
./install.sh --with-chartmuseum
## 测试验证
* UI验证
浏览器访问:http://192.168.44.131
* 镜像上传及下载
在进行push和pull的docker客户端主机上进行如下配置: 在docker daemon中增加:--insecure-registry=192.168.44.131:5000 加载docker daemon并重启docker daemon
systemctl daemon-reload systemctl restart docker
docker login 192.168.44.131:5000
将镜像打标签为: docker tag 1344d5e50c9f 192.168.44.131:5000/sit/percona-mysql:5.7
docker push 192.168.44.131:5000/sit/percona-mysql:5.7
在其他客户端进行镜像拉取: docker pull 192.168.44.131:5000/sit/percona-mysql:5.7
## 常用命令
* 停止所有服务
# cd /app/harbor # docker-compose down -v
* 启动所有服务
cd /app/harbor
docker-compose up -d
* 启动容器
# docker-compose start # 容器不存在则无法启动
* 查看容器
# docker-compose ps
* 停止容器
# docker-compose stop # 停止容器
* 查看容器日志
# docker-compose logs
## 常用api
* 查看所有项目和镜像信息
curl -X GET -H "Content-Type" application/json" "http://192.168.250.3/api/search"
备注: 显示所有的项目信息和镜像信息
* 查看项目信息
curl -k -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://HostName/api/projects/{project_id}"
```