惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Privacy International News Feed
NISL@THU
NISL@THU
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
The Hacker News
The Hacker News
P
Privacy & Cybersecurity Law Blog
S
Schneier on Security
T
Troy Hunt's Blog
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
S
Security Affairs
WordPress大学
WordPress大学
T
Tailwind CSS Blog
博客园 - Franky
T
The Exploit Database - CXSecurity.com
雷峰网
雷峰网
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
S
Securelist
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
有赞技术团队
有赞技术团队
爱范儿
爱范儿
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 三生石上(FineUI控件)
C
CERT Recently Published Vulnerability Notes
C
Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
罗磊的独立博客
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
J
Java Code Geeks
T
Threatpost
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位

博客园 - uestc2007

AI 智能体项目的测试 vllm方式部署Deepseek R1、Embedding、Reranker、Qwen 磁盘挂载 LibreOffice 批量将.doc文件转换为.docx Supervisor 监控 Python 服务 容器异常或停止自动启动脚本 资源监控脚本 Docker 安全及日志管理 Docker资源控制 做项目管理需要哪些技能 项目管理的基本工作是什么 知识图谱介绍(三) 知识图谱介绍(二) 知识图谱介绍(一) 安装Kuboard管理k8s EMQX配置用户名和密码开启emqx_auth_mnesia认证方式连接 开关量、数字量、模拟量、离散量和脉冲量它们之间有什么区别? Kubernetes基础总结 Kubernetes管理应用程序、服务常用命令、集群监视
Registry&Harbor私有仓库构建
uestc2007 · 2024-01-24 · via 博客园 - uestc2007

一、介绍

  1. Harbor是一个用于存储Docker镜像的企业级Registry服务。
  2. Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率

二、Harbor和Registry的比较

    Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。
    1.提供分层传输机制,优化网络传输
      Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
    2.提供WEB界面,优化用户体验
      只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
    3.支持水平扩展集群
      当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
    4.良好的安全机制
      企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
    5.Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。

三、搭建Registry私有仓库

参考资料:https://blog.csdn.net/qq_47800859/article/details/129303922

 1、拉取镜像

docker pull daocloud.io/library/registry:latest

docker pull registry

 2、运行容器

[root@docker ~]# docker run --name "pri_registry" --restart=always -d -p 5000:5000 daocloud.io/library/registry 

[root@docker ~]# docker run -tid --name registry --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry -d registry
#运行该镜像,各个选项含义如下:
# -tid:以后台持久运行,并分配一个可交互的为终端
# --name registry  :给容器定义一个名字
#  --restart=always:该容器可以随着docker服务的启动而启动
# -p:将容器的端口映射到宿主机,冒号前面是宿主机的端口,冒号后面是容器的端口,registry的默认端口是5000
# -v:将宿主机的目录挂载到容器中,冒号前面是宿主机的目录,冒号后面是容器中的目录

3、registry仓库管理

#查看当前的镜像
[root@docker ~]# docker images   #查看当前的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
cadvisor              latest              0f3e07c0138f        2 weeks ago         220MB
registry            latest              f32a97de94e1        7 months ago        25.8MB


#给镜像打tag  
#更改镜像名称,以便符合私有仓库名称规范
#注:私有仓库镜像的命名规则:192.168.20.7:5000/XXX(宿主机的IP:5000端口/镜像名称)
[root@docker ~]# docker tag cadvisor:latest 192.168.0.212:5000/cadvisor:lates

#定位到上面那行,在后面添加“--insecure-registry”并指定私有仓库的IP及端口,然后保存退出即可
vi vi /etc/docker/daemon.json,添加如下配置:
{
"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.212:5000"]
}
[root@docker ~]# systemctl daemon-reload     #重载配置文件
[root@docker ~]# systemctl restart docker    #重启docker服务

#上传镜像至私有仓库
[root@docker ~]# docker push 192.168.0.212:5000/cadvisor:latest     #上传镜像至私有仓库
 
#查看私有仓库中的镜像
curl -X GET http://<registry-url>/v2/_catalog
[root@docker ~]# curl 192.168.0.212:5000/v2/_catalog  
{"repositories":["cadvisor"]}
#查看镜像的详细信息
curl -X GET http://<registry-url>/v2/<image-name>/tags/list
[root@docker ~]# curl 192.168.0.212:5000/v2/cadvisor/tags/list 
{"name":"cadvisor","tags":["latest"]} 

#拉取私有仓库镜像
[root@docker ~]# docker pull 192.168.0.212:5000/cadvisor:latest

注:有密码访问:curl -u <username>:<password> http://<registry-url>/v2/_catalog

3、删除镜像

1、查询digest
[root@master-node ~]# curl -i -sS -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' 'http://192.168.0.212:5000/v2/cadvisor/manifests/latest'
HTTP/1.1 200 OK
Content-Length: 952
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04"
X-Content-Type-Options: nosniff
Date: Tue, 14 Nov 2023 07:25:22 GMT

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
   "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": 4416,
      "digest": "sha256:eb12107075737019dce2d795dd82f5a72197eb3c64b2140392eaad3ba3b8a34e"
   },
   "layers": [
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 2065537,
         "digest": "sha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 15291747,
         "digest": "sha256:44a45bb65cdf927ad0da15a15a666253d6cb3b7e2179dd85f44a51aa414a30f8"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 13167749,
         "digest": "sha256:0bbe1a2fe2a6e61d7cccab9eeffe3310e9235ee5cb444b0edcb2bb0a1a220ba9"
      }
   ]
}

