【DevOps】发布自建镜像到Harbor镜像仓库

本博文介绍了开源的本地部署Docker镜像仓库Harbor, 并讲解怎么样在ubuntu20.04上安装配置Harbor,最后用一个Web应用发布成镜像,推送到镜像仓库的例子结尾。学习本博文并按照步骤进行操作,你将掌握搭建本地镜像仓库,并将生成的docker镜像发布到仓库的过程。

目录

一、Harbor介绍

主要功能

主要组件

优点

常见用途

二、Harbor安装

1、先更新系统并安装必要的依赖

2、下载最新版本的 Harbor

3、配置 harbor.yml 文件

4、生成自签名证书

5、使用 install.sh 脚本安装 Harbor:

6、配置自启动

7、启动 Harbor

8、访问 Harbor

三、发布一个Docker镜像到Harbor仓库

 1、创建 HelloWorld 网页

2、创建 Dockerfile

3、构建 Docker 镜像

4、登录 Harbor 仓库

5、创建Harbor项目

6、标记并推送镜像到 Harbor

四、遇到的问题和解决办法

 1、使用正确的 SANs 重新生成证书

2、 临时信任自签名证书

3、 禁用 Docker 的证书验证(不推荐)

注意


一、Harbor介绍

Harbor是一个开源的容器镜像仓库管理系统,旨在帮助用户管理和维护容器镜像。Harbor可以在多个平台上运行,包括Linux、Windows和Mac OS X。下面是Harbor镜像仓库的详细介绍:

主要功能

  1. 镜像存储:Harbor可以存储容器镜像,包括Docker镜像、Kubernetes镜像和其他类型的镜像。
  2. 镜像管理:Harbor提供了对镜像的管理功能,包括镜像上传、下载、删除、更新和搜索等。
  3. 用户身份验证:Harbor支持多种身份验证方法,包括LDAP、Active Directory和Local DB等。
  4. 访问控制:Harbor提供了对镜像的访问控制功能,包括权限控制、角色管理和访问日志记录等。
  5. 镜像扫描:Harbor支持对镜像的扫描和分析,包括CVE扫描、Vulnerability扫描和依赖关系分析等。
  6. 镜像回滚:Harbor提供了对镜像的回滚功能,包括镜像版本管理和回滚到指定版本。

主要组件

  1. Registry:Harbor的 Registry 组件负责存储和管理容器镜像。
  2. Web UI:Harbor的 Web UI 组件提供了对镜像的管理界面,包括上传、下载、删除、更新和搜索等操作。
  3. Rest API:Harbor的 Rest API 组件提供了一个RESTful API,用于访问和管理镜像。
  4. Core:Harbor的 Core 组件负责处理镜像的上传、下载、删除、更新和扫描等操作。

优点

  1. 高可用性:Harbor提供了高可用性,包括负载均衡、热备份和自动故障转移等功能。
  2. 安全性:Harbor提供了强大的安全性,包括身份验证、访问控制和加密等功能。
  3. 灵活性:Harbor支持多种镜像格式和多种平台,包括Docker、Kubernetes和其他类型的镜像。
  4. 可扩展性:Harbor提供了可扩展性,包括支持多个存储节点和负载均衡等功能。

常见用途

  1. 企业内部镜像仓库:Harbor可以用作企业内部的镜像仓库,用于存储和管理容器镜像。
  2. 公共镜像仓库:Harbor可以用作公共的镜像仓库,用于共享和分发容器镜像。
  3. CI/CD Pipeline:Harbor可以用作CI/CD Pipeline的镜像仓库,用于存储和管理构建后的容器镜像。

Harbor是一个功能强大且灵活的容器镜像仓库管理系统,适用于企业内部镜像仓库、公共镜像仓库和CI/CD Pipeline等场景。

二、Harbor安装

以下是在 Ubuntu 20.04 上安装 Harbor 的过程:

1、先更新系统并安装必要的依赖

sudo apt update -y
sudo apt install -y docker.io docker-compose curl

2、下载最新版本的 Harbor

curl -L https://github.com/goharbor/harbor/releases/download/v2.10.2/harbor-offline-installer-v2.10.2.tgz -o harbor.tgz
tar xzf harbor.tgz
mv harbor /usr/local
cd /usr/local/harbor
cp harbor.yml.tmpl harbor.yml

3、配置 harbor.yml 文件

修改 harbor.yml 文件,设置 hostname 以及其他相关配置。例如:

hostname: your.domain.com
http:port: 80
https:port: 443certificate: /your/certificate/pathprivate_key: /your/private/key/path
harbor_admin_password: yourpassword
database:password: yourpassword

如果你打算使用 HTTP 而不是 HTTPS(不推荐在生产环境中),确保调整相应配置。

