Registry&Harbor私有仓库构建
一、介绍
- Harbor是一个用于存储Docker镜像的企业级Registry服务。
- 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
- 如果是 curl 安装
rm /usr/local/bin/docker-compose
- 如果是 pip 安装
pip uninstall docker-compose
6)安装 Docker Compose 命令补全工具
- 切换到 /etc/bash_completion.d/
- 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