文章目录
habor镜像仓库
1、habor简介
Harbor是VMware公司开源的企业级Docker Registry项目,旨在帮助用户快速搭建一个企业级的Docker Registry服务。
基础:Harbor以Docker公司开源的Registry为基础,并扩展了多种企业所需的功能,如图形管理UI、基于角色的访问控制等。
组件构建:Harbor的每个组件都是以Docker容器的形式构建的,使用docker-compose进行部署。
1.1 特性
- 基于角色控制:用户和仓库都是基于项目进行组织的,用户在项目中可以拥有不同的权限。
- 镜像复制策略:镜像可以在多个Harbor实例之间进行复制(同步),适用于负载均衡、高可用、混合云和多云等场景。
- LDAP/AD支持:Harbor可以集成企业内部已有的AD/LDAP,用于对已经存在的用户进行认证和管理。
- 图形化用户界面:用户可以通过浏览器浏览、搜索镜像仓库,并对项目进行管理。
- 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- RESTful API支持:提供给管理员对Harbor的更多操控,使得与其他管理软件集成变得更容易。
- 镜像删除和垃圾回收:支持镜像的删除操作,并可以回收镜像占用的空间。
1.2 habor的构成
Harbor在架构上主要有以下几个组件:
- Proxy:一个nginx的前端代理,负责将来自浏览器、docker clients的请求转发到后端不同的服务上。
- Registry:负责储存Docker镜像,并处理Docker push/pull命令。同时,它会强制用户的每次Docker pull/push请求都要携带一个合法的Token,并通过公钥对Token进行解密验证。
- Core services:Harbor的核心功能组件,主要提供UI、WebHook和Token服务。
- UI(harbor-ui):提供图形化界面,帮助用户管理Registry上的镜像,并对用户进行授权。
- WebHook:及时获取Registry上image状态变化的情况,并把状态变化传递给UI模块。
- Token服务:根据用户权限给每个Docker push/pull命令签发Token
- Database(harbor-db):为core services提供数据库服务,负责储存用户权限、审计日志、Docker镜像分组信息等数据。
- Job services:主要用于镜像复制,使本地镜像可以被同步到远程Harbor实例上。
- Log collector(harbor-log):负责收集其他组件的日志,并进行统一管理。
此外,Harbor的整体架构从上到下还分为代理层、功能层和数据层。其中,代理层负责接收不同类型的客户端请求;功能层包括Portal(基于Angular的前端应用)、Core(封装了Harbor绝大部分的业务逻辑)、JobService(异步任务组件)等;数据层则包括Docker Distribution(实现Artifact的读写和存取等功能)、PostgreSQL(存储Harbor的应用数据)等。
1.3 habor部署与管理
部署前准备:
确保已经安装了Docker引擎(版本在1.10或以上)、Python(版本在2.7或以上)和Docker Compose(版本在1.6.0或以上)。从Harbor的官方网站或GitHub仓库下载Harbor的安装包,并解压到本地。
部署Harbor服务:
在解压后的目录中,找到并编辑harbor.yml或harbor.cfg文件,进行必要的配置。配置项包括数据库连接信息、管理员密码、hostname(用于访问用户界面和register服务的IP地址或完全限定的域名)等。运行install.sh脚本进行安装。脚本会进行一系列的配置和部署工作,包括创建数据库、生成证书等。安装完成后,通过运行相应命令启动Harbor服务。
管理Harbor:
启动成功后,可以通过浏览器访问Harbor的管理界面(默认地址通常是http://),并使用初始用户名admin和密码登录。登录后,可以创建自己的镜像仓库,并开始使用Harbor进行容器镜像的管理和分发。在管理界面中,还可以进行用户管理、权限设置、审计日志查看等操作。
维护与更新:
需要定期备份数据和配置信息,以防止数据丢失和意外情况的发生。需要及时更新和维护Harbor,以修复漏洞和提升安全性。需要根据业务需求和实际情况,进行合理的配置和管理,以确保Harbor的高可用性和稳定性。
2、habor仓库部署实例
2.1 环境准备
- Harbor服务器: 192.168.80.10 (docker-ce, docker-compose, harbor-offline-v1.2.2)
- Client服务器: 192.168.80.15 (docker-ce)
2.2 部署docker compose 服务
[root@localhost ~]# yum install epel-release.noarch -y
已加载插件:fastestmirror, langpacks
Running transaction
...
已安装:
epel-release.noarch 0:7-14
完毕!
[root@localhost ~]#
#安装dockercompsoe
yum -y install docker-compose
...
作为依赖被安装:
python3.x86_64 0:3.6.8-21.el7_9 python3-libs.x86_64 0:3.6.8-21.el7_9
.....
完毕!
[root@localhost ~]#
#检查docekr-compose的版本
[root@localhost ~]# docker-compose -v
docker-compose version 1.18.0, build 8dd22a9
[root@localhost ~]#
2.3 修改habor配置文件
[root@localhost local]# tar -xf harbor-offline-installer-v1.9.2.tgz
[root@localhost local]# ls
bin games harbor-offline-installer-v1.9.2.tgz lib libexec share
etc harbor include lib64 sbin src
[root@localhost local]# cd harbor/
[root@localhost harbor]# ls
harbor.v1.9.2.tar.gz harbor.yml install.sh LICENSE prepare
[root@localhost harbor]# vim harbor.yml
[root@localhost harbor]#
###
# The IP address or hostname to access admin UI and registry service.
...
hostname: 192.168.107.186
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
...
harbor_admin_password: 12345
###
2.4 启动habor
[root@localhost harbor]# ./prepare
prepare base dir is set to /usr/local/harbor
Unable to find image 'goharbor/prepare:v1.9.2' locally
...
Generated certificate, key file: /secret/core/private_key.pem, cert file: /secret/registry/root.crt
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
[root@localhost harbor]#
#安装启动 habor
[root@localhost harbor]# ./install.sh
[Step 0]: checking installation environment ...
Note: docker version: 26.1.4
Note: docker-compose version: 1.18.0
Creating redis ... done
Creating harbor-core ... done
Creating network "harbor_harbor" with the default driver
Creating nginx ... done
Creating harbor-portal ...
Creating harbor-db ...
Creating registryctl ...
Creating redis ...
Creating registry ...
Creating harbor-core ...
Creating harbor-jobservice ...
Creating nginx ...
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://192.168.107.186.
For more details, please visit https://github.com/goharbor/harbor .
[root@localhost harbor]#
#使用docker-compose查看容器运行状态
[root@localhost harbor]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------
harbor-core /harbor/harbor_core Up
harbor-db /docker-entrypoint.sh Up 5432/tcp
harbor-jobservice /harbor/harbor_jobservice ... Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up 8080/tcp
nginx nginx -g daemon off; Up 0.0.0.0:80->8080/tcp,:::80->8080/tcp
redis redis-server /etc/redis.conf Up 6379/tcp
registry /entrypoint.sh /etc/regist ... Up 5000/tcp
registryctl /harbor/start.sh Up
[root@localhost harbor]#
2.5 浏览器访问habor
2.6 创建一个新项目
//登录 Harbor
docker login [-u admin -p Harbor12345] http://127.0.0.1
//下载镜像进行测试
docker pull nginx
//将镜像打标签
格式:docker tag 镜像:标签 仓库IP/项目名称/镜像名:标签
docker tag nginx:latest 127.0.0.1/myproject-kgc/nginx:v1
//上传镜像到 Harbor
docker push 127.0.0.1/myproject-kgc/nginx:v1
//登录
[root@localhost harbor]# docker login -u admin -p 12345 http://127.0.0.1
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@localhost harbor]#
//[root@localhost harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 9592f5595f2b 3 weeks ago 192MB
centos 7 eeb6ee3f44bd 3 years ago 204MB
...
[root@localhost harbor]# docker tag nginx:latest 127.0.0.1/gfy/nginx:v1
[root@localhost harbor]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
127.0.0.1/gfy/nginx v1 9592f5595f2b 3 weeks ago 192MB
nginx latest 9592f5595f2b 3 weeks ago 192MB
centos 7 eeb6ee3f44bd 3 years ago
....
[root@localhost harbor]# docker push 127.0.0.1/gfy/nginx:v1
The push refers to repository [127.0.0.1/gfy/nginx]
07eaefc6ebf2: Pushed
de2ef8ceb76a: Pushed
e6c40b7bdc83: Pushed
f941308035cf: Pushed
81a9d30670ec: Pushed
1bf33238ab09: Pushed
1bb35e8b4de1: Pushed
v1: digest: sha256:ccde53834eab53e85b35526a647cdb714ea4521b1ddf5a07b5c8787298d13087 size: 1778
[root@localhost harbor]#
//拉取镜像
docker pull Harbor_address/ProjectName/Repository:Tag
2.7 在其他客户端上传镜像
以上操作都是在 Harbor 服务器本地操作。如果其他客户端登录到 Harbor,就会报如下错误。出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。
#不配置任何参数直接拉取的话会报错
docker login -u admin -p Harbor12345 http://192.168.80.10
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.80.10/v2/: dial tcp 192.168.80.10:443: connect: connection refused
[root@localhost ~]# docker login -u admin -p 12345 http://192.168.107.186
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.107.186/v2/": dial tcp 192.168.107.186:443: connect: connection refused
[root@localhost ~]#
客户端配置
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.107.186 --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
#添加项
###
--insecure-registry 192.168.107.186
###
#重启docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]#
#查看docker状态
[root@localhost ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2025-07-17 15:22:22 CST; 59s ago
Docs: https://docs.docker.com
#再次测试登录
[root@localhost ~]# docker login -u admin -p 12345 http://192.168.107.186
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@localhost ~]# docker pull 192.168.107.186/gfy/nginx:v1
v1: Pulling from gfy/nginx
d0b609e4bacb: Pull complete
6c8e51cf0087: Pull complete
9bbbd7ee45b7: Pull complete
48670a58a68f: Pull complete
ce7132063a56: Pull complete
23e05839d684: Pull complete
ee95256df030: Pull complete
Digest: sha256:ccde53834eab53e85b35526a647cdb714ea4521b1ddf5a07b5c8787298d13087
Status: Downloaded newer image for 192.168.107.186/gfy/nginx:v1
192.168.107.186/gfy/nginx:v1
查看仪表盘下载次数是否有增加