4、生成自签名证书

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/harbor.key -out /etc/ssl/certs/harbor.crt -subj "/CN=<your harbor domain or IP>"

5、使用 install.sh 脚本安装 Harbor:

sudo ./install.sh

这个脚本会自动处理所有的配置和安装步骤。

Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-portal ... done
Creating harbor-db     ... done
Creating registryctl   ... done
Creating registry      ... done
Creating redis         ... done
Creating harbor-core   ... done
Creating nginx             ... done
Creating harbor-jobservice ... done
✔ ----Harbor has been installed and started successfully.----

6、配置自启动

  • 创建 Systemd 文件:首先,你需要创建一个 Systemd 服务单元文件,使得 Harbor 可以作为服务被管理。以下是一个示例的 Systemd 服务文件,通常放置于 /etc/systemd/system/ 目录下,比如命名为 harbor.service:

    sudo vi /etc/systemd/system/harbor.service
    

    然后添加以下内容:

    [Unit]
    Description=Harbor Container Registry
    After=network.target docker.service
    Requires=docker.service[Service]
    Type=simple
    Restart=always
    RestartSec=5
    ExecStart=/usr/bin/docker-compose -f /usr/local/harbor/docker-compose.yml up
    ExecStop=/usr/bin/docker-compose -f /usr/local/harbor/docker-compose.yml down[Install]
    WantedBy=multi-user.target
    

    请确保将 /usr/local/harbor/ 替换为你的 Harbor 安装目录的实际路径。

  • 启用和启动服务:创建完服务文件后,需要重新加载 Systemd 以读取新的服务文件,然后启用并启动 Harbor 服务:

    sudo systemctl daemon-reload
    sudo systemctl enable harbor.service
    sudo systemctl start harbor.service
    
  • 检查服务状态:为了确认 Harbor 服务正在运行,你可以使用以下命令检查其状态:

    sudo systemctl status harbor.service
    

注意事项

  • 确保 Docker 和 Docker Compose 的路径正确无误。如果不确定,可以通过 which docker-compose 命令查看 Docker Compose 的实际安装路径。
  • 上述 Systemd 配置中的 Restart=always 和 RestartSec=5 指令确保在服务失败后自动尝试重启服务。
  • 如果 Harbor 需要使用 HTTPS 或其他服务,确保相应的端口已经在防火墙中开放。

7、启动 Harbor

sudo systemctl start harbor

8、访问 Harbor

在浏览器中访问 https://<your harbor domain or IP> 即可访问 Harbor 的管理界面。

注意:Harbor 默认使用 80 和 443 端口,如果你的服务器上已经有其他服务使用了这两个端口,需要在 /usr/local/harbor/harbor.yml 中修改 http_port 和 https_port 的值为其他未使用的端口号。

三、发布一个Docker镜像到Harbor仓库

我们现在做一个简单的helloworld网页,然后使用nginx作为web应用服务器,做成docker镜像,发布到我们刚刚安装的harbor仓库当中。为了完成这个任务,我们将经历以下几个步骤:

  • 创建一个简单的 HelloWorld 网页。
  • 使用 Docker 创建一个包含 Nginx 和该网页的镜像。
  • 将这个镜像推送到 Harbor 仓库。

 1、创建 HelloWorld 网页

首先,创建一个简单的 HTML 文件 index.html

<!DOCTYPE html>
<html>
<head><title>Hello World</title>
</head>
<body><h1>Hello World!</h1>
</body>
</html>

2、创建 Dockerfile

接下来,创建一个 Dockerfile 来定义你的 Docker 镜像:

# 使用官方的 Nginx 基础镜像
FROM nginx:latest# 将自定义的 index.html 文件复制到 Nginx 的默认网页目录
COPY index.html /usr/share/nginx/html/index.html# 暴露 80 端口
EXPOSE 80

这个 Dockerfile 从官方的 Nginx 镜像开始,将我们的 index.html 文件复制到 /usr/share/nginx/html/,这是 Nginx 配置的默认位置来提供内容。它还暴露了端口 80,这是 Nginx 的默认 HTTP 端口。

3、构建 Docker 镜像

在包含 Dockerfile 和 index.html 的目录中运行以下命令来构建 Docker 镜像:

docker build -t my-helloworld-nginx .

4、登录 Harbor 仓库

在推送镜像之前,你需要登录到 Harbor。使用以下命令(替换成你的 Harbor 地址和凭据):

docker login https://192.169.110.170 -u <your-username> -p <your-password>

5、创建Harbor项目

web界面登陆harbor管理界面,然后创建项目

填好项目名,我们这里填test,然后选确定。

完成项目的创建

6、标记并推送镜像到 Harbor

在推送镜像到 Harbor 之前,你需要为镜像添加合适的标签:

