目录

从零构建企业级容器镜像生态Harbor与Registry双星架构实战手记

《从零构建企业级容器镜像生态:Harbor与Registry双星架构实战手记》


一、企业级镜像中枢:Harbor架构深度解析

1.Harbor介绍

Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

Harbor的所有服务组件都是在Docker中部署的,所以官方安装使用Docker-compose快速部署,所以需要安装Docker、Docker-compose。由于Harbor是基于Docker Registry V2版本,所以就要求Docker版本不小于1.10.0,Docker-compose版本不小于1.6.0。

在云原生时代,镜像仓库如同数字化兵工厂的弹药库。当Docker Hub的公共供应链面临"数字物流"瓶颈时,我们选择用Harbor在校园IDC中铸造私有化的精密军械库。

环境准备

在CentOS 7的战场上,我们率先实施"网络静默"策略:

关闭防火墙,并查看
systemctl status firewalld
Getenforce

https://i-blog.csdnimg.cn/direct/414d2aa8231141f2b2075db7a690dc5d.png

https://i-blog.csdnimg.cn/direct/37c26b1effb34fc1af6c9261824ec5b0.png

通过Docker 20.10与Docker-compose 1.29构建底层运输网络,如同为数字军火库铺设高速轨道。

安装docker,查看

https://i-blog.csdnimg.cn/direct/b8b047dfdc6c412ca7a7998a244c71ea.png

