【DOCKER】-7 Habor镜像仓库的部署

发布于:2025-07-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

habor镜像仓库

1、habor简介

Harbor是VMware公司开源的企业级Docker Registry项目,旨在帮助用户快速搭建一个企业级的Docker Registry服务。
基础:Harbor以Docker公司开源的Registry为基础,并扩展了多种企业所需的功能,如图形管理UI、基于角色的访问控制等。
组件构建:Harbor的每个组件都是以Docker容器的形式构建的,使用docker-compose进行部署。

1.1 特性

  1. 基于角色控制:用户和仓库都是基于项目进行组织的,用户在项目中可以拥有不同的权限。
  2. 镜像复制策略:镜像可以在多个Harbor实例之间进行复制(同步),适用于负载均衡、高可用、混合云和多云等场景。
  3. LDAP/AD支持:Harbor可以集成企业内部已有的AD/LDAP,用于对已经存在的用户进行认证和管理。
  4. 图形化用户界面:用户可以通过浏览器浏览、搜索镜像仓库,并对项目进行管理。
  5. 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  6. RESTful API支持:提供给管理员对Harbor的更多操控,使得与其他管理软件集成变得更容易。
  7. 镜像删除和垃圾回收:支持镜像的删除操作,并可以回收镜像占用的空间。

1.2 habor的构成

Harbor在架构上主要有以下几个组件:

  • Proxy:一个nginx的前端代理,负责将来自浏览器、docker clients的请求转发到后端不同的服务上。
  • Registry:负责储存Docker镜像,并处理Docker push/pull命令。同时,它会强制用户的每次Docker pull/push请求都要携带一个合法的Token,并通过公钥对Token进行解密验证。
  • Core services:Harbor的核心功能组件,主要提供UI、WebHook和Token服务。
  1. UI(harbor-ui):提供图形化界面,帮助用户管理Registry上的镜像,并对用户进行授权。
  2. WebHook:及时获取Registry上image状态变化的情况,并把状态变化传递给UI模块。
  3. 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部署与管理

  1. 部署前准备

    确保已经安装了Docker引擎(版本在1.10或以上)、Python(版本在2.7或以上)和Docker Compose(版本在1.6.0或以上)。从Harbor的官方网站或GitHub仓库下载Harbor的安装包,并解压到本地。

  2. 部署Harbor服务

    在解压后的目录中,找到并编辑harbor.yml或harbor.cfg文件,进行必要的配置。配置项包括数据库连接信息、管理员密码、hostname(用于访问用户界面和register服务的IP地址或完全限定的域名)等。运行install.sh脚本进行安装。脚本会进行一系列的配置和部署工作,包括创建数据库、生成证书等。安装完成后,通过运行相应命令启动Harbor服务。

  3. 管理Harbor

    启动成功后,可以通过浏览器访问Harbor的管理界面(默认地址通常是http://),并使用初始用户名admin和密码登录。登录后,可以创建自己的镜像仓库,并开始使用Harbor进行容器镜像的管理和分发。在管理界面中,还可以进行用户管理、权限设置、审计日志查看等操作。

  4. 维护与更新

    需要定期备份数据和配置信息,以防止数据丢失和意外情况的发生。需要及时更新和维护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

查看仪表盘下载次数是否有增加

请添加图片描述


网站公告

今日签到

点亮在社区的每一天
去签到