docker仓库的工作原理及搭建仓库

一.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.测试

相关推荐
※DX3906※2 小时前
SpringBoot之旅4: MyBatis 操作数据库(进阶) 动态SQL+MyBatis-Plus实战,从入门到熟练,再也不踩绑定异常、SQL拼接坑
java·数据库·spring boot·spring·java-ee·maven·mybatis
cyber_两只龙宝2 小时前
【Docker】Docker的原生网络介绍
linux·运维·docker·云原生·容器
java1234_小锋2 小时前
Java高频面试题:怎么实现Redis的高可用?
java·开发语言·redis
jiankeljx2 小时前
MySQL-mysql zip安装包配置教程
java
FlagOS智算系统软件栈2 小时前
智源×Eclipse基金会携手打造PanEval,中欧协同开启“评测+开源+合规”新模式
java·eclipse·开源
日出等日落2 小时前
用 Kavita实现我的远程数字书屋搭建记!
java·开发语言·ide·vscode·编辑器
jwlee012 小时前
Docker Compose
docker·容器·eureka
Alan GEO实施教练2 小时前
实用新型专利申请代理机构选择:关键考量因素与实操要点讲解
java·开发语言·python
gelald2 小时前
JVM - 类加载机制
java·jvm·后端