Demo环境私有容器镜像仓库Harbor升级过程记录

本文记录了在一个Kubernetes环境中的Harbor私有容器镜像仓库升级过程,主要目的是启用镜像安全漏洞扫描功能。升级过程中涉及了Docker Swarm部署带Clair的Harbor,以及通过直接连接Clair暴露的端口来实现安全扫描。文章详细描述了备份、升级、配置修改等步骤,并探讨了在Demo环境中的部署策略。

Demo环境私有容器镜像仓库Harbor升级过程记录

在某朵月底即将随风飘散的云中,我搭建有一个Kubernetes环境,一个容器Demo环境。前段时间,看到VMware公司对其开源Docker镜像仓库实现Harbor做了许多升级,尤其增加了对镜像安全漏洞的扫描,因此就尝试着升了下级,现在整理下当时粗略记录的过程步骤。

因公司面向的主要客户目前对应用容器化还没有需求,对微服务的需求还集中于求业绩亮点,所以对容器及容器平台没有强烈需求,只做为技术探索及方案储备来源的Demo环境存在,因此下面描述的部署方案可能不够严谨,见谅!

Harbor简介

上面已经提到Harbor是开源的容器镜像仓库实现,它对Docker官方提供的Registry做了企业化功能扩展与增强,主要的特点包括 :

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

具体的请参见其在GitHub上的文档:here,它的架构组成如下图:

Proxy:反射代理,将请求路由到相应功能模块,由Nginx实现;Registry:存储镜像并处理docker pull/push命令,与token服务交互控制访问权限,由Docker官方Register实现;UI:核心服务组件,Harbor的主要组成部分;Database:存储有关项目、用户、角色、复制策略与镜像元数据;Job Servers:最初版本中完成镜像复制任务,后面又增加了镜像安全漏洞描述任务;Log collector:这个就不用细说了吧,日志模块,以syslog服务形式收取其他模块日志内容,落地持久化。

部署方案

在我原有的Demo环境中,在两只虚拟机上各布置了一套Harbor,从其中一个Harbor向另一个Harbor做镜像复制,以防虚拟机意外损毁丢失镜像,正因为是个Demo环境,也就根本没有考虑太多其他高可用,只是利用Harbor默认的docker-compose配置脚本在每只虚拟机上启动全套的组件。
这里写图片描述
当初布置的版本中,并不包含镜像安全漏洞描述功能,这次升级主要是想体验下这个功能。当正视此功能时,才发现需要联接互联网获取安全漏洞元数据。也就是Clair需要联网,Clair也是个开源实现,Harbor集成进来实现安全漏洞描述功能:
这里写图片描述
而在布置Demo环境的这朵云上,默认是不开启互联网,整个环境中,只有一只虚拟机开启了连接互联网的权限,但,不是布置Harbor的两只虚拟机之一。为解决这个问题,考虑将Clair组件单独部署到那只能连接互联网的虚拟机上,在整个部署尝试中采用了两种方式:
1. Docker Swarm方式
Harbor 1 与 Clair 节点 组成docker Swarm集群,指定Clair应用及数据库部署在能连接外网的节点,指定Harbor原有组件部署在原有节点;
2. 容器端口宿主机暴露方式
Clair应用及数据库端口暴露成主机端口,Harbor 2的组件,通过暴露的端口连接Clair,需要Clair应用与数据库地址以Harbor指定的主机名引入容器/etc/hosts文件。
这里写图片描述

部署操作步骤

升级Harbor

升级主要过程参照于Harbor官方文档:migration_guide

  • 在原部署Harbor的节点上,拖取已经在私有仓库里准备好的Harbor升级镜像
work> docker pull oracle-1.udmp.git.com.cn/vmware/harbor-db-migrator:1.3

准备升级到哪一个版本,就准备那个版本的升级镜像,我准备升级到Harbor 1.3,就准备了harbor-db-migrator:1.3

  • 停止并备份Harbor

    work> cd harbor
    work> docker-compose down 
    work> cd ..
    
    work> mv harbor harbor_bak
  • 备份MySQL数据库数据

    work> docker run -ti --rm -e DB_USR=root -e DB_PWD=root123 -v /data/database:/var/lib/mysql -v /home/work/harbor_bak/db_backup:/harbor-migration/backup oracle-1.udmp.git.com.cn/vmware/harbor-db-migrator:1.3 backup

    其中:/home/work/harbor_bak/db_backup是宿主机上实际数据备份目录;

    ​ /harbor-migration/backup是Docker容器内部目录,上面命令行将宿主机目录m

