Docker--harbor私有仓库部署与管理
(1)什么是Harbor
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。
Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。
(2)Harbor的特性
1、基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
2、基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
3、支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
4、镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
5、图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
6、审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
7、支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
8、Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。
(3)Harbor的构成
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。
●Proxy: 是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。
●Registry: 负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。
图中组件解释 Proxy:通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务 Registry:负责存储Docker镜像,并处理docker push/pull命令 Core services:Harbor的核心功能,包括UI、webhook、token服务 Database:为core services提供数据库服务 Log collector:·负责收集其他组件的log,供日后进行分析 图解 所有的请求都经过proxy代理,proxy代理转发给Core services和Registry,其中Core services包括UI界面、token令牌和webhook网页服务功能,Registry主要提供镜像存储功能。
如果要进行下载上传镜像,要经过token令牌验证然后从Registry获取或上传镜像,每一次下载或上传都会生成日志记录,会记入Log collector,而用户身份权限及一些镜像语言信息会被存储在Database中。
认证方式有三种:扩展,令牌,用户密码(ssl)
搭建本地私有仓库
下载 registry 镜像
docker pull registry
在 daemon.json 文件中添加私有镜像仓库地址
运行 registry 容器
[root@24 ~]# vim /etc/docker/daemon.json
[root@24 ~]# systemctl restart docker.service
[root@24 ~]# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
[root@24 ~]# cat /etc/docker/daemon.json {
"insecure-registries": ["192.168.111.24:5000"],
"registry-mirrors": ["https://lb58imrx.mirror.aliyuncs.com"]
}
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行 -v:把宿主机的/data/registry目录绑定到容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化; -p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了 --restart=always:这是重启的策略,在容器退出时总是重启容器 --name registry:创建容器命名为registry registry:latest:这个是刚才pull下来的镜像
Docker容器的重启策略如下: no:默认策略,在容器退出时不重启容器 on-failure:在容器非正常退出时(退出状态非0),才会重启容器 on-failure:3 :在容器非正常退出时重启容器,最多重启3次 always:在容器退出时总是重启容器 unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
#下载或上传 Harbor 安装程序 wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/ #修改harbor安装的配置文件 vim /usr/local/harbor/harbor.cfg --5行--修改,设置为Harbor服务器的IP地址或者域名 hostname = 192.168.111.24 --59行--指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345 harbor_admin_password = Harbor12345
在配置好了 harbor.cfg 之后,执行 ./prepare 命令,为 harbor 启动的容器生成一些必要的文件(环境)
再执行命令 ./install.sh 以 pull 镜像并启动容器
cd /usr/local/harbor/ docker-compose ps #--------------------------------------输出内容--------------------------------------- Name Command State Ports ---------------------------------------------------------------------------------------------------- harbor-adminserver /harbor/harbor_adminserver Up harbor-db docker-entrypoint.sh mysqld Up 3306/tcp harbor-jobservice /harbor/harbor_jobservice Up harbor-log /bin/sh -c crond && rm -f ... Up 127.0.0.1:1514->514/tcp harbor-ui /harbor/harbor_ui Up nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
添加项目名称
创建一个新项目(由于登录时用的25号,所以25代替24,IP号)
[root@25 harbor]# docker login http://127.0.0.1
[root@25 harbor]# docker pull nginx
[root@25 harbor]# docker tag nginx:latest 127.0.0.1/myproject-kk/nginx:v1
[root@25 harbor]# docker push 127.0.0.1/myproject-kk/nginx:v1
如果其他客户端登录到 Harbor,就会报如下错误。出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。
docker login -u admin -p Harbor12345 http://192.168.10.23
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
在客户端修改配置
[root@24 harbor]# vim /usr/lib/systemd/system/docker.service [root@24 harbor]# systemctl daemon-reload [root@24 harbor]# systemctl restart docker [root@24 harbor]# docker login -u admin -p Harbor12345 http://192.168.111.25 WARNING! Using --password via the CLI is insecure. Use --password-stdin. 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@24 harbor]# docker pull 192.168.111.25/myproject-kk/nginx:v1 v1: Pulling from myproject-kk/nginx Digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 Status: Downloaded newer image for 192.168.111.25/myproject-kk/nginx:v1 192.168.111.25/myproject-kk/nginx:v1 [root@24 harbor]# docker pull cirros Using default tag: latest latest: Pulling from library/cirros d0b405be7a32: Pull complete bd054094a037: Pull complete c6a00de1ec8a: Pull complete Digest: sha256:1e695eb2772a2b511ccab70091962d1efb9501fdca804eb1d52d21c0933e7f47 Status: Downloaded newer image for cirros:latest docker.io/library/cirros:latest
Harbor的核心组件
①Proxy
通过一个前置的反向代理统一接收浏览器、Docker 客户端的请
求,并将请求转发给后端不同的服务
这是一个反向代理组件
②Registry
负责储存 Docker 镜像
处理 docker push/pull 命令来上传和下载
③Core services
Harbor 的核心功能,包括UI、webhook、 token 服务
webhook:网站的一些服务功能
token:令牌,提供身份验证服务
④Database
为 core services 提供数据库服务
数据库记录镜像的元信息及用户的身份信息
⑤Log collector
负责收集其他组件的日志,以供然后进行分析
健康检查等
docker Harbor私有仓库操作的过程
1.所有的请求或认为的操作都会首先交给proxy(反向代理)
2.proxy会先将请求转发给后端Core services,Core services 中包含 3.UI、token(身份验证服务)、webhook(网站的一些服务功能)
4.转发给registry(镜像存储),若需要下载镜像等权限操作,需要通过Core services中的token令牌的身份验证服务才行
5.每一次下载和上传都产生操作记录,生成日志,保存至database中
6.database记录保存镜像的元信息及用户与组的身份信息,通过验证授权才能允许相关操作