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 #日志
#安装
[root@bogon harbor]# docker-compose up -d
[+] Running 10/10
⠿ Network harbor_harbor Created 0.0s
⠿ Container harbor-log Started 0.5s
⠿ Container registryctl Started 1.3s
⠿ Container redis Started 1.4s
⠿ Container harbor-portal Started 1.0s
⠿ Container registry Started 1.3s
⠿ Container harbor-db Started 1.2s
⠿ Container harbor-core Started 1.6s
⠿ Container harbor-jobservice Started 2.2s
⠿ Container nginx Started 2.2s
#最后看到
[root@bogon harbor]# docker-compose start
[+] Running 7/7
⠿ Container harbor-portal Started 0.7s
⠿ Container registry Started 0.7s
⠿ Container redis Started 0.8s
⠿ Container registryctl Started 0.8s
⠿ Container harbor-core Started 0.3s
⠿ Container harbor-jobservice Started 0.6s
⠿ Container nginx Started 0.6s
[root@bogon harbor]# docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
harbor-core "/harbor/entrypoint.…" core running (starting)
harbor-db "/docker-entrypoint.…" postgresql running (healthy)
harbor-jobservice "/harbor/entrypoint.…" jobservice running (starting)
harbor-log "/bin/sh -c /usr/loc…" log running (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal "nginx -g 'daemon of…" portal running (starting)
nginx "nginx -g 'daemon of…" proxy running (starting) 0.0.0.0:80->8080/tcp, :::80->8080/tcp
redis "redis-server /etc/r…" redis running (starting)
registry "/home/harbor/entryp…" registry running (starting)
registryctl "/home/harbor/start.…" registryctl running (starting)
就装完了
浏览器访问192.168.100.10
Harbor修改密码
推行镜像
首先创建项目
点击docker-images进入项目,划到推送命令,有相关命令
在docker服务器上
[root@bogon harbor]# docker-compose images
Container Repository Tag Image Id Size
harbor-core goharbor/harbor-core v2.8.0 15f4066c1707 164MB
harbor-db goharbor/harbor-db v2.8.0 f3d4373617a2 179MB
harbor-jobservice goharbor/harbor-jobservice v2.8.0 1b00a3a474e1 140MB
harbor-log goharbor/harbor-log v2.8.0 f31ccc3d46f0 134MB
harbor-portal goharbor/harbor-portal v2.8.0 ae18a071cdce 133MB
nginx goharbor/nginx-photon v2.8.0 cfc2401896e1 126MB
redis goharbor/redis-photon v2.8.0 ef1f410f9255 127MB
registry goharbor/registry-photon v2.8.0 8bfd12c2163d 78.5MB
registryctl goharbor/harbor-registryctl v2.8.0 165749c6eedc 141MB
#将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 ~]#