501. 【registry】docker-私有仓库实现https-访问

本文介绍了如何通过生成证书来优化Docker私有仓库,消除使用`--insecure-registry`的需要。步骤包括生成CA根证书和registry证书,配置systemd环境变量,以及在客户端安装证书。此外,还解决了docker-registry-frontend的CORS跨域错误,通过在容器内添加域名到hosts文件实现正常访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇,我们已经成功通过 registry 搭建了一个 docker 私有仓库,但仔细点我们会发现,在拉取和推送镜像时,需要附加 --insecure-registry参数,很不方便,这次来优化一下这块。

一、生成证书

  1. 生成 CA 根证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=<YOUR IP>" -days 36500 -out ca.crt
  1. 生成registry ca 证书
cat > domain_ssl.cnf <<EOF
[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[ req_distinguished_name ]

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = <YOUR HOSTNAME>
IP.1 = <YOUR IP>
EOF
  • DNS.1 写成 registry 的访问域名
  • IP.1 写成 registry 所在的机器的IP
  1. 生成 key 和 crt
openssl genrsa -out domain.key 2048

openssl req -new -key domain.key -config etcd_ssl.cnf -subj "/CN=etcd-server" -out domain.csr

openssl x509 -req -in domain.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile domain_ssl.cnf -out domain.crt
  1. domain.crtdomain.key复制到 /etc/docker/registry/certs/目录

二、配置systemd环境变量

systemctl edit registryd

文件内容如下:

[Service]
Environment="REGISTRY_HTTP_TLS_CERTIFICATE=/etc/docker/registry/certs/domain.crt"
Environment="REGISTRY_HTTP_TLS_KEY=/etc/docker/registry/certs/domain.key"

重启并查看服务状态:

[root@qijing0 ~]#  systemctl restart registryd && systemctl status registryd  
● registryd.service - private registry
   Loaded: loaded (/usr/lib/systemd/system/registryd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/registryd.service.d
           └─override.conf
   Active: active (running) since Mon 2022-11-21 23:08:20 EST; 8ms ago
     Docs: https://github.com/distribution/distribution# readme
 Main PID: 15662 (registry)
    Tasks: 5
   Memory: 6.5M
   CGroup: /system.slice/registryd.service
           └─15662 /usr/bin/registry serve /etc/docker/registry/config.yml

Nov 21 23:08:20 qijing0 systemd[1]: Started private registry.

三、在客户端机器安装证书

复制 domain.crt/etc/containerd/certs.d/domain/目录下。
并重启 containerd

四、验证

推送镜像验证:

[root@k8s0 server]#  nerdctl push domain/test-server:0.0.5
INFO[0000] pushing as a reduced-platform image (application/vnd.docker.distribution.manifest.v2+json, sha256:e0f152bb79f22dcbaaf4429cf8bc3cff75d831a5bee8042acf018560f5900586) 
manifest-sha256:e0f152bb79f22dcbaaf4429cf8bc3cff75d831a5bee8042acf018560f5900586: done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:cf3c9b089da1f8120c9ee912752dd14d56d7ef769d81d6a81423dea7324a3e5b:   done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 0.1 s                                                                    total:  6.4 Ki (63.3 KiB/s)   

  • 可以看到现在能正常推送镜像了

拉取镜像验证:

[root@k8s1 tmp]#  nerdctl pull registry.domain.cn/test-server:0.0.5
registry.domain.cn/test-server:0.0.5:                                          resolved       |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:e0f152bb79f22dcbaaf4429cf8bc3cff75d831a5bee8042acf018560f5900586: done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:cf3c9b089da1f8120c9ee912752dd14d56d7ef769d81d6a81423dea7324a3e5b:   done           |++++++++++++++++++++++++++++++++++++++| 
elapsed: 0.1 s                                                                    total:   0.0 B (0.0 B/s)                                         
[root@k8s1 tmp]#  date
Tue Nov 22 13:54:41 CST 2022

  • 可以看到现在能正常拉取镜像了

【附加1】、安装 konradkleine/docker-registry-frontend:v2用户界面

上一节安装的是joxit/docker-registry-ui,没升级成https之前还蛮好使用的,升级之后,就一直报 CORS 跨域错误,折腾了会,还是决定换一个用户界面程序,来支持 https:

docker run \
  -d \
  -e ENV_DOCKER_REGISTRY_HOST=registry.domain.cn \
  -e ENV_DOCKER_REGISTRY_PORT=443 \
  -e ENV_DOCKER_REGISTRY_USE_SSL=1 \
  -p 5001:80 \
  konradkleine/docker-registry-frontend:v2

安装完之后,也不是一帆风顺,刚开始也获取不到镜像列表,我从浏览器访问,按f12之后,发现解析不了域名,于是手动进入容器内部,在 /etc/hosts中添加了域名:

[root@qijing0 ~]#  docker exec -it 6d /bin/bash
root@6d48c37a52c5:/#  cat >>/etc/hosts<<EOF
> 192.168.3.1 registry.domain.cn
> EOF

ok!,现在可以了,通过浏览器能顺利访问到镜像列表了,足够了。
用户界面首页
镜像列表

<think>我们正在解决的是使用`kubectl create secret docker-registry`命令时出现参数错误的问题。 根据引用[1]和引用[2]中的示例,正确的命令格式应该是: kubectl create secret docker-registry <secret-name> \ --docker-server=<your-registry-server> \ --docker-username=<your-username> \ --docker-password=<your-password> \ [--docker-email=<your-email>] # 注意:docker-email现在不是必须的,但某些旧版本可能需要 用户提供的错误示例(引用[1]): kubectl create secret docker-registry regcred --docker-server=192.1667.119 --8.40.204 --docker-username=leetest --docker-password=xxxxxxx 这个命令有几个明显的问题: 1. `--docker-server`参数后面跟着一个IP地址,但紧接着又出现了一个`--8.40.204`,这显然不是一个合法的参数。 2. 参数之间应该用空格分隔,且每个参数前面都有两个短横线(--)。 因此,我们需要检查命令的格式是否正确,确保每个参数都是完整的,并且值正确。 解决方法步骤: 1. **检查参数格式**: 确保每个参数都是以`--`开头,并且参数名和值之间用空格分隔(或者用等号连接,如`--docker-server=192.166.119.8:204`也是允许的)。 错误示例中出现了`--8.40.204`,这可能是用户试图将两个IP地址合并或者写错了。正确的`--docker-server`应该是一个完整的域名或IP(可能包含端口),例如: --docker-server=192.166.119.8:204 或者 --docker-server=registry.example.com 2. **确保IP地址和端口的正确性**: IP地址的每个部分必须在0到255之间,而示例中的`192.1667.119`是不合法的(因为1667超过了255)。同样,端口号必须是有效的(0-65535)。 3. **检查参数顺序**: 命令的参数顺序并不重要,但是每个参数必须完整。注意,`kubectl`命令要求参数的正确性,不能出现无法识别的参数。 4. **使用等号赋值(可选)**: 为了避免参数值中包含空格导致的问题,可以使用等号将参数名和值连接起来,例如: --docker-server=192.166.119.8:204 5. **检查是否缺少必要参数**: 创建docker-registry类型的secret,必须的参数有:`--docker-server`, `--docker-username`, `--docker-password`。`--docker-email`在较新版本的Kubernetes中已经不是必须的。 6. **验证命令**: 在输入命令后,如果出现错误,Kubernetes会给出错误提示。根据提示进行修正。 7. **使用帮助命令**: 如果不确定命令的用法,可以使用: kubectl create secret docker-registry --help 根据上述分析,用户示例命令应修正为: kubectl create secret docker-registry regcred \ --docker-server=192.166.119.8:204 \ --docker-username=leetest \ --docker-password=xxxxxxx 注意:这里假设IP地址192.166.119.8和端口204是正确的,并且该地址是Docker registry的地址。 如果用户使用的是私有仓库,可能还需要注意仓库是否使用TLS,如果使用自签名证书,可能需要额外配置。 另外,引用[3]提到,也可以使用`docker login`命令先登录,然后使用`kubectl create secret generic`基于`~/.docker/config.json`文件创建secret,这种方法可以避免在命令行中暴露密码。 因此,另一种解决方案是: 步骤1:使用docker login登录到私有仓库 docker login 192.166.119.8:204 -u leetest -p xxxxxxx 步骤2:创建secret,使用生成的配置文件 kubectl create secret generic regcred \ --from-file=.dockerconfigjson=/root/.docker/config.json \ --type=kubernetes.io/dockerconfigjson 这种方法更安全,且避免了在命令行中直接写密码(因为docker login会交互式输入密码,但这里用-p参数仍然会在history中留下记录,所以更安全的是不加-p,然后手动输入密码)。 总结:参数错误通常是由于格式不正确或参数值不合法造成的,按照上述步骤检查和修正即可。 如果问题仍然存在,请检查kubectl版本,并查看官方文档。 生成相关问题:</think>### 解决 `kubectl create secret docker-registry` 参数错误的方法 #### 🔍 错误原因分析 根据引用[1]中的错误示例: ```bash kubectl create secret docker-registry regcred \ --docker-server=192.1667.119 --8.40.204 \ # ⚠️ 非法格式 --docker-username=leetest \ --docker-password=xxxxxxx ``` 主要问题: 1. **IP地址格式错误**:`192.1667.119` 包含无效数字(1667 > 255) 2. **参数语法错误**:`--8.40.204` 不是合法参数(参数必须以 `--` 开头后接字母) 3. **缺少必要参数**:未指定完整的 registry 地址和端口 #### ✅ 正确解决步骤 1. **验证 Docker 仓库地址格式** - 标准格式:`<协议>://<域名或IP>:<端口>` - 合法示例: ```bash # 公网仓库 --docker-server=https://registry.cn-hangzhou.aliyuncs.com # 内网私有仓库 --docker-server=http://192.168.1.100:5000 # 注意IP范围(0-255) ``` 2. **完整参数修正示例** ```bash kubectl create secret docker-registry regcred \ --docker-server=https://192.168.1.100:5000 \ # ✅ 完整地址 --docker-username=your_username \ # ✅ 用户名 --docker-password='your_password' \ # ✅ 密码(特殊字符需引号) --docker-email=user@example.com \ # 可选但推荐 -n your-namespace # 指定命名空间 ``` 3. **关键参数说明** | 参数 | 要求 | 示例 | |------|------|------| | `--docker-server` | 完整仓库地址 | `https://registry.example.com` | | `--docker-username` | 仓库认证用户名 | `admin` | | `--docker-password` | 密码(含特殊字符时用单引号) | `'P@ssw0rd!#'` | | `--docker-email` | 邮箱(部分仓库需要) | `user@domain.com` | 4. **验证创建的 Secret** ```bash # 查看 secret 详情 kubectl get secret regcred -o yaml # 检查 base64 解码内容 echo "XXXXX" | base64 --decode # 替换XXXXX为实际值 ``` #### ⚠️ 常见错误排查 1. **IP地址范围错误** - ❌ `192.400.1.1` → ✅ `192.168.1.1` - 每个数字必须在 **0-255** 范围内 2. **特殊字符处理** - 密码含 `$`、`!` 等字符时需用单引号: ```bash --docker-password='P@$$w0rd!' ``` 3. **协议缺失** - ❌ `registry.example.com` → ✅ `https://registry.example.com` 4. **端口冲突** - 确保端口未被占用:`netstat -tuln | grep 5000` #### 💡 替代方案(避免参数错误) 通过配置文件创建(引用[2][3]): ```bash # 1. 先登录 Docker docker login registry.example.com -u username -p password # 2.Docker 配置生成 secret kubectl create secret generic regcred \ --from-file=.dockerconfigjson=$HOME/.docker/config.json \ --type=kubernetes.io/dockerconfigjson ``` > 此方法避免命令行参数错误,且密码不会出现在命令历史中[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值