<think>我们正在处理用户的问题:“我想将镜像推送到Harbor仓库 请问how to push docker image to harbor” 根据用户的问题,我们需要提供将Docker镜像推送到Harbor仓库的步骤。同时,我们参考了站内引用[1]和[2]中的命令示例。 步骤分解: 1. 确保Docker服务已启动。 2. 登录到Harbor仓库。 3. 构建或标记一个现有的Docker镜像,使其符合Harbor仓库的命名规范(即包含Harbor仓库的地址、项目名和镜像名)。 4. 推送镜像到Harbor仓库。 5. 登出Harbor仓库(可选)。 注意:Harbor仓库的镜像命名规范为:<Harbor地址>/<项目名>/<镜像名>:<标签> 参考引用[1]中的命令: sudo service docker start docker login -u "userid" -p "password" harbor.xxx.com docker build -f Dockerfile -t "harbor.xxx.com/demo/my-app.job:develop-00001" . docker push "harbor.xxx.com/demo/my-app.job:develop-00001" docker logout "harbor.xxx.com" 参考引用[2]中的命令: docker login -u admin -p Harbor12345 123.123.123.123 docker pull nginx:latest docker tag nginx:latest 123.123.123.123/cloudnativesecurity/nginx:latest docker push 123.123.123.123/cloudnativesecurity/nginx:latest 因此,我们可以总结两种方式: 方式一:直接构建镜像到目标仓库的标签(如引用[1]) 方式二:从现有镜像重新打标签(如引用[2]) 下面我们按照步骤详细说明。</think>### 如何将 Docker 镜像推送到 Harbor 仓库 以下是详细操作步骤(以 Linux/WSL 环境为例): #### 1. **启动 Docker 服务** 确保 Docker 守护进程已运行: ```bash sudo service docker start # 启动服务 sudo docker info # 验证状态 ``` #### 2. **登录 Harbor 仓库** 使用 Harbor 账户认证(替换 `[用户名]`、`[密码]`、`[Harbor地址]`): ```bash docker login -u [用户名] -p [密码] [Harbor地址] ``` > 示例: > `docker login -u admin -p Harbor12345 harbor.example.com`[^2] #### 3. **标记镜像** 为镜像添加 Harbor 仓库路径(格式:`[Harbor地址]/[项目名]/[镜像名]:[标签]`): ```bash docker tag [原镜像名]:[标签] [Harbor地址]/[项目名]/[镜像名]:[新标签] ``` > 示例: > `docker tag nginx:latest harbor.example.com/cloudnativesecurity/nginx:prod-v1`[^2] #### 4. **推送镜像到 Harbor** ```bash docker push [Harbor地址]/[项目名]/[镜像名]:[标签] ``` > 示例: > `docker push harbor.example.com/cloudnativesecurity/nginx:prod-v1` #### 5. **验证结果** - 登录 Harbor Web 控制台 → 进入对应项目 → 检查镜像列表 - 或使用 CLI 检查: ```bash docker pull [Harbor地址]/[项目名]/[镜像名]:[标签] # 测试拉取 ``` #### 6. **登出 Harbor(可选)** ```bash docker logout [Harbor地址] ``` --- ### 关键注意事项 1. **镜像命名规范** Harbor 要求镜像路径必须包含 **项目名**(如 `cloudnativesecurity`)。若项目不存在,需先在 Web 控制台创建[^2]。 2. **安全建议** - 避免使用基础镜像(如 `alpine`)直接部署,优先选择官方维护的安全镜像[^3] - 敏感操作建议使用 `--password-stdin` 避免密码泄露: ```bash echo "[密码]" | docker login -u [用户名] --password-stdin [Harbor地址] ``` 3. **常见错误处理** - **权限拒绝** → 检查用户是否拥有目标项目的 `推送` 权限 - **TLS 证书错误** → 将 Harbor 的 CA 证书放入 `/etc/docker/certs.d/[Harbor地址]` --- ### 相关问题 1. 如何解决推送镜像到 Harbor 时的 `x509: certificate signed by unknown authority` 错误? 2. Harbor 中的项目访问权限有哪几种?如何为团队分配不同的镜像管理权限? 3. 如何通过 KubernetesHarbor 私有仓库拉取镜像?[^4] --- > 引用说明: > [^1]: Docker 服务启动及镜像推送流程示例 > [^2]: Harbor 镜像标记与推送操作规范 > [^3]: 容器镜像安全最佳实践 > [^4]: Kubernetes 使用私有仓库的配置方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值