运维实战 容器部分 Docker仓库

Posted 洛冰音

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运维实战 容器部分 Docker仓库相关的知识,希望对你有一定的参考价值。

什么是仓库

  • Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。

  • Docker运行中使用的默认仓库是 Docker Hub 公共仓库。

image-20210502234925253

Registry工作原理

image-20210502235136865

要了解仓库的工作原理就首先需要知道在工作过程中起作用的对象.

  • 客户端: 充当客户端来维护推送和拉取, 以及客户端的授权
  • Docker Index: 负责并维护有关用户帐户, 镜像的校验以及公共命名空间的信息
  • Docker Registry: 是镜像和图表的仓库, 它不具有本地数据库以及不提供用户认证, 通过Index Auth serviceToken的方式进行认证

Index服务主要提供镜像索引以及用户认证的功能。

当下载一个镜像的时候, 首先会去Index服务上做认证, 然后查找镜像所在的Registry的地址并放回给Docker客户端, Docker客户端再从Registry下载镜像, 在下载过程中 Registry 会去Index校验客户端token的合法性, 不同镜像可以保存在不同的Registry服务上, 其索引信息都放在Index服务上.

Registry下载原理

  • 客户端发送下载请求, 访问Index, 返回具体仓库信息和token
  • 客户端拿着locationtoken访问Registry 进行校验
  • 校验成功后, Registry才传递给客户端

image-20210502235957639

Registry上传原理

  • 与下载类似,需要先访问Index,且需要做认证

image-20210503000508289

Registry删除原理

  • 客户端发送删除景象的请求给Index,返回仓库具体信息和temp token,并记录为删除请求
  • 客户端请求Registry并进行删除
  • Registry不仅要做校验, 删除自身存在的镜像, 还要让Index删除索引信息

image-20210503000526729

搭建私有仓库

简单构建

##从官方下载私有仓库模板镜像并运行
[root@Server1 ~]# docker pull registry
[root@Server1 ~]# docker run -d -p 5000:5000 --restart=always --name Registry registry
5aab88da99d33167b1ed2b07db0ba504a554ddd263fbfb3fbba2009501db2f2b

##下载用于测试的应用镜像
[root@Server1 ~]# docker pull yakexi007/mario

##为其增加别名
[root@Server1 ~]# docker tag yakexi007/mario:latest localhost:5000/mario:latest

##上传到本地仓库
[root@Server1 ~]# docker push localhost:5000/mario:latest
The push refers to repository [localhost:5000/mario]
5f70bf18a086: Pushed 
44e5704d49fb: Pushed 
dbe97b1b7330: Pushed 
90222f49bc4c: Pushed 
708fd576a927: Pushed 
4aeeaca5ce76: Pushed 
latest: digest: sha256:f4a933fb5a431e84e3d2623bfaa776c0d973d572b6db0a0b16dc243ffc7bcfa1 size: 2392

为Docker仓库添加证书加密及认证功能

生成加密文件

cd ~
mkdir -p certs
##生成私钥和证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt

##查看生成结果
ls certs/
westos.org.crt westos.crt.key

生成认证文件

##创建认证目录并安装htpasswd需要的包
mkdir -p auth
yum install -y http-tools

##创建认证用户 第二次后不需要添加-c,否则会覆盖原文件信息
htppasswd -B -c htpasswd [用户名]
输入密码
再次输入密码
创建成功

##查看文件内容
cat htpasswd

创建具备认证和加密的私有Docker仓库

##创建Registry容器并添加附加参数,即引入刚刚创建好的私钥和证书以及认证文件
docker run -d --restart=always --name registry -v "$(pwd)"/certs:/certs -v "$(pwd)"/auth:/auth -v /opt/registry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_ADDR=0.0.0.0:443   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -p 443:443 registry

-e		指定环境变量,容器中可以使用该环境变量
-v		给容器挂载存储卷,挂载到容器的某个目录

所以总的来说这条命令完成了以下功能:

  • 将仓库数据持久化到本地的/opt/registry
  • 讲本地的私钥和证书挂载进容器并设置为变量
  • 将认证文件挂在进容器并设置变量. 同时设置了认证检测的方式

拷贝证书到主机

既然已经做了加密,其他需要访问此仓库的主机如果没有证书显然是没法正常连接的.

##创建与之前创建密钥/证书中Common Name对应名称的目录
mkdir -p /etc/docker/certs.d/reg.westos.org/
cp westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt

##拷贝证书到其他主机
scp /etc/docker/certs.d/reg.westos.org/ca.crt Server2:/etc/docker/certs.d/reg.westos.org/ca.crt

##记得增加本地解析

在Docker主机上进行登录认证

docker login reg.westos.org
输入用户名
输入密码
登录记录成功

之后就可以正常使用私有仓库的功能了.

以上是关于运维实战 容器部分 Docker仓库的主要内容,如果未能解决你的问题,请参考以下文章

运维实战 容器部分 Docker网络

运维实战 容器部分 Docker入门简介

运维实战 容器部分 Docker数据卷

运维实战 容器部分 Docker Swarm

运维实战 容器部分 Docker Machine

运维实战 容器部分 Docker镜像