【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: 443
  certificate: /your/certificate/path
  private_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 的证书。这样可以确保配置的正确性和系统的安全。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

香港立法會議員容海恩女士確定出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的飛速發展&#xff0c;全球正步入邊緣計算智能化與分布式AI深度融合的新紀元&#xff0c;共同演繹著分布式智能創新應用的壯麗篇章。在這一背景下&#xff0c;邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量…

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…

JAVA面试题---WEB部分

网络通讯 TCP与UDP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、 可靠的、 基于 IP 的传输层协议。 UDP 是 User Datagram Protocol 的简称&#xff0c;中文名是用户数据报协议&#xff0c;是 OSI 参考模 型中的传输层协议&#xff0c;它是…

【Web世界探险家】CSS美学(一)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

Django整合多种认证方式

承接上一篇&#xff1a;Django知识点总结-CSDN博客 目录 25.使用 Django REST framework实现用户认证和授权 26.通过djangorestframework-simplejwt使用JWT(JSON Web Token) 27.使用django-auth-ldap进行用户认证 28. 使用django-cas-ng实现集中认证及实现单点登录 29. …

智能家居|基于SprinBoot+vue的智能家居系统(源码+数据库+文档)

智能家居目录 基于SprinBootvue的智能家居系统 一、前言 二、系统设计 三、系统功能设计 1管理员&#xff1a;个人中心管理功能的详细实现 2管理员&#xff1a;用户信息管理功能的详细实现 3管理员&#xff1a;家具管理功能的详细实现 4管理员&#xff1a;任务管理功能…

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

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

34.Docker基本操作

镜像相关的命令 镜像名称分为两部分组成&#xff1a;[repository]:[tag],tag就是镜像的版本。如果tag没有指定默认就是latest,表示最新版本的镜像。 查看docker命令的帮助信息 docker --help 具体某条命令的帮助信息 docker images --help 案例一&#xff1a;从DockerHub中…

某米社区请求data类型multipart_form-data分析

随笔记录 之前未曾遇到请求的Content-Type:multipart/form-data; boundary=----WebKitFormBoundary9Fxpi3Dvlnhm3MKq,今天就简单是根据目标网站进行分析下,目标站点是:aHR0cHM6Ly93ZWIudmlwLm1pdWkuY29tL3BhZ2UvaW5mby9taW8vbWlvL3BjU2VhcmNoP2Zyb21QYXRobmFtZT1taW9Cb2FyZ…

使用STM32F103C8T6与蓝牙模块HC-05连接实现手机蓝牙控制LED灯

导言: 在现代智能家居系统中,远程控制设备变得越来越普遍和重要。本文将介绍如何利用STM32F103C8T6单片机和蓝牙模块HC-05实现远程控制LED灯的功能。通过这个简单的项目,可以学会如何将嵌入式系统与蓝牙通信技术相结合,实现远程控制的应用。 目录 导言: 准备工作: 硬…

gitlab设置保护分支

gitlab设置保护分支方法 进入代码仓库首页&#xff0c;找到settings下的repository并点击进入 找到Protected Branches 下的Exoand按钮&#xff0c;并点击展开 可以看到已经存在默认的保护分支&#xff0c;通常是master/main分支&#xff0c;也可以添加新的保护分支 新建保护分…

Android Studio的笔记--布局文件

关于Layout布局文件的使用 LinearLayoutRelativeLayout之前文章的内容一些常见性质在android.graphics.Color中定义了12种常见的颜色常数线性布局LinearLayout 一些常见使用文本框TextView设置文本内容编辑框EditText获取文本内容按钮Button控件使用其他按钮修改图标及名称添加…

leetCode65. 有效数字

leetCode65. 有效数字 题目思路 代码 class Solution { public:bool isNumber(string s) {int l 0, r s.size() - 1;// 1.忽略前后的空格while(l < r && s[l] ) l;while(l < r && s[r] ) r--;if(l > r) return false;s s.substr(l,r - l 1)…

在Windows中,matplotlibcpp的使用

0 前言 本篇文章记录一个c库的使用&#xff1a;matplotlib-cpp&#xff0c;其作用是在c中调用python的matplotlib&#xff0c;实现绘图操作。 对于Windows环境下使用该库的文章&#xff0c;发现文章依然存在一些问题&#xff0c;总是存在报错不能解决&#xff0c;花费了较多的…

RCE学习

从最近的xyctf中&#xff0c;最大的感受就是自己的rce基础并不牢固&#xff0c;所以马上来恶补一下 漏洞成因 php和其他语言有很多能够执行系统命令或执行其他php代码的函数&#xff0c;因为开发者的使用不当&#xff0c;使得用户能够控制传递给执行命令的函数的参数&#xf…

windows驱动开发-PNP管理器

PNP技术是由Microsoft提出的&#xff0c;英文Plug and play的缩写&#xff0c;中译即插即用&#xff0c;意思是系统自动侦测周边设备和板卡并自动安装设备驱动程序&#xff0c;做到插上就能用&#xff0c;无须人工干预&#xff0c;是Windows自带的一项技术。所谓即插即用是指将…

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

【抽代复习笔记】17-群(十一):置换的练习题(1)

练习1&#xff1a;计算&#xff1a; 解&#xff1a; 解析&#xff1a;①左边的置换是1保持不变&#xff0c;2变成3&#xff0c;3变成4&#xff0c;4变成5&#xff0c;5变成2&#xff0c;因此可以简写为(2345)&#xff1b;右边的置换是2和5保持不变&#xff0c;1变成3&#xff…

IDEA 2022.1版本开始,可以直接运行Markdown里的命令行

参照这种格式&#xff1a; shell mvn clean install注意idea支持的版本&#xff1a;是从 2022.1版本开始的。 ps&#xff1a;之前有人写过了&#xff0c;感觉很实用但是蛮多开发者不一定会知道的功能。 参考资料&#xff1a; https://www.cnblogs.com/didispace/p/16144107.h…

【docker】maven 打包docker的插件学习

docker-maven-plugin GitHub地址&#xff1a;https://github.com/spotify/docker-maven-plugin 您可以使用此插件创建一个 Docker 映像&#xff0c;其中包含从 Maven 项目构建的工件。例如&#xff0c;Java 服务的构建过程可以输出运行该服务的 Docker 映像。 该插件是 Spot…