Harbor
一、Docker Harbor 概述
1.Harbor 简介
Docker Harbor 能够提供可视化的 Web 管理界面,可以方便管理 Docker 镜像,而且提供了多个项目的镜像权限管理及控制功能(包括统计信息,比如镜像被下载了多少次,什么时候上传得)
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目
Registry:
1.Docker官方提供了Docker Hub来维护管理所有的镜像,只是对于免费用户而言,只能创建一个私有仓库,付费用户才能拥有更多私有仓库的权限
2.对此官方开源了Docker Registry的源代码,我们可以通过它在局域网内部搭建私有的镜像注册中心(私有仓库)
2.Harbor 的优势
基于角色控制
:有管理员与普通用户,可赋权普通用户,比如只能上传和下载,可根据项目来进行操作和管理
基于镜像的复制策略
:也与权限相关,比如有只一些用户与组才能对此项目进行相对应的操作
支持 LDAP/AD
:域控制,比如南京去下载北京 harbor 私有仓库的镜像,两端打上局域网的地址,连接在一块,数据信息的传输通过一条隧道,会通过两层加密,第一层为隧道加密,第二层为数据加密,安全可靠
图像删除和垃圾收集
:即回收站机制
图形 UI
:具有统计功能,比如访问量与镜像下载热度
审计
:日志,这里意义不大,主要还是借助于 ELK
RESTful API
:定义 Web 语言规范的格式,方便调用 Harbor 的接口,也便于二次开发
二、Harbor 的核心组件
1.
Proxy
通过一个前置的反向代理统一接收浏览器、Docker 客户端的请
求,并将请求转发给后端不同的服务
这是一个反向代理组件
2.
Registry
负责储存 Docker 镜像
处理 docker push/pull 命令来上传和下载
3.
Core services
1.Harbor 的核心功能,包括UI、webhook、 token 服务
2.webhook:网站的一些服务功能
3.token:令牌,提供身份验证服务
4.
Database
为 core services 提供数据库服务
数据库记录镜像的元信息及用户的身份信息
5.
Log collector
负责收集其他组件的日志,以供然后进行分析
健康检查等
三、Docker Harbor 私有仓库架构拓扑
所有的请求或人为的操作都会首先交给 Proxy(反向代理)
Proxy 会先将请求转发给后端 Core services,Core services 中包含 UI、token(身份验证服务)、webhook(网站的一些服务功能)
转发给 Registry(镜像存储),若需要下载镜像等权限操作,需要通过 Core services 中的 token 令牌的身份验证服务才行
每一次下载和上传都会产生操作记录,生成到日志,保存至 Database 中
Database 记录保存镜像的元信息及用户与组的身份信息,通过验证授权才能允许相关操作
四、Harbor 构建 Docker 私有仓库实战
环境
主机 | 操作系统 | 主机名/IP | 软件 |
---|---|---|---|
服务端 | CentOS 7 | harbor/192.168.78.11 | docker-ce、docker-compose、harbor-offline-installer |
客户端 | CentOS 7 | client/192.168.78.22 | docker-ce |
案例需求
通过 Harbor 创建 Docker 私有仓库
图形化管理 Docker 私有仓库镜像
部署步骤
①安装docker-ce docker-compose
服务端和客户端安装 docker-ce
服务端安装docker-compose
②启动 harbor 服务
1.下载harbor安装程序
cd /usr/local/
tar zxvf harbor-offline-installer-v1.2.2.tgz '//在该目录下解压缩'
2.配置harbor参数文件
cd harbor/
vim harbor.cfg
#5行
hostname = 192.168.78.11
'//hostname:用于访问用户界面和register服务,指向目标IP或域名,注,这里不要使用localhost或127.0.0.1!'
3.启动harbor
sh +x /usr/local/harbor/install.sh
③harbor.cfg 配置文件详解
harbor.cfg配置文件中有所需参数与可选参数这两类参数
1)所需参数,这些参数需要在配置文件harbor.cfg中设置
用户更新它们并运行install.sh脚本以启动harbour,参数将生效
具体参数如下
hostname:用于访问用户界面和register服务,指向目标机器的IP地址或域名;注,不要使用 localhost 或 127.0.0.1 为主机名!
ui_url_protocol:(http或https,默认为 http)用于访问 UI 和令牌/通知服务的协议,如果公证处于启用状态,则此参数必须为 https
max_job_workers:镜像复制作业线程
db_password:用于设置db_auth的MySQL数据库root用户的密码
customize_crt:该属性可设置为打开或关闭,默认打开;打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌;当由外部来源提供密钥和根证书时,将此属性设置为off
ssl_cert:SSL 证书的路径,仅当协议设置为https时才应用
ssl_cert_key:SSL密钥的路径,仅当协议设置为https时才应用
secretkey_path:用于在复制策略中加密或解密远程register密码的密钥路径
2)可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动harbor后在Web UI上进行更新
如果进入harbor.cfg,只会在第一次启动harbor时生效,随后对这些参数的更新,Harbor.cfg将被忽略
注意:如果选择通过UI设置这些参数,请确保在启动harbour后立即执行此操作
具体来说,必须在注册或在harbor中创建任何新用户之前设置所需的
auth_mode,当系统中有用户时(除了默认的admin用户),auth_mode不能被修改。具体参数如下:
Email:harbor需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要;请注意,在默认情况下SSL连接时没有启用;如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSL email_ssl = TRUE
harbor_admin_password:管理员的初始密码,只在harbour第一次启动时生效;之后,此设置将被忽略,并且应在UI中设置管理员的密码;请注意,默认的用户名/密码是admin/Harbor12345
auth_mode:使用的认证类型,默认情况下,它是db_auth,即凭据存储在数据库中;对于LDAP身份验证,请将其设置为ldap_auth
self_registration:启用/禁用用户注册功能;禁用时,新用户只能由Admin用户创建,只有管理员用户可以在harbor中创建新用户;注意,当 auth_mode 设置为ldap_auth时,自注册功能将始终处于禁用状态,并且该标志被忽略
Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为30分钟
project_creation_restriction:用于控制哪些用户有权创建项目的标志;默认情况下,每个人都可以创建一个项目;如果将其值设置为“adminonly”,那么只有admin可以创建项目
verify_remote_cert:打开或关闭,默认打开;此标志决定了当harbor与远程register实例通信时是否验证SSL/TLS证书;将此属性设置为off,将绕过SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用
另外,默认情况下,harbour将镜像存储在本地文件系统上;在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如S3、Openstack Swif、Ceph等;但需要更新common/templates/registry/config.yml文件
④查看 harbor 启动镜像及容器
1.查看harbor启动镜像
docker images
2.查看启动容器
docker ps -a
⑤访问 harbor Web 页面→登录→项目→+项目(新建项目)
⑥harbor 服务端进行测试
默认情况下, Register服务器在端口 80 上侦听
netstat -natp| grep 80
此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像
docker login -u admin -p Harbor12345 http://127.0.0.1
docker pull cirros '//cirros是测试起来很方便的镜像,小于15M'
docker tag cirros:latest 127.0.0.1/dark/cirros:v1 '//打标签,v1便于区别'
docker push 127.0.0.1/dark/cirros:v1 '//上传至harbor'
注意 项目名称 和 重新打包镜像标签 要一致,有点类似目录要一致
⑦client 客户端测试
注:以上操作都是在harbor服务器本地操作,如果其他客户端想上传镜像到harbor,需要连接至harbor服务器! 因为,Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交互时可能会出现错误
docker login -u admin -p Harbor12345 http://192.168.78.11
docker pull cirros
docker images
docker tag cirros:latest 192.168.78.11/dark/cirros:v2 '//打标签,v2,区别v1'
docker push 192.168.78.11/dark/cirros:v2 '//上传'
【返回查看浏览器】
harbor 私有仓库的维护与管理
可以使用docker-compose来管理harbor
一些有用的命令如下所示,注意,必须在与docker-compose.yml相同的目录中运行!
--修改harbor.cfg配置文件--
要更改harbor的配置文件时,请按照以下不步骤:
1.请先停止现有的harbor实例再来更新harbor.cfg配置文件
docker-compose down -v
vim harbor.cfg
2.运行prepare脚本来填充配置
./prepare
3.最后重新创建并启动harbor的实例
docker-compose up -d
'//可能会启动不成功,检查防火墙是否关闭,然后重启docker再来试试'
Harbor 用户管理
①系统管理→用户管理→+用户→创建用户→设置为管理员
②项目→项目名称→成员→+成员→新建成员→开发人员
③在 client 客户端上测试
docker images
docker rmi 192.168.78.11/dark/cirros:v2 '//删除本地镜像'
docker logout 192.168.78.11 '//登出'
docker login 192.168.78.11 -u root -p Harbor12345
docker pull 192.168.78.11/dark/cirros:v2 '//从私有仓库重新下载v2'
docker images '//查看'
docker tag cirros:latest 192.168.78.11/dark/cirros:v3 '//打标签'
docker push 192.168.78.11/dark/cirros:v3 '//上传测试'
【返回查看浏览器,刷新一下】
迁移 harbor 数据
1.在harbor服务上先关闭服务
docker-compose down -v
2.拷贝habor数据
持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/harbor/目录下
/data/database/:数据库内容,比如镜像的元信息及用户的身份信息
/data/registry/:镜像文件内容
有兴趣的朋友可以用"tree"命令去查看下
3.将数据拉取至目标服务器相应目录下重新部署即可
4.如需重新部署,则移除以上全部数据即可
故障提示1:
情景: docker login -u admin -p Harbor12345 http://192.168.78.11
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.78.11/v2/: dial tcp 192.168.78.11:443: connect: connection refused
解决方案
vim /usr/lib/systemd/system/docker.service
#13行修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.78.11 --containerd=/run/containerd/containerd.sock
‘//增加这段内容,在开始执行的脚本或命令项中添加指向harbor服务器’
systemctl daemon-reload
systemctl reload docker
故障提示2:
情景:docker push 127.0.0.1/xxxxxxxx/cirros:v1
错误提示:denied: requested access to the resource is denied
解决方案:
项目名称不存在,我项目名称为dark,我使用的sicong_hello,并且,在打包镜像tag标签,就是为了迎合项目名称。所以 项目名称和打标签名称要一致