本博文介绍了开源的本地部署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镜像仓库的详细介绍:
主要功能
- 镜像存储:Harbor可以存储容器镜像,包括Docker镜像、Kubernetes镜像和其他类型的镜像。
- 镜像管理:Harbor提供了对镜像的管理功能,包括镜像上传、下载、删除、更新和搜索等。
- 用户身份验证:Harbor支持多种身份验证方法,包括LDAP、Active Directory和Local DB等。
- 访问控制:Harbor提供了对镜像的访问控制功能,包括权限控制、角色管理和访问日志记录等。
- 镜像扫描:Harbor支持对镜像的扫描和分析,包括CVE扫描、Vulnerability扫描和依赖关系分析等。
- 镜像回滚:Harbor提供了对镜像的回滚功能,包括镜像版本管理和回滚到指定版本。
主要组件
- Registry:Harbor的 Registry 组件负责存储和管理容器镜像。
- Web UI:Harbor的 Web UI 组件提供了对镜像的管理界面,包括上传、下载、删除、更新和搜索等操作。
- Rest API:Harbor的 Rest API 组件提供了一个RESTful API,用于访问和管理镜像。
- Core:Harbor的 Core 组件负责处理镜像的上传、下载、删除、更新和扫描等操作。
优点
- 高可用性:Harbor提供了高可用性,包括负载均衡、热备份和自动故障转移等功能。
- 安全性:Harbor提供了强大的安全性,包括身份验证、访问控制和加密等功能。
- 灵活性:Harbor支持多种镜像格式和多种平台,包括Docker、Kubernetes和其他类型的镜像。
- 可扩展性:Harbor提供了可扩展性,包括支持多个存储节点和负载均衡等功能。
常见用途
- 企业内部镜像仓库:Harbor可以用作企业内部的镜像仓库,用于存储和管理容器镜像。
- 公共镜像仓库:Harbor可以用作公共的镜像仓库,用于共享和分发容器镜像。
- 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 的证书。这样可以确保配置的正确性和系统的安全。