You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS下Minikube中私有Docker Registry登录失败求助

问题梳理
  • 环境:macOS Big Sur + Minikube(VirtualBox 6.1.48),Minikube虚拟机内部用docker-compose部署了registry:2私有仓库,容器正常运行
  • 症状:
    • 执行docker login localhost:5000或docker login 0.0.0.0:5000:TLS握手超时
    • 执行docker login 192.168.59.108:5000(Minikube虚拟机IP):401未授权
  • 已排查操作:关闭杀毒软件、设置no_proxy环境变量、重建Minikube VM、查找Docker配置文件未找到,均无效
解决方案

1. 解决localhost:5000 TLS握手超时问题

Minikube虚拟机默认不会将内部容器端口直接映射到主机的localhost,需要手动建立端口转发:

  • 执行以下命令,将主机的5000端口转发到Minikube虚拟机的5000端口:
    minikube ssh -L 5000:localhost:5000
    
    保持该终端窗口打开,之后主机即可通过localhost:5000访问Minikube内的Registry。

2. 解决192.168.59.108:5000 401未授权问题

2.1 验证htpasswd认证文件有效性

  • 确认htpasswd文件是用bcrypt加密生成的(Registry v2强制要求),重新生成命令:
    # 在Minikube虚拟机内执行,或者本地生成后同步到Minikube的/auth目录
    htpasswd -Bc /auth/htpasswd <你的用户名>
    
    输入密码后,检查文件格式应为:用户名:$2y$开头的加密串
  • 进入容器验证文件权限与内容:
    docker exec -it kernel-registry cat /auth/htpasswd
    docker exec -it kernel-registry ls -l /auth/htpasswd
    
    确保文件存在,且容器内用户(默认UID 10000)拥有读取权限。

2.2 修复自签名证书的SAN配置

mkcert默认生成的证书仅包含localhost和127.0.0.1,需要添加Minikube虚拟机IP作为SAN扩展:

  • 重新生成证书:
    mkcert localhost 127.0.0.1 192.168.59.108
    
  • 将生成的localhost+2.pem(重命名为registry.crt)和localhost+2-key.pem(重命名为registry.key)同步到Minikube虚拟机的/certs目录下:
    minikube cp ./registry.crt minikube:/certs/
    minikube cp ./registry.key minikube:/certs/
    
  • 重启Registry容器:
    docker-compose down && docker-compose up -d
    

2.3 让主机Docker信任自签名证书

  • 在主机上创建对应Registry地址的证书目录:
    mkdir -p ~/.docker/certs.d/192.168.59.108:5000
    mkdir -p ~/.docker/certs.d/localhost:5000
    
  • 将生成的registry.crt复制到上述目录:
    cp ./registry.crt ~/.docker/certs.d/192.168.59.108:5000/ca.crt
    cp ./registry.crt ~/.docker/certs.d/localhost:5000/ca.crt
    
  • 重启主机Docker服务:
    killall Docker && open /Applications/Docker.app
    

3. 处理http.secret提示

该提示为警告而非错误,Registry会自动生成http.secret并存储在容器内的/var/lib/registry/docker/registry/v2/config.yml中。若需手动设置,可在docker-compose.yml的environment中添加:

REGISTRY_HTTP_SECRET: "随机生成的32位字符串"

例如用openssl rand -hex 16生成随机串。

4. 若需使用HTTP访问(可选)

若移除TLS配置后出现server gave HTTP response to HTTPS client,需在主机创建~/.docker/daemon.json(不存在则新建):

{
  "insecure-registries": ["192.168.59.108:5000", "localhost:5000"]
}

重启Docker服务后即可用HTTP访问。

内容的提问来源于stack exchange,提问作者Himmels DJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:41:10