Registry&Harbor私有仓库构建

一、介绍

  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)测试

docker-compose --version

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

 

posted on 2024-01-24 09:35  uestc2007  阅读(190)  评论(0编辑  收藏  举报

导航