Docker容器技术 第四节 --- 仓库的加密与认证
一、仓库加密
- 实验前准备:
打开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
更多推荐


所有评论(0)