Bootstrap

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor

  • Docker 之分布式仓库 Harbor
    • 1. Harbor 组成
    • 2. 安装 Harbor

Docker 之分布式仓库 Harbor

Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器,由 VMware 开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源 Docker Distribution。作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控,另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等

vmware 官方开源服务: https://github.com/vmware/

harbor 官方github 地址: https://github.com/goharbor/harbor

harbor 官方网址: https://goharbor.io/

harbor 官方文档: https://goharbor.io/docs/

Harbor 功能官方介绍

  • 基于角色的访问控制: 用户与 Docker 镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限
  • 镜像复制: 镜像可在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景
  • 图形化用户界面: 用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间
  • AD/LDAP 支: Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理
  • 审计管理: 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理
  • 国际化: 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来
  • RESTful API: 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易
  • 部署简单: 提供在线和离线两种安装工具, 也可以安装到 vSphere 平台(OVA 方式)虚拟设备

1. Harbor 组成

harbor 是由很多容器组成实现完整功能

  • Proxy: 对应启动组件 nginx。它是一个 nginx 反向代理,代理 Notary client(镜像认证)、Docker client(镜像上传下载等)和浏览器的访问请求(Core Service)给后端的各服务
  • UI(Core Service): 对应启动组件 harbor-ui。底层数据存储使用 mysql 数据库,主要提供了四个 子功能:
    • UI: 一个 web 管理页面 ui
    • API: Harbor 暴露的 API 服务
    • Auth: 用户认证服务,decode 后的 token 中的用户信息在这里进行认证;auth 后端可以接 db、ldap、uaa 三种认证实现
    • Token服务: 负责根据用户在每个 project 中的 role 来为每一个 docker push/pull 命令发布一个 token,如果从 docker client 发送给 registry 的请求没有带 token, registry 会重定向请求到 token 服务创建 token
  • Registry: 对应启动组件 registry。负责存储镜像文件,和处理镜像的 pull/push 命令。Harbor 对镜像进行强制的访问控制,Registry 会将客户端的每个 pull、push 请求转发到 token 服务来获取有效的 token
  • Admin Service: 对应启动组件 harbor-adminserver。是系统的配置管理中心附带检查存储用量, ui 和 jobserver 启动时候需要加载 adminserver 的配置
  • Job Sevice: 对应启动组件 harbor-jobservice。负责镜像复制工作的,他和 registry 通信,从一个 registry pull 镜像然后 push 到另一个 registry,并记录 job_log
  • Log Collector: 对应启动组件 harbor-log。日志汇总组件,通过 docker 的 log-driver 把日志汇总到 一起
  • DB: 对应启动组件 harbor-db,负责存储 project、 user、 role、replication、image_scan、 access 等的 metadata 数据

2. 安装 Harbor

下载地址: https://github.com/goharbor/harbor/releases

首先确保 docker 和 docker compose 已安装,并且 docker compose 必须先于 harbor 安装,否则会报错误

注意:docker、 docker compose、 harbor 版本要符合要求不然会安装失败,建议都用最新版本

以 http 模式安装 harbor

下载 Harbor 安装包并解压缩

# 下载离线完整安装包,推荐使用,下载好上传到 /root 目录
[root@Ubuntu2204 ~]#pwd
/root
[root@Ubuntu2204 ~]#ls
harbor-offline-installer-v2.12.2.tgz 

# 解压缩离线包
[root@Ubuntu2204 ~]#mkdir /apps
[root@Ubuntu2204 ~]#tar -xvf harbor-offline-installer-v2.12.2.tgz -C /apps/
[root@Ubuntu2204 ~]#mv /apps/harbor/harbor.yml.tmpl /apps/harbor/harbor.yml

# 只需要修改下面两行 并把 https 相关的先注释了
[root@Ubuntu2204 ~]#vim /apps/harbor/harbor.yml

hostname: 10.0.0.100			# 修改此行,指向当前主机 IP 或 FQDN
harbor_admin_password: 123456	# 修改此行指定 harbor 登录用户 admin 的密码

先把这几行注释了,先不走 https
 12 # https related config
 13 #https:
 14   # https port for harbor, default is 443
 15  # port: 443
 16   # The path of cert and key files for nginx
 17   #certificate: /your/certificate/path
 18   #private_key: /your/private/key/path
 19   # enable strong ssl ciphers (default: false)
 20   # strong_ssl_ciphers: false

# 运行 harbor 安装脚本
[root@Ubuntu2204 ~]#/apps/harbor/install.sh

#  实现开机自动启动 harbor
方法1: 通过 service 文件实现

[root@Ubuntu2204 ~]#vim /lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f  /apps/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /apps/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target

[root@Ubuntu2204 ~]#systemctl daemon-reload; systemctl enable harbor

方法2: 通过 rc.local 实现
[root@Ubuntu2204 ~]#vim /etc/rc.local
#!/bin/bash
cd /apps/harbor
/usr/local/bin/docker-compose up

[root@Ubuntu2204 ~]#chmod +x /etc/rc.local

安装成功后在浏览器输入本机 IP 地址访问

账号:admin

密码:123456

在这里插入图片描述

建立项目

harbor上必须先建立项目,才能上传镜像

在这里插入图片描述

在这里插入图片描述

命令行登录 harbor

重新找一台安装 docker 的主机进行测试

[root@Ubuntu2204 ~]#cat /etc/docker/daemon.json 
{
    "registry-mirrors": [
        "https://docker.1ms.run",
        "https://docker.m.daocloud.io"
        ],
    "insecure-registries": ["10.0.0.110"] 	# harbor IP 地址
}

[root@Ubuntu2204 ~]#systemctl daemon-reload; systemctl restart docker

# 登录 harbor 仓库
[root@Ubuntu2204 ~]#docker login 10.0.0.110
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

# 查看存储 Docker 的认证信息等
[root@Ubuntu2204 ~]#cat .docker/config.json 
{
	"auths": {
		"10.0.0.110": {
			"auth": "YWRtaW46MTIzNDU2"
		}
	}
}

# 给本地镜像打标签并上传到 Harbor
[root@Ubuntu2204 ~]#docker tag alpine:latest 10.0.0.110/test/alpine:v1.0
[root@Ubuntu2204 ~]#docker push 10.0.0.110/test/alpine:v1.0

注意:上传镜像前,必须先登录 harbor
	 修改 images 的名称,不修改成指定格式无法将镜像上传到 harbor 仓库
	 Harbor主机IP/项目名/image名:版本
	 如果不事先建立项目,会上传镜像失败

查看 alpine:v1.0 上传成功

在这里插入图片描述

下载 Harbor 的镜像

重新找第二台安装 docker 的主机进行测试

下载前必须修改 docker 的 service 文件,加入harbor服务器的地址才可以下载

无需登录,即可下载镜像

[root@Ubuntu2204 ~]#cat /etc/docker/daemon.json 
{
    "insecure-registries": ["10.0.0.110"] 	# harbor IP 地址
}

[root@Ubuntu2204 ~]#systemctl daemon-reload; systemctl restart docker
[root@Ubuntu2204 ~]#docker pull 10.0.0.110/test/alpine:v1.0
;