Docker容器技术学习(5)——Docker的私有仓库、设置加密认证、为私有仓库添加web界面

一、什么是Docker 仓库?

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载
国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问
当然,用户也可以在本地网络内创建一个私有仓库
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库
这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了

二、 私有仓库registry的优势

有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似
使用私有仓库有许多优点

  • 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
  • 提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。
Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。
如果需要安装registry v2,只需下载registry:2.2即可。
Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。

三、Registry的工作原理

在这里插入图片描述
解读:
Index服务主要提供镜像索引以及用户认证的功能
当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端
docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性
不同镜像可以保存在不同的registry服务上,其索引信息都放在index服务上

Docker Registry有三个角色,分别是index、registry和registry client

  • index

      负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
      Web UI
      元数据存储
      认证服务
      符号化
    
  • registry

      是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
    
  • Registry Client

      Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
    

四、创建私有仓库以及上传本地镜像到私有仓库当中

Docker 官方已经把仓库封装为镜像,直接通过启动容器就可以完成部署仓库,导入registry镜像

步骤一:从真机给server1发送一个私有仓库的镜像

在这里插入图片描述
步骤二:导入镜像,并查看
在这里插入图片描述
步骤三:基于镜像运行registry容器

在这里插入图片描述
在这里插入图片描述
步骤四:将本地镜像上传至私有仓库
本地镜像在命名时需要加上仓库的ip和端口

在这里插入图片描述

步骤五:尝试拉取刚刚上传的镜像

拉取前先把本地创建的镜像删掉

在这里插入图片描述
尝试拉取镜像

在这里插入图片描述
可看到拉取成功

步骤六:安装tree,查看/opt/registry/目录下的镜像数据

刚在做镜像加速器实验的时候开启了真机的防火墙,先关闭

systemctl stop firewalld.service
yum install tree -y
cd /opt/registry/
tree docker/

在这里插入图片描述

同时我们还发现镜像ID其实与上图中nginx镜像中最上层的ID相同

五、给私有仓库添加证书

步骤一:新加一台主机server2,尝试去访问上面我们建好的私有仓库里面的镜像,看看能否成功

在这里插入图片描述
在这里插入图片描述

这样的库任何人都可以访问,这样不安全,下来我们要增加库的安全性

步骤二:创建服务端key以及证书

给私有仓库生成证书和key

[root@server1 ~]# mkdir -p certs
[root@server1 ~]# openssl req \
> -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key \
> -x509 -days 365 -out certs/westos.org.crt

在这里插入图片描述

步骤三:添加本地解析

vim /etc/hosts

在这里插入图片描述

步骤四:重新创建一个加密的仓库

删除之前的registry仓库,也可以不用删除,起一个别的名字,因为我想用registry做私有仓库名字

在这里插入图片描述

步骤五:再次构建容器(私有仓库)

