目录
[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
返回的结果是该镜像在仓库中的所有标签,如 v1、v2 等。
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