Harbor介绍
以Docker为代表的容器技术的出现,改变了传统的交付方式。通过把业务及其依赖的环境打包进Docker镜像,解决了开发环境和生产环境的差异问题,提升了业务交付的效率。如何高效地管理和分发Docker镜像?是众多企业需要考虑的问题
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,可以用来构建企业内部的Docker镜像仓库。
它在Docker的开源项目 Distribution的基础上,添加了一些企业需要的功能特性,如镜像同步复制、漏洞扫描和权限管理等。
docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker distribution的基础上增加了一些安全、访问控制、管理的功能以满足企业对于镜像仓库的需求。
Harbor架构图
- 代理层:代理层实质上是一个 Nginx 反向代理,负责接收不同类型的客户端请求,包括浏览器、用户脚本、Docker 等,并根据请求类型和 URI 转发给不同的后端服务进行处理。
- 功能层:
- Portal:是一个基于 Argular 的前端应用,提供 Harbor 用户访问的界面。
- Core:是 Harbor 中的核心组件,封装了 Harbor 绝大部分的业务逻辑。
- JobService:异步任务组件,负责 Harbor 中很多比较耗时的功能,比如 Artifact 复制、扫描、垃圾回收等。
- Docker Distribution:Harbor 通过 Distribution 实现 Artifact 的读写和存取等功能。
- RegistryCtl:Docker Distribution 的控制组件。
- Notary(可选):基于 TUF 提供镜像签名管理的功能。
- 扫描工具(可选):镜像的漏洞检测工具。
- ChartMuseum(可选):提供 API 管理非 OCI 规范的 Helm Chart,随着兼容 OCI 规范的 Helm Chart 在社区上被更广泛地接受,Helm Chart 能以 Artifact 的形式在 Harbor 中存储和管理,不再依赖 ChartMuseum,因此 Harbor 可能会在后续版本中移除对 ChartMuseum 的支持。
- 数据层:
- Redis:主要作为缓存服务存储一些生命周期较短的数据,同时对于 JobService 还提供了类似队列的功能。
- PostgreSQL:存储 Harbor 的应用数据,比如项目信息、用户与项目的关系、管理策略、配置信息、Artifact 的元数据等等。
- Artifact 存储:存储 Artifact 本身的内容,也就是每次推送镜像、Helm Chart 或其他 Artifact 时,数据最终存储的地方。默认情况下,Harbor 会把 Artifact 写入本地文件系统中。用户也可以修改配置,将 Artifact 存储在外部存储中,例如亚马逊的对象存储 S3、谷歌云存储 GCS、阿里云的对象存储 OSS 等等。
部署
harbor包下载地址:harbor包
#安装依赖
yum install docker-compose
#下载包
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz
#https://ghproxy.com/是国内的几个GitHub代理加速网站,不用的话下的太慢了
#解压
tar xf harbor-offline-installer-v2.8.0.tgz
#移到
mv harbor /usr/local/harbor
cd /usr/local/harbor/
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
....
hostname: 192.168.100.10
....
#https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
....
harbor_admin_password: Harbor12345 #初始密码
....
data_volume: /data/harbor #日志
#安装
./install.sh
#最后看到
[Step 5]: starting Harbor ...
[+] Running 10/10
✔ Network harbor_harbor Created 0.0s
✔ Container harbor-log Started 0.4s
✔ Container harbor-db Started 1.2s
✔ Container harbor-portal Started 2.1s
✔ Container registryctl Started 1.7s
✔ Container redis Started 1.9s
✔ Container registry Started 2.1s
✔ Container harbor-core Started 2.3s
✔ Container harbor-jobservice Started 3.3s
✔ Container nginx Started 3.3s
✔ ----Harbor has been installed and started successfully.----
就装完了
浏览器访问192.168.100.10
Harbor修改密码
推行镜像
首先创建项目
点击docker-images进入项目,划到推送命令,有相关命令
在docker服务器上
[root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/prepare dev 56a6f108ccfd 18 hours ago 172MB
goharbor/harbor-exporter v2.8.0 2abc02438fcf 7 days ago 97.1MB
goharbor/redis-photon v2.8.0 ef1f410f9255 7 days ago 127MB
goharbor/trivy-adapter-photon v2.8.0 724824e3559a 7 days ago 454MB
goharbor/notary-server-photon v2.8.0 d603449fe91f 7 days ago 113MB
goharbor/notary-signer-photon v2.8.0 618fc02c41bf 7 days ago 110MB
goharbor/harbor-registryctl v2.8.0 165749c6eedc 7 days ago 141MB
goharbor/registry-photon v2.8.0 8bfd12c2163d 7 days ago 78.5MB
goharbor/nginx-photon v2.8.0 cfc2401896e1 7 days ago 126MB
goharbor/harbor-log v2.8.0 f31ccc3d46f0 7 days ago 134MB
goharbor/harbor-jobservice v2.8.0 1b00a3a474e1 7 days ago 140MB
goharbor/harbor-core v2.8.0 15f4066c1707 7 days ago 164MB
goharbor/harbor-portal v2.8.0 ae18a071cdce 7 days ago 133MB
goharbor/harbor-db v2.8.0 f3d4373617a2 7 days ago 179MB
goharbor/prepare v2.8.0 daa44ccf3b06 7 days ago 170MB
tomcat 10.1.7 608294908754 3 weeks ago 475MB
nginx 1.23.3 ac232364af84 4 weeks ago 142MB
#将nginx:1.23.3推送到仓库
[root@bogon ~]# docker tag nginx:1.23.3 192.168.100.10/docker-images/nginx:1.23.3
[root@bogon ~]# docker push 192.168.100.10/docker-images/nginx:1.23.3
The push refers to repository [192.168.100.10/docker-images/nginx]
Get "https://192.168.100.10/v2/": dial tcp 192.168.100.10:443: connect: connection refused
#可以看到这里报错了,这里报的是https协议,我们没有开启https协议
Get "https://192.168.100.10/v2/":
#需要编辑daemon.json
[root@bogon ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.hub.docker.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"insecure-registries": ["192.168.100.10:8888"],
"insecure-registries": ["192.168.100.10"]
}
#登录
[root@bogon ~]# docker login 192.168.100.10
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@bogon ~]# docker push 192.168.100.10/docker-images/nginx:1.23.3
The push refers to repository [192.168.100.10/docker-images/nginx]
a1bd4a5c5a79: Pushed
597a12cbab02: Pushed
8820623d95b7: Pushed
338a545766ba: Pushed
e65242c66bbe: Pushed
3af14c9a24c9: Pushed
1.23.3: digest: sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25 size: 1570
[root@bogon ~]#