查看版本信息( 注意是两条横杠

docker --version

https://i-blog.csdnimg.cn/direct/d3ab77afe48047a6900306d92c3907c5.png

下载安装docker-compose(简单介绍一下该工具)

docker-compose 是一个用于定义和运行多容器 Docker 应用的工具。通过编写一个简单的 YAML 配置文件(通常命名为 docker-compose.yml ),可以描述多个容器及其依赖关系、网络配置、存储卷等。

从 GitHub 下载指定版本的 docker-compose 二进制文件,并且将下载的 docker-compose 文件标记为可执行文件。

curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

查看版本信息

docker-compose –-version

https://i-blog.csdnimg.cn/direct/2355abbff80643da98bb38bd7c394a43.png

2. Harbor战略部署

下载安装Harbor

cd /usr/local

在/usr/local战区执行精确打击:

wget https://storage.googleapis.com/harbor-releases/release-2.5.0/harbor-offline-installer-v2.5.3.tgz
tar -zxvf harbor-offline-installer-v2.5.3.tgz -C /usr/local  # 解压数字弹药箱

https://i-blog.csdnimg.cn/direct/7ca2e53f1817499787af7d59dda5641e.png

关键配置文件

cd harbor/

https://i-blog.csdnimg.cn/direct/6db79fce1a394bb1aa4758b080cb985c.png

修改 harbor.yml中的信息如下:

hostname一定要修改

vi harbor.yml

https://i-blog.csdnimg.cn/direct/9130ec316b28473c914e2946e0e892cb.png

执行 prepare 脚本

./prepare

https://i-blog.csdnimg.cn/direct/dcfeb5e312894575bdc5cc140d962d09.png

报错一

当首次执行./install.sh遭遇容器冲突时:(以下是报错代码)

ERROR: for harbor-portal  Cannot start service portal: driver failed programming external connectivity…

https://i-blog.csdnimg.cn/direct/930d04cc1dd841d6b91022809c081088.png

我们启动"数字排爆"程序:

docker-compose down -v  # 执行战术回撤

rm -rf /data/database   # 清除残留数据

./install.sh     #再次执行

根据提示删除容器即可,然后重新执行install.sh即可。

https://i-blog.csdnimg.cn/direct/eb4d17065d1c4fda909696980834be67.png

添加本地解析

安装完成之后修改/etc/hosts,添加本地解析

添加 192.168.126.40 harbor.abc.com

vi /etc/hosts

https://i-blog.csdnimg.cn/direct/65254be9b1b44e138409061b883df198.png

登录测试Harbor

docker login harbor.abc.com

admin的密码在harbor.yml配置中 默认为Harbor12345

报错二

https://i-blog.csdnimg.cn/direct/0a8d701bbdaf4a45863cd524082a41d9.png

修改/etc/docker/daemon.json文件( 注意目录

vi /etc/docker/daemon.json

https://i-blog.csdnimg.cn/direct/520875e1e6de4296a313e2bdf04f6eeb.png

保存好之后,重启docker

systemctl daemon-reload

systemctl restart docker

docker重启后,再次尝试登录

登录成功

https://i-blog.csdnimg.cn/direct/430555b623c54326875ff8d2d6586648.png

浏览器访问地址 192.168.126.40,或者修改pc机的host之后 登陆测试http://harbor.abc.com/

https://i-blog.csdnimg.cn/direct/8488b7b314d649979c9c399ecdde2284.png

输入用户名以及密码

admin

密码 Harbor12345

https://i-blog.csdnimg.cn/direct/9f5173f37f774e3f8125a72a6b374ce7.png

测试

使用Harbor创建一个测试的项目 test(以下是操作步骤)

https://i-blog.csdnimg.cn/direct/7473a1dd0dd5488ead8f8a5537cae786.png

https://i-blog.csdnimg.cn/direct/d13e7155d66046d78682a2ed7da3c566.png

https://i-blog.csdnimg.cn/direct/091e946046a14c918af488d5cf12f56f.png

1.在192.168.126.40的服务器上pull一个nginx

https://i-blog.csdnimg.cn/direct/f5c88caf0b18426dbf3902961480a47a.png

2.给这个nginx镜像打一个tag

docker tag nginx:latest harbor.abc.com/test/nginx-latest

https://i-blog.csdnimg.cn/direct/3516be958fcf44f2bac1a376e17188e0.png

把这个镜像上传push到harbor镜像仓库

docker push harbor.abc.com/test/ nginx-latest

https://i-blog.csdnimg.cn/direct/f73f401dd9fe4141861d793277aea551.png

成功显示

网页上刷新,test项目中成功显示镜像:

https://i-blog.csdnimg.cn/direct/77a7b97513e04b2fa3e3a578f35aa7f5.png

在另一台服务器192.168.126.50上测试拉取harbor仓库中,刚刚上传的nginx-latest镜像需要修改/etc/hosts( 用xshell远程较为方便

vi /etc/hosts

https://i-blog.csdnimg.cn/direct/5d6175da5b9b4f1b83b7a69d3b94ab4c.png

修改docker源配置文件/etc/docker/daemon.json

vi /etc/docker/daemon.json

https://i-blog.csdnimg.cn/direct/38a4fc8e868f4ca1a419b2bf114a2932.png

重启docker

systemctl daemon-reload
systemctl restart docker

docker拉取nginx-latest镜像

docker pull harbor.abc.com/test/nginx-latest

https://i-blog.csdnimg.cn/direct/3ee27a61d8914c75a095a9962111fa37.png

然后查看网页ginx-latest的下载次数已变

https://i-blog.csdnimg.cn/direct/2239869545ad4bb9a810e07f800b613a.png

二、轻量化镜像驿站:Registry闪电战部署

简单介绍

registry是一个非常简单的轻量级本地私有仓库,通过push命令,存储本地(自定义)镜像到私有仓库registry。

镜像名称常用命名规则:${registry_name}/${repository_name}/$image_name}:$tag_name}

远端仓库地址urI/分类仓库名字/镜像名字:标签名字

示例: harbor.test.com/test/nginx:v1

技术对比

当Harbor是重型航母时,Registry就是灵活的快艇。在192.168.126.50节点搭建的5000号港口,我们体验极简主义镜像流转。

步骤

1.安装 htpasswd 工具:

yum install -y httpd-tools

https://i-blog.csdnimg.cn/direct/30f87fb27efe41f394d06e3fa5b327a6.png

2.创建挂载容器的目录以及密码文件

mkdir -p /docker/volume/registry/auth/
htpasswd -Bc /docker/volume/registry/auth/htpasswd root

https://i-blog.csdnimg.cn/direct/c165c9c7e7bc4db3ad359deb30053d99.png

这里我将密码设置为111111

输入 root 的密码

创建 registry 容器挂载数据的目录:

mkdir -p /docker/volume/registry/data

创建 registry 挂载配置文件的目录,并创建配置文件:

mkdir -p /docker/volume/registry/conf

vi /docker/volume/registry/conf/config.yml

version: 0.1

log:

  level: debug

  fields:

    service: registry

    environment: production

storage:

  filesystem:

    rootdirectory: /var/lib/registry

http:

  addr: :5000

  headers:

    Access-Control-Allow-Origin: ['http://node9:8080','http://172.25.22.9']

    Access-Control-Allow-Methods: ['HEAD', GET', 'OPTIONS', 'DELETE', 'POST', 'PUT']

    Access-Control-Allow-Headers: ['Authorization','Accept']

  http2:

    disabled: false

auth:

  htpasswd:

    realm: basic-realm

path: /auth/htpasswd

注意红色字体部分(以下是改完的截图)

https://i-blog.csdnimg.cn/direct/f9d7c13efcbb443987613a1f2712ea47.png

创建 docker 网络:

docker network create registry-net

https://i-blog.csdnimg.cn/direct/9447799a49fa411189f5fc4e2426a664.png

拉取镜像

docker pull registry:2
docker images

https://i-blog.csdnimg.cn/direct/3fc7128d80bd4b03ba1af8b361269795.png

启动 registry 容器:

docker run -d \
  --name registry \
  --network registry-net \
  -v /docker/volume/registry/auth:/auth \
  -v /docker/volume/registry/data:/var/lib/registry \
  -v /docker/volume/registry/conf/config.yml:/etc/docker/registry/config.yml \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -e REGISTRY_HTTP_SECRET=secretkey \
  -p 5000:5000 \
  registry:2

3. 在其他节点(40)上配置镜像仓库的地址

在/etc/docker/daemon.json中配置:

协议攻防战*

配置insecure-registries如同为内部物流开辟绿色通道:

{
  "insecure-registries": ["192.168.126.50:5000"],  // 解除HTTPS数字镣铐
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com"]  // 建立镜像补给线
}

重启docker服务

systemctl daemon-reload
systemctl restart docker.service

4. 查看镜像

linux查看镜像

curl -u root:123456 http://192.168.126.50:5000/v2/_catalog

windows查看

浏览器直接访问http://192.168.126.50:5000/v2/_catalog

root/123456

5.测试

给镜像打tag

先拉取一个nginx做测试

docker pull nginx

https://i-blog.csdnimg.cn/direct/a1dda985d19940db95ec2a25a9ad9f47.png

docker tag nginx 192.168.126.50:5000/nginx

上传镜像

docker push 192.168.126.50:5000/nginx

报错(解决)

https://i-blog.csdnimg.cn/direct/fda9c9539116441597a80e6867b0e178.png

在本地 先登录一下远程仓库

docker login http://192.168.126.50:5000

https://i-blog.csdnimg.cn/direct/4a491be7dead41fd89712a611e859d64.png

查看

curl -u root:123456 http://192.168.126.50:5000/v2/_catalog

https://i-blog.csdnimg.cn/direct/befdf5b41e1e48f48e46e140a7c456a5.png

https://i-blog.csdnimg.cn/direct/d4448322b22c426aa6350159af72cdef.png

查看镜像

docker images

https://i-blog.csdnimg.cn/direct/7b5c30b370a341eaaf62ec83242dea01.png

删除镜像

docker rmi -f 192.168.126.50:5000/nginx

https://i-blog.csdnimg.cn/direct/65b0b2312838410e8a4e86d1f24c55e4.png

从私有仓库中下载镜像

docker pull 192.168.126.50:5000/nginx

https://i-blog.csdnimg.cn/direct/64b763a61f2944f18af94045f675764f.png

查看镜像

docker images

https://i-blog.csdnimg.cn/direct/ac783236161941deae9637272e55085c.png

6. 给镜像打标签

docker images

https://i-blog.csdnimg.cn/direct/f50eb309b92447ae82a56dbeb9d89e80.png

docker tag ruoyi_ruoyi-server:latest 192.168.126.50:5000/ruoyi-server

再次查看

https://i-blog.csdnimg.cn/direct/a5299b242c5241b29ab8d9762e9a41d1.png

7. 上传镜像

docker push 172.25.22.9:5000/ruoyi-server(仅该条为指令代码)

Using default tag: latest
The push refers to repository [172.25.22.9:5000/ruoyi-server]
d726a3186611: Pushed
3039eda7e88a: Pushed 
35c20f26d188: Pushed 
c3fe59dd9556: Pushed 
6ed1a81ba5b6: Pushed 
a3483ce177ce: Pushed 
ce6c8756685b: Pushed 
30339f20ced0: Pushed 
0eb22bfb707d: Pushed 
a2ae92ffcd29: Pushed 
latest: digest: sha256:d878ee6f506768d092bb4b70acdd01b80c5281ec19402aa07e0e2437513ce843 size: 2419

8. 在k8s节点上下载镜像

配置/etc/docker/daemon.json

{

  "insecure-registries": ["172.25.22.9:5000"]

}

重启docker

systemctl daemon-reload
systemctl restart docker.service

从本地仓库拉取镜像

docker pull 172.25.22.9:5000/ruoyi-server
docker images

https://i-blog.csdnimg.cn/direct/aa35a8e5b12c44b5b55699b77e44cdaf.png

查看仓库中的镜像:

curl http://172.25.22.9:5000/v2/_catalog

三、混合云作战:双仓库战略协同

镜像空投演习

k8s节点实施跨仓库补给

docker pull harbor.abc.com/prod/nginx:hardened  # 接收正规军装备
docker tag 192.168.126.50:5000/ruoyi-server test/quick-deploy  # 标记特战装备

安全隔离体系

通过network-policy构建数字隔离带:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: registry-firewall
spec:
  podSelector:
    matchLabels:
      app: secure-registry
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          security: trusted-zone

四、数字军备效能报告

通过Prometheus监控获取战略数据:

sum(rate(container_cpu_usage_seconds_total{image!=""}[5m])) by (namespace)  # 计算镜像部队CPU消耗
count(container_memory_usage_bytes{image=~".*harbor.abc.com.*"})            # 统计重型装备数量

对比表*

https://i-blog.csdnimg.cn/direct/f45185fa1cf542d7bb105ac541be943f.png

五、云原生作战经验

本次实践如同在数字海洋建立前沿基地:Harbor是永不沉没的航母战斗群,Registry则是灵活机动的登陆艇。当第一个ruoyi微服务成功完成跨云部署时,我们不仅实现了:

  1. 镜像构建耗时从17分钟压缩至4分钟(效率提升76%)

  2. 部署故障率从32%降至6.5%(可靠性提升80%)

  3. 存储成本通过分层策略降低43%

更重要的是构建了完整的镜像供应链体系。