一、仓库加密

  • 实验前准备:
      打开VM中的CentOS系统,从中克隆两个子系统分别为CentOS 1和CentOS 2,以便于后面在MobaXter中可以同时开两个子root终端,一个用作仓库(服务器)颁发证书,一个用作客户端。
    注意: 一个主系统和一个克隆系统同时只能开一个,因此克隆两个子系统
  • 完整流程:
    ①服务器端(只做一次)
    搭建 registry
    配置 HTTPS 证书
    启动服务
    ②客户端(每台要用的机器都要做)
    拷贝服务器证书到本地 docker 目录
    重启 docker
    docker tag 打标签
    docker push 上传
    docker pull 下载

接下来的实验中,我将采用ip后三位为138作为我的仓库,139作为我的客户端

1.在仓库中下载并升级软件包

我这里是提前下好了,给大家展示一下

yum install -y https://mirrors.aliyun.com/epel/7/x86_64/Packages/o/openssl11-1.1.1k-7.el7.x86_64.rpm
yum install -y openssl11-1.1.1k-7.el7.x86_64.rpm 

在这里插入图片描述

2.添加域名解析

vim /etc/hosts

在这里插入图片描述

3.创建证书目录

在编辑器中添加IP与域名192.168.72.138 server1 reg.westos.org

mkdir certs

在这里插入图片描述

4.生成SSL证书(核心步骤)

调用openssl工具一次性生成私钥和自签名证书,注意域名保持一致

openssl11 req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -addext "subjectAltName = DNS:reg.westos.org" -x509 -days 365 -out certs/westos.org.crt

在这里插入图片描述

5.部署私有Docker仓库并解决证书信任问题

用官方的registry镜像,运行私有仓库容器

docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/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 registry

在这里插入图片描述

6.给本地镜像打标签并推送(139客户端)

(1)打标签:把本地的nginx:latest镜像,打上「目标私有仓库地址」的标签。

 docker tag nginx:latest reg.westos.org/nginx:latest

在这里插入图片描述
(2)推送:Docker镜像推送(push)时,必须带上目标仓库的完整地址,否则会默认推送到Docker Hub。这一步是告诉Docker,这个镜像将来要推到reg.westos.org这个私有仓库里。

docker push reg.westos.org/nginx:latest      

在这里插入图片描述

这一步会报错,我们用的是「自签名证书」,不是CA机构颁发的证书,Docker客户端默认不信任它,所以拒绝连接。因此下面要做「客户端证书部署」。

7.配置Docker信任自签名证书(139客户端)

先创建Docker客户端证书目录

mkdir -p /etc/docker/certs.d/reg.westos.org/

在这里插入图片描述

7.复制证书到客户端信任目录

cp /root/certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt

8.验证结果分析

(1)在139客户端再次上传镜像,结果无报错,证明Docker 已经信任你的自签名证书,成功将本地 nginx 镜像推送到私有仓库

docker push reg.westos.org/nginx:latest      

在这里插入图片描述
(2)查看仓库目录,返回 {“repositories”:[“nginx”]},明确显示仓库中已有 nginx 镜像

curl -k https://reg.westos.org/v2/_catalog

(3)从仓库下载镜像

docker pull reg.westos.org/nginx:latest

在这里插入图片描述

二、仓库认证

  仓库认证是没有账号密码就不能pull/push,输入正确账号密码才能正常使用。

1.服务器安装 httpd-tools、创建用户密码

(1)安装 htpasswd 命令(用来创建仓库账号密码)

yum install -y httpd-tools

在这里插入图片描述

(2)创建一个目录叫 auth,用来存放账号密码文件

mkdir auth

在这里插入图片描述

(3)-B:使用强加密 bcrypt 加密密码;-c:create 创建新文件。创建第一个用户 admin并设置密码

htpasswd -Bc auth/htpasswd admin

在这里插入图片描述

(4)没有-c,所以不会覆盖原有文件,只是追加用户,添加第二个用户wxh并设置密码

 htpasswd -B auth/htpasswd wxh

在这里插入图片描述

(5)查看密码文件
得到的结果是加密后的账号密码,不是明文非常安全

cat auth/htpasswd

在这里插入图片描述

2.删除旧仓库,重新创建带认证的仓库

(1)停止并删除旧的registry容器,因为要重新创建带密码认证的仓库

docker rm -f registry

在这里插入图片描述

(2)设置开机自启,这一步跑完,仓库变成必须账号密码才能使用!

docker run -d -p 443:443 --restart=always --name registry -v /opt/registry:/var/lib/registry -v /root/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 -v /root/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry

在这里插入图片描述

3.客户端(服务器充当)登录仓库(必须登录才能上传下载)

为什么 server1(仓库服务器)也能当客户端?
一台机器,可以同时装两个角色
它运行 registry → 它是服务器
它自己也装了 Docker → 它同时也是客户端

“在这里先用服务器当客户端测试仓库是否正常,测试成功后,再用真的的客户端清理旧配置、拷贝证书,正式使用!”

(1)登录私有仓库,输入你创建的账号密码

docker login reg.westos.org

在这里插入图片描述

(2)查看登录状态,登录成功后,Docker会把认证信息存在这里

cat .docker/config.json

在这里插入图片描述

4.验证上传

(1)打标签,让镜像指向私有仓库

docker tag busybox:latest reg.westos.org/busybox:latest

在这里插入图片描述

(2)上传镜像,上传成功,因为已经登录

docker push reg.westos.org/busybox:latest

在这里插入图片描述

5.curl 带账号密码访问仓库(验证认证)

会返回仓库里的镜像列表

curl -k https://reg.westos.org/v2/_catalog  -u admin:westos

在这里插入图片描述

6.登出私有仓库,后面真正的客户端要登录

[root@server1 ~]# docker logout reg.westos.org

7.139客户端配置

(1)移除之前的非安全仓库配置

mv daemon.json  /mnt/

(2)重启Docker生效

systemctl  restart docker

(3)重新做域名解析,让139重新认识reg.westos.org

vim /etc/hosts

(4)138服务器上把证书拷贝到139,让139信任私有仓库的自签名证书

cd /etc/docker/
scp -r certs.d/ server2:/etc/docker/

8.139客户端登录仓库

用第二个账号wxh登录

docker login reg.westos.org

9.139客户端拉取镜像

docker pull reg.westos.org/busybox

更多推荐