docker tag my-helloworld-nginx 192.168.110.170/test/my-helloworld-nginx:latest

然后,使用以下命令推送镜像:

docker push 192.168.110.170/test/my-helloworld-nginx:latest

确保替换192.168.110.17 和 test 为你的 Harbor 实例的 URL 和你的项目名。

现在你已经成功地创建了一个 HelloWorld 网页的 Docker 镜像,并且使用 Nginx 作为服务器,最后将它推送到了 Harbor 仓库。你可以通过配置 Kubernetes 或其他容器编排工具来部署这个镜像,以在实际环境中提供服务。

四、遇到的问题和解决办法

在第三部分使用docker登陆harbor服务时,因为我们使用的是自签名证书,因此可能会出现问题。

#docker login https://192.168.110.170 -u admin -p Harbor12345
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.110.170/v2/": tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead

错误提示“certificate relies on legacy Common Name field, use SANs instead”意味着证书使用了已经不被推荐使用的 Common Name (CN) 字段进行身份验证,而现代的 TLS 实现应该使用 Subject Alternative Name (SAN) 字段。

解决这个问题通常有几种方法:

 1、使用正确的 SANs 重新生成证书

如果您有权限并能重新生成用于 Harbor 的 TLS 证书,确保在生成证书时包括 SANs。这可以通过在 OpenSSL 配置中指定 SANs 来完成。例如,当您创建证书请求(CSR)时,可以在 OpenSSL 的配置文件中添加如下内容:

[req]
req_extensions = v3_req[ v3_req ]
subjectAltName = @alt_names[ alt_names ]
DNS.1 = harbor.mydomain.com
IP.1 = 192.168.110.170

然后,使用这个配置文件生成您的 CSR 和证书。

2、 临时信任自签名证书

如果您无法重新生成证书,一种临时的解决方案是将您的自签名证书添加到 Docker 客户端的信任存储中。这样 Docker 将信任 Harbor 的证书,即使它是自签名的。根据您的操作系统,这个过程可能会有所不同。

对于 Linux:

  • 将您的证书复制到 /etc/docker/certs.d/192.168.110.170/ 目录中,假设证书文件名是 ca.crt:

    sudo mkdir -p /etc/docker/certs.d/192.168.110.170/
    sudo cp path/to/your/ca.crt /etc/docker/certs.d/192.168.110.170/
    
  • 重启 Docker 服务:

    sudo systemctl restart docker
    

对于 Windows 或 MacOS:

您需要将证书导入到系统的信任证书存储中。具体步骤取决于操作系统。

3、 禁用 Docker 的证书验证(不推荐)

作为最后的手段,您可以配置 Docker 客户端忽略 TLS 验证。这不是一个推荐的做法,因为它降低了安全性。但是如果您只是进行测试,可以临时这么做:

在 Docker 的配置文件 daemon.json 中添加 "insecure-registries" 字段:

{"insecure-registries" : ["192.168.110.170"]
}

重启 Docker 服务使配置生效。

注意

这些方法中,首选是生成包含正确 SANs 的证书。这样可以确保配置的正确性和系统的安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 实现重新映射(53)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 实现霍夫圆变换(52) 下一篇 :OpenCV实现仿射变换(54) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 一个。使用 OpenCV 函数 cv&#xff1a;&#xff1a;remap 实现简…

STM32——点亮第一个LED灯

代码示例&#xff1a; #include "stm32f10x.h" // Device headerint main() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitSt…

c# winform快速建websocket服务器源码 wpf快速搭建websocket服务 c#简单建立websocket服务 websocket快速搭建

完整源码下载----->点击 随着互联网技术的飞速发展&#xff0c;实时交互和数据推送已成为众多应用的核心需求。传统的HTTP协议&#xff0c;基于请求-响应模型&#xff0c;无法满足现代Web应用对低延迟、双向通信的高标准要求。在此背景下&#xff0c;WebSocket协议应运而生…

【51单片机普中板子74LS138+245+573可调时钟整点蜂鸣中级应用】2022-12-7

缘由用51单片机普中开发板实现数字时钟-嵌入式-CSDN问答 #include "reg52.h" //定义按键 sbit key0P3^0; sbit key1P3^1; sbit key2P3^2; sbit key3P3^3; //定义数码管位驱运位 sbit L1P2^2; sbit L2P2^3; sbit L3P2^4; sbit beepP2^5; unsigned char code ShuMaGua…

一周零碎时间练习微服务(nacos,rq,springcloud,es等)内容

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

ThreeJS:项目搭建

介绍如何基于Vite、Vue、React构建ThreeJS项目。 Vite项目 1. 初始化项目&#xff0c;命令&#xff1a;npm init vitelatest&#xff0c; 2. 安装依赖&#xff0c;命令&#xff1a;npm install&#xff0c; 3. 启动项目&#xff0c;命令&#xff1a;npm run dev。 4. 样式初始…