[root@server1 ~]# netstat -antlp | grep :443
[root@server1 ~]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -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 \
> -v /opt/registry:/var/lib/registry registry:2.3.1
785182b78ad1de91d0c75c36da0c588c24c0e384333b37453f36727b197e71bb
[root@server1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
785182b78ad1        registry:2.3.1      "/bin/registry /etc/…"   5 seconds ago       Up 5 seconds        0.0.0.0:443->443/tcp, 5000/tcp   registry

在这里插入图片描述
步骤六:创建证书存放目录,并复制证书

在这里插入图片描述
步骤七:再次把本地镜像上传到刚刚建立的私有仓库里面

在这里插入图片描述
上传镜像
在这里插入图片描述

步骤八:尝试用另一台主机server2从server1的私有仓库上面拉取镜像

先配置一下server2
server2安装 docker,然后开启docker,并添加解析
在真机上搭建共享yum源,开启apache,开启防火墙

在这里插入图片描述
把server1上面编写好的yum仓库文件给server2发过去一份

server1

cd /etc/yum.repos.d/
scp docker-ce.repo server2:/etc/yum.repos.d/
scp container-selinux-2.77-1.el7.noarch.rpm server2:/root/

在这里插入图片描述
在这里插入图片描述
在serve2上安装docker
server2

在这里插入图片描述

yum install docker-ce container-selinux-2.77-1.el7.noarch.rpm -y
systemctl start docker.service
systemctl enable docker.service

在这里插入图片描述
在server2上面创建同样的证书目录,并将服务端证书传到此位置

在这里插入图片描述

拉取测试

在这里插入图片描述
在这里插入图片描述
拉取成功

六、配置用户权限 ,给证书加密

如果想要控制registry的使用权限,使其只有在登录用户名和密码之后才能使用的话
还需要做额外的设置,registry的用户名密码文件可以通过htpasswd来生成

步骤一:在服务端设置用户密码并查看

[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
certs  certs.d  daemon.json  key.json
[root@server1 docker]# mkdir auth
[root@server1 docker]# ls
auth  certs  certs.d  daemon.json  key.json
[root@server1 docker]# docker run --entrypoint htpasswd registry:2.3.1 -Bbn meng westos > auth/htpasswd
[root@server1 docker]# docker run --rm  --entrypoint htpasswd registry:2.3.1 -Bbn admin westos >> auth/htpasswd
[root@server1 docker]# ls
auth  certs  certs.d  daemon.json  key.json
[root@server1 docker]# cat auth/htpasswd
meng:$2y$05$.QZ44Pb3ekpUgDHNbQ9aku/ioTEbEk6Ls.hijXGa0pruTk2A2X0D6

admin:$2y$05$KxbDlIc5uxMlKCSy4ZCeiOyLalZ4E0tEnf9Ti0kK0b9wQFzFeQt1K

在这里插入图片描述

步骤二:创建仓库

同理,先删除之前

[root@server1 docker]# pwd
/etc/docker
[root@server1 docker]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -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 \
> -v /opt/registry:/var/lib/registry \
> -v "$(pwd)"/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2.3.1
efe4897f87111d7bb0767882871a9032a7f521d201b1360837e9f79866c5a896

在这里插入图片描述查看进程
在这里插入图片描述
步骤三:准备上传本地镜像到私有仓库当中,先换标签

在这里插入图片描述
步骤四:查看一下443端口是否开启

在这里插入图片描述
步骤五:上传本地镜像到私有仓库当中

此时上传显示没有基础认证,上传失败

在这里插入图片描述

步骤六:登录加密仓库,并输入用户名和密码进行认证

上面设置的为

	用户名:admin
	密码:westos

在这里插入图片描述

步骤七:在文件config.json 中可以看到记录的认证(认证一次,永久保存)

在这里插入图片描述

步骤八:再次上传

在这里插入图片描述

七、给私有库添加WebUI界面

步骤一:先从真机给server1发送一个web镜像

在这里插入图片描述

步骤二:导入镜像并且查看

在这里插入图片描述
查看
在这里插入图片描述

步骤三:重新创建仓库

先删除之前的私有仓库

在这里插入图片描述

[root@server1 docker]# pwd
/etc/docker
[root@server1 docker]# docker run -d \
> --restart=always \
> --name registry \
> -v "$(pwd)"/certs:/certs \
> -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 \
> -v /opt/registry:/var/lib/registry \
> -v "$(pwd)"/auth:/auth \
> -e "REGISTRY_AUTH=htpasswd" \
> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
> -e REGISTRY_STORAGE_DELETE_ENABLED=true registry:2.3.1
dd6eca21a380fe798d11af8d18286ed4be81bcb6015fa44edb073b7154622a9d		##在这里加上了删除的操作
[root@server1 docker]# 

在这里插入图片描述

在这里插入图片描述
步骤四:运行web界面

注意:auth等于刚才登陆之后生成的认证信息

[root@server1 docker]# docker run -d -p 8080:8080 --name registry-web --link registry:westos.org -e REGISTRY_URL=https://westos.org/v2 -e REGISTRY_TRUST_ANY_SSL=true -e REGISTRY_BASIC_AUTH="YWRtaW46d2VzdG9z" -e REGISTRY_NAME=westos.org docker-registry-web
1ff493dfa02372145c0d4260df617e9f6e535957e2e959a2a9bb2eaa1e6b5140

在这里插入图片描述步骤五:测试:在浏览器输入172.25.2.1:8080

在这里插入图片描述

发布了99 篇原创文章 · 获赞 3 · 访问量 1587

猜你喜欢

转载自blog.csdn.net/weixin_45784367/article/details/105408093