1.证书创建过程
服务端创建所需目录
mkdir -p /home/docker-registry/certs /home/docker-registry/registry
1.1 创建配置文件(san.cnf)
创建一个文本文件,命名为 san.cnf,用于定义证书生成的配置。示例内容如下:
[req]
distinguished_name = req_distinguished_name
req_extensions = req_ext
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = California
localityName = Locality Name (eg, city)
localityName_default = San Francisco
organizationName = Organization Name (eg, company)
organizationName_default = Example, Inc.
commonName = test (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = siyu.com
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = siyu.com
在 [alt_names] 部分,添加你需要的所有主机名或域名,以 DNS. 开头,依次编号。
1.2 生成私钥文件
openssl genrsa -out /home/docker-registry/certs/domain.key 2048
1.3 生成证书请求(CSR)
使用 OpenSSL 工具根据上面的配置文件生成证书请求。
openssl req -new -out /home/docker-registry/certs/domain.csr -key /home/docker-registry/certs/domain.key -config san.cnf
new:生成新的证书请求。
out: yourdomain.csr:指定输出的证书请求文件。
key yourdomain.key:指定与请求关联的私钥文件。
config san.cnf:指定使用上面定义的配置文件。
1.4 生成自签名证书
openssl x509 -req -in /home/docker-registry/certs/domain.csr -out /home/docker-registry/certs/domain.crt -days 365 -signkey /home/docker-registry/certs/domain.key -extensions req_ext -extfile san.cnf
req:指定输入的文件是一个证书请求。
in yourdomain.csr:指定输入的证书请求文件。
out yourdomain.crt:指定输出的证书文件。
days 365:指定证书有效期限,这里设置为 365 天。
signkey yourdomain.key:指定用于签名证书的私钥文件。
extensions req_ext 和 -extfile san.cnf:指定使用之前定义的扩展配置。
1.5 验证证书中的 SANs
可以使用以下命令验证生成的证书是否正确包含了 SANs:
openssl x509 -noout -text -in /home/docker-registry/certs/domain.crt
在输出中,应该可以看到包含了 [Subject Alternative Name] 部分,列出了所有的 DNS 名称。
重启docker服务
systemctl restart docker
2.自建仓库搭建过程
2.1 docker 客户端配置
cp /home/docker-registry/certs/domain.crt /etc/docker/certs.d/siyu.com/ca.crt
注意siyu.com 文件夹和证书中申请的域名保持一致。
2.2 启动register仓库容器
docker run -d --restart=always --name registry2 -v /home/docker-registry/certs:/certs -v /home/docker-registry/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2
2.3 认证过程
客户端使用ca.crt 证书和服务端的domain.key私钥做认证,认证通过后建立tls连接。
注意:每个客户端都需要:
echo "192.168.1.192 siyu.com" >> /etc/hosts
2.4 k3s 中container配置
注意:不要随意更改/etc/rancher/k3s/k3s.yaml
2.4.1 创建registries.yaml 文件用于配置仓库信息。
vi /etc/rancher/k3s/registries.yaml
mirrors:
siyu.com:
endpoint:
- "https://siyu.com"
configs:
siyu.com:
tls:
ca_file: /etc/pki/tls/certs/ca.crt
注意证书路径是/etc/pki/tls/certs/ca.crt
2.4.2 重启master节点上k3s进程
systemctl restart k3s
k3s 所有节点证书路径都是/etc/pki/tls/certs/ca.crt,都需要证书。
3.自动化脚本
3.1 自动拉取、打标签、推送到仓库脚本
vi autopush_repo.sh
#!/bin/bash
# 检查参数数量
if [ "$#" -ne 2 ]; then
echo "用法: $0 <镜像名称> <镜像版本>"
exit 1
fi
# 获取参数
IMAGE_NAME=$1
IMAGE_VERSION=$2
# 定义仓库地址
REPO_URL="siyu.com"
# 拉取镜像
docker pull ${IMAGE_NAME}:${IMAGE_VERSION}
if [ $? -ne 0 ]; then
echo "拉取镜像失败: ${IMAGE_NAME}:${IMAGE_VERSION}"
exit 2
fi
# 给镜像打标签
NEW_TAG="${REPO_URL}/${IMAGE_NAME}:${IMAGE_VERSION}"
docker tag ${IMAGE_NAME}:${IMAGE_VERSION} ${NEW_TAG}
if [ $? -ne 0 ]; then
echo "打标签失败: ${NEW_TAG}"
exit 3
fi
# 推送镜像到仓库
docker push ${NEW_TAG}
if [ $? -ne 0 ]; then
echo "推送镜像失败: ${NEW_TAG}"
exit 4
fi
echo "成功完成操作: ${NEW_TAG}"
3.2 获取仓库所有镜像名称及版本
vi list_repo-https.sh
#!/bin/bash
REGISTRY_URL="https://siyu.com"
# 获取所有仓库
REPOS=$(curl -ks ${REGISTRY_URL}/v2/_catalog | jq -r '.repositories[]')
for repo in $REPOS; do
echo "Repository: $repo"
# 获取仓库中的所有标签
TAGS=$(curl -ks ${REGISTRY_URL}/v2/${repo}/tags/list | jq -r '.tags[]')
for tag in $TAGS; do
echo " Tag: $tag"
done
done
评论区