2、删除镜像
curl -X DELETE https://192.168.0.212:5000/v2/cadvisor/manifests/sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc

4、web-ui管理registry

docker hub 地址:https://hub.docker.com/r/hyper/docker-registry-web

1、拉取镜像
docker pull hyper/docker-registry-web

2、编辑配置文件 vi config.yml ,配置如下:
registry:
  # Docker registry url
  url: http://192.168.0.212:5000/v2
  # Docker registry fqdn
  name: localhost:5000
  # To allow image delete, should be false
  readonly: false
  auth:
    # Disable authentication
    enabled: false ##如果不需要分用户权限设置,推荐选择false

3、运行容器
docker run -it -p 8083:8080 --name registry-web --link pri_registry -v /home/config.yml:/conf/config.yml:ro -d hyper/docker-registry-web

* --link pri_registry  这边的pri_registry是搭建的registry仓库容器的名字

四、搭建Harbor私有仓库

1、Harbor核心组件解释

  • Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
  • db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
  • UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
  • jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
  • Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。
  • Registry:镜像仓库,负责存储镜像文件。
  • Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

2、安装docker-compose

1)下载 Docker Compose

curl 下载 并放到 /usr/local/bin/docker-compose 下

curl -L "https://github.com/docker/compose/releases/download/2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

注:uname -s:是系统内核名称(Linux),uname -m:是计算机硬件架构(x86_64)

或者从 https://github.com/docker/compose/releases 直接下载然后解压放到 /usr/local/bin/

[root@master-1 ~]# cd /usr/local/bin/
[root@master-1 ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64
添加可执行权限
[root@master-1 ~]# mv docker-compose-linux-x86_64 docker-compose
[root@master-1 ~] docker-compose version
Docker Compose version v2.5.0

2)添加执行权限

chmod +x /usr/local/bin/docker-compose

3)软链到 /usr/bin

n -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4)测试

5)卸载 Docker Compose

  1. 如果是 curl 安装
rm /usr/local/bin/docker-compose
  1. 如果是 pip 安装
pip uninstall docker-compose

6)安装 Docker Compose 命令补全工具

  1. 切换到 /etc/bash_completion.d/  
  2. curl 下载
sudo curl \
    -L https://raw.githubusercontent.com/docker/compose/2.5.0/contrib/completion/bash/docker-compose \
    -o /etc/bash_completion.d/docker-compose

       3.重新加载终端

  • 要么,关闭当前终端窗口,然后打开一个新的终端
  • 要么 执行source ~/.bashrc 命令

3、安装harbor

1)下载

可以直接从服务器下载离线安装包,我这里选择的2.6.1版本,网络不好的可以下载后传入服务器

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

2)解压

tar -zxvf harbor-offline-installer-v2.6.1.tgz

3)修改配置文件

cd harbor
cp harbor.yml.tmpl harbor.yml
vi harbor.yml

 4)部署&开机启动配置

#部署
./install.sh
#开机自启动配置
/usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml up -d

5)登录验证

admin/admin123456

 6)登录上传下载镜像

#登录
docker login 192.168.0.211:5000

#打标签
docker tag {image name}:{tag} {harbor ip}:{port}/{harbor project}/{image name}:{tag}
#样例
docker tag nginx:latest 192.168.0.211:5000/box/nginx:latest

#上传镜像至仓库
docker push {harbor ip}:{port}/{harbor project}/{image name}:{tag}
#样例
docker push 192.168.0.211:5000/box/nginx:latest
#拉取镜像
docker pull {harbor ip}:{port}/{harbor project}/{image name}:{tag}
#样例
docker pull 192.168.0.211:5000/box/nginx:latest

7)补充说明
如果以后修改了harbor.yml文件,那么先停止使用docker-compose down,再去修改harbor.yml文件,重新启动部署 ./install.sh
正常启动harbor启动:docker-compose up -d
未修改配置文件,重启Harbor命令:docker-compose start | stop | restart

4、harbor使用问题

1)docker login问题:Error response from daemon: Get https://: http: server gave HTTP response to HTTPS client
服务器通过docker login命令登录报错

docker login 192.168.0.211:5000

编辑daemon.json文件,添加如下内容(连接harbor拉取镜像的docker服务器都需要配置)

vi /etc/docker/daemon.json

{
"insecure-registries": ["192.168.19.102:8000"]
}

重新加载、启动docker
systemctl daemon-reload
systemctl restart docker

2)k8s无法下载镜像 unauthorized: unauthorized to access repository

创建secret

kubectl create secret docker-registry harbor-login-registry --docker-email=dd@example --docker-username=admin --docker-password=admin --docker-server=192.168.0.211:5000    

k8s yaml增加配置

imagePullSecrets: # 使用密码登录
      - name: harbor-login-registry