docker之创建镜像的私有仓库以及设置加密认证

1.什么是Docker 仓库

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

2. 私有仓库registry的优势

(1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可

(2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。

3.Registry的工作原理

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

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

(1)index

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

(2)registry

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

(3)Registry Client

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

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

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

(1)拉取私有仓库的镜像
在这里插入图片描述(2)基于镜像运行registry容器
在这里插入图片描述
(3)将本地镜像上传至私有仓库

本地镜像在命名时需要加上仓库的ip和端口

在这里插入图片描述
(4)尝试拉取刚刚上传的镜像
拉取前先把本地创建的镜像删掉

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

(5)查看/opt/registry/目录下的镜像数据
在这里插入图片描述

5.给私有仓库添加证书

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

在这里插入图片描述这样的库任何人都可以访问,这样不安全,下来我们要增加库的安全性

(2)创建服务端key以及证书

给私有仓库生成证书和key

openssl req \
> -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key \
> -x509 -days 365 -out certs/westos.org.crt
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:shaanxi
Locality Name (eg, city) [Default City]:xi'an
Organization Name (eg, company) [Default Company Ltd]:westos
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:reg.westos.org
Email Address []:[email protected]

在这里插入图片描述
(3)添加本地解析

在这里插入图片描述
(4)重新创建一个加密的仓库

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

(5)再次构建容器(私有仓库)

[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 registry
[root@server1 docker]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
e265e9422105        registry     "/bin/registry /etc/…"   8 seconds ago       Up 7 seconds   

(6)创建证书存放目录,并复制证书

[root@server1 docker]# pwd
/etc/docker
[root@server1 docker]# 
[root@server1 docker]# mkdir certs.d
[root@server1 docker]# cd certs.d/
[root@server1 certs.d]# mkdir westos.org
[root@server1 certs.d]# cd westos.org/
[root@server1 westos.org]# ls
[root@server1 westos.org]# cp /etc/docker/certs/westos.org.crt ca.crt
[root@server1 westos.org]# ls
ca.crt

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

在这里插入图片描述在这里插入图片描述(8)尝试用另一台主机server2从server1的私有仓库上面拉取镜像

server2安装 docker,然后开启docker,并添加解析

在server2上面创建同样的证书目录,并将服务端证书传到此位置

[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# mkdir certs.d
[root@server2 docker]# cd certs.d/
[root@server2 certs.d]# mkdir westos.org
[root@server2 certs.d]# cd westos.org/
[root@server2 westos.org]# pwd
/etc/docker/certs.d/westos.org
[root@server2 westos.org]# 
[root@server2 westos.org]# scp server1:/etc/docker/certs.d/westos.org/ca.crt .
The authenticity of host 'server1 (172.25.6.1)' can't be established.
ECDSA key fingerprint is 7a:fa:3a:af:79:70:19:7a:2d:c7:64:0c:e5:bb:7f:96.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,172.25.6.1' (ECDSA) to the list of known hosts.
root@server1's password: 
ca.crt                                                  100% 2098     2.1KB/s   00:00    
[root@server2 westos.org]# 
[root@server2 westos.org]# ls
ca.crt

拉取测试

在这里插入图片描述

6.配置用户权限 ,给证书加密

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

(1)在服务端设置用户密码

docker run --rm --entrypoint htpasswd registry -Bbn yrx westos > auth/htpasswd

docker run --rm --entrypoint htpasswd registry -Bbn admin redhat > auth/htpasswd

在这里插入图片描述(2)再次创建仓库
同理,先删除之前的

[root@foundation19 ~]# docker rm -f registry			##删除之前的registry容器
registry
[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
7199dc961d915972cfaa8684cc4e606dcc4347c174ad90d0bed293bfbaae30ba
[root@server1 docker]# 

在这里插入图片描述(3)准备上传本地镜像到私有仓库当中,先换标签

在这里插入图片描述(5)上传本地镜像到私有仓库当中

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

在这里插入图片描述
(6)登录加密仓库,并输入用户名和密码进行认证
在这里插入图片描述
(7)在文件config.json 中可以看到记录的认证(认证一次,永久保存)

在这里插入图片描述
(8)此时再次上传就成功了

在这里插入图片描述

(9)server2拉取私有仓库镜像(先登陆认证)
在这里插入图片描述

发布了260 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yrx420909/article/details/105385126
今日推荐