Docker-Harbor 私有仓库部署与管理【docker (五)】

目录

[1 搭建本地私有仓库](#1 搭建本地私有仓库)

[1.1 下载 registry 镜像](#1.1 下载 registry 镜像)

[1.2 配置 Docker 守护进程](#1.2 配置 Docker 守护进程)

[1.3 运行 Registry 容器](#1.3 运行 Registry 容器)

[1.4 Docker 容器的重启策略](#1.4 Docker 容器的重启策略)

[1.5 为镜像打标签](#1.5 为镜像打标签)

[1.6 上传镜像到私有仓库](#1.6 上传镜像到私有仓库)

[1.7 列出私有仓库的所有镜像](#1.7 列出私有仓库的所有镜像)

[1.8 获取镜像的所有 Tag](#1.8 获取镜像的所有 Tag)

[1.9 测试私有仓库下载镜像](#1.9 测试私有仓库下载镜像)

[2 Harbor 简介](#2 Harbor 简介)

[2.1 什么是 Harbor](#2.1 什么是 Harbor)

[2.2 Harbor 特性](#2.2 Harbor 特性)

[2.3 Harbor 架构](#2.3 Harbor 架构)

[3 部署 Harbor 服务](#3 部署 Harbor 服务)

[3.1 安装 Docker Compose](#3.1 安装 Docker Compose)

[3.2 下载 Harbor 安装包](#3.2 下载 Harbor 安装包)

[3.3 修改 Harbor 配置文件](#3.3 修改 Harbor 配置文件)

[3.4 启动 Harbor](#3.4 启动 Harbor)

[3.5 查看 Harbor 启动状态](#3.5 查看 Harbor 启动状态)

[3.6 创建一个新项目](#3.6 创建一个新项目)

[4 客户端上传镜像](#4 客户端上传镜像)

[4.1 配置 Docker 客户端](#4.1 配置 Docker 客户端)

[4.2 创建 Harbor 用户](#4.2 创建 Harbor 用户)

[4.3 查看日志](#4.3 查看日志)

[4.4 移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移](#4.4 移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移)

[4.5 如需重新部署,需要移除 Harbor 服务容器全部数据](#4.5 如需重新部署,需要移除 Harbor 服务容器全部数据)


1 搭建本地私有仓库

1.1 下载 registry 镜像

私有镜像仓库的核心是 Docker Registry,我们通过以下命令下载官方的 registry 镜像:

docker pull registry

1.2 配置 Docker 守护进程

为了能够与我们搭建的私有仓库进行交互,我们需要配置 Docker 的守护进程,让其支持连接不安全的私有镜像仓库。

编辑 Docker 配置文件 /etc/docker/daemon.json,并添加私有仓库地址:

vim /etc/docker/daemon.json

在该文件中加入如下内容:

bash 复制代码
{
  "insecure-registries": ["192.168.10.14:5000"],   # 允许访问的私有仓库地址,注意用逗号结尾
  "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]  # 阿里云 Docker 镜像加速器地址
}

修改完后重启 Docker 服务:

systemctl daemeo-relaod

systemctl restart docker.service

1.3 运行 Registry 容器

通过 Docker 运行一个 registry 容器,指定本地存储路径和端口映射:

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

  • -itd:在容器中启动一个伪终端,进行交互,并让容器在后台运行。
  • -v /data/registry:/var/lib/registry:将宿主机的 /data/registry 目录挂载到容器内的
  • /var/lib/registry 目录,用于存储镜像数据,保证数据的持久化。
  • -p 5000:5000:将宿主机的 5000 端口映射到容器内的 5000 端口,提供访问入口。
  • --restart=always:配置容器在停止后自动重启。
  • --name registry:容器命名为 registry。
  • registry:latest:使用官方镜像 registry 来创建容器。

1.4 Docker 容器的重启策略

Docker 支持几种容器重启策略:

  • no:容器退出时不自动重启。
  • on-failure:仅当容器非正常退出时(即返回错误代码)才重启。
  • on-failure:3:最多重启 3 次,如果容器失败 3 次,则不再重启。
  • always:容器退出时总是自动重启。
  • unless-stopped:容器退出时总是自动重启,除非 Docker 服务停止时容器已经停止。

1.5 为镜像打标签

上传镜像到私有仓库前,我们需要给本地镜像打上标签,标签格式为 <私有仓库地址>/<镜像名>:<标签>。

docker tag centos:7 192.168.10.14:5000/centos:v1

其中 centos:7 是本地镜像,192.168.10.14:5000/centos:v1 是我们要推送到私有仓库的镜像标签。

1.6 上传镜像到私有仓库

上传镜像到私有仓库的命令是:

docker push 192.168.10.14:5000/centos:v1

如果这是第一次上传该镜像,Docker 会先从本地计算差异,然后推送镜像层到私有仓库。

1.7 列出私有仓库的所有镜像

可以通过 curl 请求获取仓库中的所有镜像:

curl http://192.168.10.14:5000/v2/_catalog

这将返回一个 JSON 格式的镜像列表。

1.8 获取镜像的所有 Tag

要列出某个镜像的所有版本标签(Tag),可以使用以下命令:

curl http://192.168.10.14:5000/v2/centos/tags/list

返回的结果是该镜像在仓库中的所有标签,如 v1v2 等。

1.9 测试私有仓库下载镜像

如果我们之前已经删除了本地的 CentOS 镜像,可以通过以下命令从私有仓库拉取镜像:

docker rmi -f 8652b9f0cb4c # 删除本地镜像

docker pull 192.168.10.23:5000/centos:v1 # 从私有仓库拉取镜像

2 Harbor 简介

2.1 什么是 Harbor

Harbor 是一个企业级的 Docker 镜像仓库管理平台,它在 Docker Registry 的基础上进行了扩展,增加了更多功能,使得管理镜像更加方便和安全。Harbor 提供了图形化管理界面、角色访问控制、镜像复制、LDAP 集成等功能。

Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。

2.2 Harbor 特性

  • 图形化管理界面:通过浏览器访问,方便用户管理镜像和权限。
  • 基于角色的访问控制:用户可在 Harbor 中创建不同角色并为每个角色分配不同的权限。
  • LDAP/AD 集成:支持与 LDAP 或 Active Directory 集成, 进行用户认证和权限管理。
  • 镜像复制:支持将镜像从一个 Harbor 实例复制到另一个实例,实现跨数据中心的镜像管理。
  • 审计日志:记录所有操作的日志,便于审计和排查问题。
  • 安全扫描:集成 Clair 进行镜像的安全扫描,自动检测镜像中的漏洞。

2.3 Harbor 架构

Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件

  • Proxy:反向代理,用于处理客户端请求。
  • Registry:存储 Docker 镜像的核心组件,支持 Docker 的 push 和 pull 操作。
  • Core Services:包含 Web 界面、API 和 Webhook 等服务。
  • Database:保存 Harbor 的配置和镜像的元数据。
  • Job Services:处理镜像复制等异步任务。
  • Log Collector:收集 Harbor 各组件的日志。

数据流向分析:

1. Docker客户端 / 浏览器:

用户通过 Docker 客户端或者浏览器进行交互。

2. Proxy(代理):

客户端的请求会通过代理转发,可能是为了负载均衡或处理一些中间层逻辑。

3. Core services(核心服务):

包含 UI、token 和 webhook。这些服务处理用户请求的业务逻辑,比如 UI 提供用户界面,

token 服务管理认证,webhook 可能用于触发外部通知或事件。

4. Registry(注册表):

这是容器镜像的存储地方,核心服务会与 Registry 交互来存储或获取镜像。

5. Database(数据库):

Core services 还与数据库交互,用来存储与 Harbor 相关的元数据、配置、用户信息等。

6. Job services(作业服务):

处理后台任务和作业,可能包括镜像同步、清理任务等。

7. Log Collector(日志收集器):

系统会收集日志以便后期分析和排查。

8. Replication to remote Harbor instances(同步到远程 Harbor 实例):

可能用于在多个 Harbor 实例之间同步镜像,保证镜像的高可用和分布式存储。

3 部署 Harbor 服务

3.1 安装 Docker Compose

Harbor 使用 Docker Compose 来启动各个组件,所以需要安装 Docker Compose 工具:

这里我直接使用自带安装包下载

3.2 下载 Harbor 安装包

从 Harbor 官网下载离线安装包:

wget https://github.com/goharbor/harbor/releases/download/v2.4.0/harbor-offline-installer-v2.4.0.tgz

tar zxvf harbor-offline-installer-v2.4.0.tgz -C /usr/local/

3.3 修改 Harbor 配置文件

/usr/local/harbor/ 目录中修改 harbor.cfg 配置文件,设置 Harbor 服务器的地址、管理员密码等:

vim /usr/local/harbor/harbor.yml

修改以下字段:

3.4 启动 Harbor

配置好文件后,运行以下命令启动 Harbor 服务:

3.5 查看 Harbor 启动状态

通过 docker-compose 查看各个 Harbor 服务的状态:

cd /usr/local/harbor/

docker-compose ps

如果 Harbor 启动成功,应该能看到各个容器的状态为 "Up"。

3.6 创建一个新项目

(1)浏览器访问:http://192.168.10.14 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345

(2)输入用户名和密码登录界面后可以创建一个新项目。点击"+项目"按钮

(3)填写项目名称为"myproject",点击"确定"按钮,创建新项目

(4)此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。

bash 复制代码
//登录 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/nginx:v1
//上传镜像到 Harbor
docker push 127.0.0.1/myproject/nginx:v1

(5)在 Harbor 界面 myproject-kgc 目录下可看见此镜像及相关信息

4 客户端上传镜像

4.1 配置 Docker 客户端

以上操作都是在 Harbor 服务器本地操作。如果其他客户端登录到 Harbor,就会报如下错误。出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。

docker login -u admin -p Harbor12345 http://192.168.10.14

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

Error response from daemon: Get https://192.168.10.14/v2/: dial tcp

192.168.10.14:443: connect: connection refused

(1)在 Docker 客户端配置操作

为了让 Docker 客户端能够访问私有仓库,配置文件需要添加 --insecure-registry 参数:

bash 复制代码
//解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。
vim /usr/lib/systemd/system/docker.service

--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.10.14 --
containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.10.14

//重启 Docker,再次登录
systemctl daemon-reload
systemctl restart docker

//再次登录 Harbor
docker login -u admin -p Harbor12345 http://192.168.10.14
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Login Succeeded
//将自动保存凭据到/root/.docker/config.json,下次登录时可直接使用凭据登录 Harbor

//下载镜像进行测试
docker pull 192.168.10.14/myproject-yjs/nginx:v1

//上传镜像进行测试
docker pull cirros
docker tag cirros:latest 192.168.10.14/myproject-yjs/cirros:v2
docker push 192.168.10.14/myproject-yjs/cirros:v2

(2)刷新 Harbor 的 Web 管理界面进行查看,会发现 myproject 项目里面有两个镜像

4.2 创建 Harbor 用户

(1)创建用户并分配权限

在 Web 管理界面中单击系统管理 -> 用户管理 -> +用户,

填写用户名为"zhangsan",邮箱为"zhangsan@kgc.com",全名为"zhangsan",密码为"Abc123456",注释为"管理员"(可省略)。

附:用户创建成功后,单击左侧"..."按钮可将上述创建的用户设置为管理员角色或进行删除操作,本例不作任何设置。

(2)添加项目成员

单击项目 -> myproject-> 成员 -> + 成员,填写上述创建的用户 zhangsan 并分配角色为"开发人员"。

附:此时单击左侧"..."按钮仍然可对成员角色进行变更或者删除操作

(3)在客户端上使用普通账户操作镜像

4.3 查看日志

Web 界面日志,操作日志按时间顺序记录用户相关操作

4.4 移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移

在Harbor服务器上操作

(1)移除 Harbor 服务容器

cd /usr/local/harbor

docker-compose down -v

(2)把项目中的镜像数据进行打包

//持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下

ls /data/registry/docker/registry/v2/repositories/myproject

cd /data/registry/docker/registry/v2/repositories/myproject

tar zcvf kgc-registry.tar.gz ./*

4.5 如需重新部署,需要移除 Harbor 服务容器全部数据

cd /usr/local/harbor

docker-compose down -v

rm -r /data/database

rm -r /data/registry

相关推荐
阿巴~阿巴~2 小时前
TCP可靠传输双引擎:确认应答与超时重传的精妙协同
运维·服务器·网络·网络协议·tcp·超时重传·确认应答
熊猫钓鱼>_>2 小时前
对话式部署实践:从零开始使用TRAE SOLO构建自动化CI/CD Pipeline
运维·ci/cd·自动化·devops·trae·solo·trae solo
Dovis(誓平步青云)2 小时前
《Linux 核心 IO 模型深析(初篇):非阻塞 IO 的轮询机制与多路转接的高效实现》
运维·服务器
_loehuang_2 小时前
Docker Compose 部署 Maven 私有库 nexus3
java·docker·maven·nexus·maven私有库
运维有小邓@11 小时前
Active Directory服务账户是什么?
运维·服务器·网络
HIT_Weston12 小时前
84、【Ubuntu】【Hugo】搭建私人博客:文章目录(三)
linux·运维·ubuntu
moxiaoran575313 小时前
使用docker安装myql 8.0
运维·docker·容器
qq_54702617913 小时前
Linux 常用快捷键及文本编辑器
linux·运维·服务器
醇氧14 小时前
【Linux】 安装 Azul Zulu JDK
java·linux·运维
喵叔哟14 小时前
15.故障排查与调试
后端·docker·容器·服务发现