【LeetCode刷题记录】简单篇-94-二叉树的中序遍历

【题目描述】 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 【测试用例】 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例2&#xff1a; 输入&#xff1a;root [ ] 输出&#xff1a;[ ] 示例3&#xff1a; 输入…

ThreeJS:本地部署官网文档与案例

部署方式 部署之前请确保已经配置好node.js环境。 1. 下载ThreeJS源码 ThreeJS的GitHub地址&#xff1a;GitHub - mrdoob/three.js: JavaScript 3D Library.&#xff0c;可以简单查看ThreeJS当前版本&#xff1a;r164&#xff0c; 我们可以选择对应的版本&#xff08;此处为r1…

win11 Terminal 部分窗口美化

需求及分析&#xff1a;因为在 cmd、anaconda prompt 窗口中输入命令较多&#xff0c;而命令输入行和输出结果都是同一个颜色&#xff0c;不易阅读&#xff0c;故将需求定性为「美化窗口」。 美化结束后&#xff0c;我在想是否能不安装任何软件&#xff0c;简单地通过调整主题颜…

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

现在距离2024年初中生古诗文大会还有四个多月时间&#xff0c;备考要趁早&#xff0c;因为知识点还是相对比较多的。这些知识点对于初中语文的学习也是很有帮助的。 我们继续来看10道历年真题&#xff0c;这些真题来自于过去历年真题的去重、汇总&#xff0c;每道题都有参考答…

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读&#xff0c;学习本章前&#xff0c;可以先去看看基础篇&#xff1a;1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战&#xff0c;关于sqlilabs靶场的搭建&#xff1a;Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap&#xff0c;关于sqlmap的命令&…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

文章目录 Redis分布式锁原理1.使用set的命令时&#xff0c;同时设置过期时间2.使用lua脚本&#xff0c;将加锁的命令放在lua脚本中原子性的执行 Jedis分布式锁实现pom.xmlRedisCommandLock.javaRedisCommandLockTest.java 锁过期问题1乐观锁方式&#xff0c;增加版本号(增加版本…

Python面试十问

一、深浅拷贝的区别&#xff1f; 浅拷⻉&#xff1a; 拷⻉的是对象的引⽤&#xff0c;如果原对象改变&#xff0c;相应的拷⻉对象也会发⽣改变。 深拷⻉&#xff1a; 拷⻉对象中的每个元素&#xff0c;拷⻉对象和原有对象不在有关系&#xff0c;两个是独⽴的对象。 浅拷⻉(c…

探索高级聚类技术:使用LLM进行客户细分

在数据科学领域&#xff0c;客户细分是理解和分析客户群体的重要步骤。最近&#xff0c;我发现了一个名为“Clustering with LLM”的GitHub仓库&#xff0c;它由Damian Gil Gonzalez创建&#xff0c;专门针对这一领域提供了一些先进的聚类技术。在这篇文章中&#xff0c;我将概…

【数据库主从架构】

【数据库主从架构】 1. 什么是数据库的主从架构1.1 主从复制1.1.1 MySQL的主从主从复制技术三级目录 1. 什么是数据库的主从架构 随着公司业务线的增多&#xff0c;各种数据都在迅速增加&#xff0c;并且数据的读取流量也大大增加&#xff0c;就面临着数据安全问题&#xff0c;…

06.Git远程仓库

Git远程仓库 #仓库种类&#xff0c;举例说明 github gitlab gitee #以这个仓库为例子操作登录码云 https://gitee.com/projects/new 创建仓库 选择ssh方式 需要配置ssh公钥 在系统上获取公钥输入命令&#xff1a;ssh-keygen 查看文件&#xff0c;复制公钥信息内…

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志&#xff1a;Logstash 2、存储日志&#xff1a;Elasticsearch 3、展示日志&#xff1a;Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…

2024-05-02 商业分析-杭州小万科技-商业模式分析

摘要: 对杭州小万科技的商业模式进行分析,以对其做出客观的评估。 杭州小万科技的资料: 杭州小万科技有限公司 - 企知道 (qizhidao.com) 杭州小万科技有限公司网站备案查询 - 天眼查 (tianyancha.com) 杭州小万科技有限公司 - 爱企查 (baidu.com) ​ 2023年年报:

SMB 协议详解之-TreeID原理和SMB数据包分析技巧

在前面分析SMB协议数据包的过程中,这里,可以看到在SMB协议中存在很多的ID,即Unique Identifiers。那么这些ID表示什么含义?在实际分析数据包的过程中如何根据这些ID进行过滤分析?本文将介绍SMB/SMB2中的tree id ,并介绍如何通过tree id 快速的分析SMB数据包中各种命令交互…