一.docker仓库的工作原理
仓库中的三个角色
index docker索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
registry docker仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证
Registry Client Docker充当registry客户端来维护推送和拉取,以及客户端的授权
1.pull原理

镜像拉取分为以下几步:
1.docker客户端向index发送镜像拉去请求并完成与index的认证
2.index发送认证token和镜像位置给dockerclient
3.dockerclient携带token和根据index指引的镜像位置取连接registry
4.Registry会根据client持有的token跟index核实身份合法性
5.index确认此token合法性
6.Registry会根据client的请求传递镜像到客户端
2.push****原理

镜像上传的步骤:
1.client向index发送上传请求并完成用户认证
2.index会发方token给client来证明client的合法性
3.client携带index提供的token连接Registry
4.Registry向index合适token的合法性
5.index证实token的合法性
6.Registry开始接收客户端上传过来的镜像

二. 搭建docker的私有仓库
1.为什么搭建私有仓库
docker hub虽然方便,但是还是有限制
需要internet连接,速度慢
所有人都可以访问
由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
地址: https://docs.docker.com/registry/deploying/
2.搭建简单的Registry仓库
2.1.下载Registry镜像
cpp
[root@docker1 ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
930bdd4d222e: Pull complete
a15309931e05: Pull complete
6263fb9c821f: Pull complete
86c1d3af3872: Pull complete
a37b1bf6a96f: Pull complete
Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
2.2.查看Registry端口
cpp
[root@docker1 docker]# docker histroy registry:latest

2.3.开启Registry
cpp
[root@docker1 docker]# docker run -d -p 5000:5000 --restart=always --name registry registry:latest
d0ad21599c2ab7695192c3231a53c21ecaf39e8cb3c638b1c27cba705cd6acc9
[root@docker1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0ad21599c2a registry:latest "/entrypoint.sh /etc..." 43 minutes ago Up 34 minutes 0.0.0.0:5000->5000/tcp, [::]:5000->5000/tcp registry
2.4.上传镜像到仓库中
cpp
#配置非加密端口
[root@docker1 docker]# vim /etc/docker/daemon.json
{
"insecure-registries": ["http://192.168.220.10:5000"] #http后面接自己主机的IP地址
}
#给要上传的经镜像大标签
[root@docker1 docker]# docker tag webservers:v4 192.168.220.10:5000/webservers:v4
#上传镜像
[root@docker1 docker]# docker push 192.168.220.10:5000/webservers:v4
#查看镜像上传
[root@docker1 docker]# curl 192.168.220.10:5000/v2/_catalog
{"repositories":["webservers"]}
3.为Registry提加密传输
3.1删除此目录文件(如果有内容就删除,没有忽略此操作)
cpp
[root@docker1 docker]# vim /etc/docker/daemon.json
3.2生成认证key和证书
cpp
[root@docker1 docker]# mkdir /etc/docker/cert
#生成key和证书
[root@docker1 ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /etc/docker/certs/xurui.org.key \
-addext "subjectAltName = DNS:reg.xurui.org" \ #指定备用名称
-x509 -days 365 -out /etc/docker/certs/xurui.org.crt
[root@docker1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout /etc/docker/certs/xurui.org.key -addext "subjectAltName = DNS:reg.xurui.org" -x509 -days 365 -out /etc/docker/certs/xurui.org.crt
.+++++++++++++++++++++++++++++++++++++++++++++*.....+.+......+..+.......+...........+...+....+.....+.+..+.........+...+.+..+....+++++++++++++++++++++++++++++++++++++++++++++*.................+.................+.........+.+.........+..+.......+..+.+........+.+.........+.....+.......+.......................+.+...+............+.....+....+...........+.............+...+..............+.+..................+.................+...+...............+.+...+..+....+.....................+..............+....+...........+++++
.+++++++++++++++++++++++++++++++++++++++++++++*.+.......+..+...+..........+.........+......+...+...........+.+...+.........+......+..+....+++++++++++++++++++++++++++++++++++++++++++++*......+..+...............+....+...........+...................+..+.......+...+...+..+...+................+........+.......+...+.....+..........+......+..+...+..........+..+.........+...+......+.+...+........+.........+.+..............+......+....+..................+..+.........+................+.........+..+.............+......+.............................+.......+..+............+......+...+......+......+....+.........+......+...+...............+..+.+..............+...+......+....+.....+.......+.........+.................+....+.......................+.+......+.....+...+.+.....+.........+.+.........+...+........+.+.....+................+..+...............+..........+...........+.+.....+.+.........+......+..............+......+.......+...+........+......+...+..................+.............+..+....+..............+.+....................+...+.......+...+...+.....+..........+...+...............+..+.......+...+..+.+.....+........................+.+...........................+.....+.......+..+...............+......+...+.+...+...+.....+.............+.................+....+...........+...+.+.....+....+.....+....+..+.............+.....+......+............+....+........+.......+........+...+....+.....+......+.........+.............+........+....+.....+....+.....+.+++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Hainan
Locality Name (eg, city) [Default City]:changjiang
Organization Name (eg, company) [Default Company Ltd]:docker
Organizational Unit Name (eg, section) []:registroy
Common Name (eg, your name or your server's hostname) []:reg.xurui.org #这个地方填你key写的备用名称
Email Address []:admin@xurui.org
3.3查看证书信息
cpp
[root@docker1 ~]# ls /etc/docker/certs/
xurui.org.crt xurui.org.key
[root@docker1 ~]# openssl x509 -in /etc/docker/certs/xurui.org.crt -noout -text
3.4启动registry仓库
cpp
[root@docker1 ~]# docker run -d -p 443:443 --restart=always --name registry \
> -v /opt/registry:/var/lib/registry \
> -v /etc/docker/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/xurui.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/xurui.org.key registry
6d00d84b23dc29dbd6f11e6a5ae1f7320392e66f4d8ed9e60bf32670e1613b91
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
859034c241dc registry "/entrypoint.sh /etc..." 6 seconds ago Up 5 seconds 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 5000/tcp registry
#给镜像打上标签
[root@docker1 ~]# docker tag webservers:v4 reg.xurui.org/webservers:v4
#添加本地 hosts 域名映射
[root@docker1 ~]# echo "192.168.220.10 reg.xurui.org" >> /etc/hosts
#创建证书目录
[root@docker1 ~]# mkdir -p /etc/docker/certs.d/reg.xurui.org/
[root@docker1 ~]# cp /etc/docker/certs/xurui.org.crt /etc/docker/certs.d/reg.xurui.org/ca.crt
[root@docker1 ~]# systemctl restart docker
注意:如果出现这种情况,说明容器名称registry已经被占用,需要删除该容器
解决方法
cpp
[root@docker1 ~]# docker rm -f registry
3.5测试
cpp
[root@docker1 ~]# curl -k https://192.168.220.10/v2/_catalog
{"repositories":["webservers"]}
**4.**为仓库建立登陆认证
4.1安装建立认证文件的工具包
cpp
[root@docker1 ~]# dnf install httpd-tools -y
4.2建立认证文件
cpp
[root@docker1 ~]# mkdir /etc/docker/auth
[root@docker1 ~]# htpasswd -Bc /etc/docker/auth/htpasswd xurui ##-B 强制使用最安全加密方式,默认用md5加密
New password: #输入密码
Re-type new password: #再一次输入密码
Adding password for user xurui
4.3添加认证到registry容器中
cpp
[root@docker1 ~]# docker run -d -p 443:443 --restart=always --name registry \
> -v /opt/registry:/var/lib/registry \
> -v /etc/docker/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/xurui.org.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/xurui.org.key \
> -v /etc/docker/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> registry
ee3d26916c5f4612f844e3829a4dd654424ab4da70523b82f0bb3c520e04bdbf
4.4测试
注意:当仓库开启认证后必须登陆仓库才能进行镜像上传
cpp
[root@docker1 ~]# docker login reg.xurui.org/webservers:v4
Username: xurui
Password:
WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'.
Configure a credential helper to remove this warning. See
https://docs.docker.com/go/credential-store/
Login Succeeded
[root@docker1 ~]# docker push reg.xurui.org/webservers:v4
The push refers to repository [reg.xurui.org/webservers]
3f6a57a56d8b: Already exists
5342a2647e87: Layer already exists #因为本博主之前搞过类似的实验,你们因该是新的哈哈
af5aa97ebe6c: Layer already exists
ac805962e479: Layer already exists
1a73b54f556b: Layer already exists
8451c71f8c1e: Layer already exists
24aacbf97031: Layer already exists
6835249f577a: Layer already exists
2388d21e8e2b: Layer already exists
655e68552ce7: Layer already exists
9ed498e122b2: Layer already exists
4d049f83d9cf: Layer already exists
2a92d6ac9e4f: Layer already exists
c048279a7d9f: Layer already exists
577c8ee06f39: Layer already exists
bbb6cacb8c82: Layer already exists
v4: digest: sha256:1cbeee625c565f7f7e145680c0bb58acc65e71d11bf43b17c7d062536348c5da size: 856
三.构建企业级私有仓库
**下载软件包地址 :**https://github.com/goharbor/harbor/releases
资源链接:harbor企业级私有仓库实验所需安装包资源-CSDN下载
Harbor 是由vmware公司开源的企业级 Docker Registry 项目。
它提供了以下主要功能和特点:
· 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理
的灵活性。
· 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
· 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
· 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
· 垃圾回收:可以清理不再使用的镜像,节省存储空间。
1. 部署****harbor
cpp
[root@docker1 ~]# ls
#看到这个压缩包进行解压
harbor-offline-installer-v2.14.0.tgz
[root@docker1 ~]# tar zxf harbor-offline-installer-v2.14.0.tgz -C /opt/
[root@docker1 ~]# cd /opt/
[root@docker1 opt]# ls
containerd harbor registry
[root@docker1 opt]# cd harbor/
[root@docker1 harbor]# cp -p harbor.yml.tmpl harbor.yml
进入该文件修改此内容
cpp
#创建目录
[root@docker1 docker]# mkdir /data
[root@docker1 ~]# cp -rp /etc/docker/certs /data/
先查看key和证书的位置
[root@docker1 ~]# ll /data/certs/xurui.org.crt
-rw-r--r--. 1 root root 2179 Mar 28 12:28 /data/certs/xurui.org.crt
[root@docker1 ~]# ll /data/certs/xurui.org.key
-rw-------. 1 root root 3272 Mar 28 12:27 /data/certs/xurui.org.key
#进入该文件修改四个地方
[root@docker1 harbor]# vim harbor.yml
hostname: reg.xurui.org #修改域名
certificate: /data/certs/xurui.org.crt #修改证书位置
private_key: /data/certs/xurui.org.key #修改证书位置
harbor_admin_password: 123 #修改密码
#执行当前目录下的文件
[root@docker1 harbor]# ./install.sh
2.管理harbor的容器
cpp
[root@docker1 harbor]# docker compose stop
[root@docker1 harbor]# docker compose up -d
3.测试

