许久未看k3s的lobe-chat的自动更新,今天上去一看发现又出现了问题:
1
| pod/lobe-chat-deployment-77499fc5b5-pfl6s 0/1 ImagePullBackOff 0 10m
|
报错为ImagePullBackOff,又是镜像环节出问题,一番排查发现是镜像源挂了。反反复复,决定搭建一个自己的镜像加速服务。
本文选择 私有 Registry Mirror/Proxy 方案,并使用开源项目 docker-proxy 作为实现工具。
2. 使用 Docker-Proxy 搭建镜像代理
2.1 Docker-Proxy 简介
docker-proxy 是一个轻量级的 Docker Registry 代理工具,它可以缓存上游 Registry 的镜像层,从而加速后续的镜像拉取。其核心原理是在本地构建一个中间层,当客户端请求镜像时,docker-proxy 会先检查本地是否存在该镜像层,如果存在则直接返回,否则从上游 Registry 拉取并缓存到本地。
项目地址: https://github.com/dqzboy/Docker-Proxy
主要特点:
- 简单易用: 通过简单的脚本即可完成安装和配置。
- 轻量高效: 占用资源少,性能良好。
- 支持多种部署方式: 可以直接部署在物理机或虚拟机上,也可以部署在 Docker 容器中。
- 可配置 upstream: 可以指定多个上游 Registry 源。
2.2 部署方法
docker-proxy 提供了便捷的安装脚本,可以根据不同的网络环境选择合适的安装方式。
1 2 3 4 5 6 7 8 9 10 11 12 13
| sudo yum -y install curl
sudo apt -y install curl
bash -c "$(curl -fsSL https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh)"
bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/dqzboy/Docker-Proxy/install/DockerProxy_Install.sh)"
bash -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh)"
|
我使用的是国外的 Ubuntu 服务器,因此执行了以下命令:
1
| bash -c "$(curl -fsSL https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh)"
|
执行脚本后,会弹出交互式菜单,你可以根据需要选择安装的服务。这里我们选择安装 Nginx 作为反向代理服务器,用于对外提供加速服务。

2.3 配置 Nginx 反向代理
安装完成后,如果需要使用自定义域名访问加速服务,需要修改 Nginx 的配置文件。该文件位于 /etc/nginx/conf.d/docker-proxy.conf。
1
| sudo vim /etc/nginx/conf.d/docker-proxy.conf
|
你需要修改 server_name 指令为你自己的域名,并配置 SSL 证书。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| ubuntu@ip-172-31-4-216:~$ cat /etc/nginx/conf.d/docker-proxy.conf server { listen 80; listen 443 ssl; server_name server_name; ssl_certificate /etc/nginx/conf.d/server_name.pem; ssl_certificate_key /etc/nginx/conf.d/server_name.key; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_buffer_size 8k; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; location / { proxy_pass http://localhost:51000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Nginx-Proxy true; proxy_buffering off; proxy_redirect off; } }
|
修改完成后,检查 Nginx 配置语法并重启 Nginx 服务:
1 2
| sudo nginx -t sudo systemctl reload nginx
|
3. 配置 Docker 客户端使用加速服务
配置 Docker 客户端使用镜像加速服务非常简单,只需要修改 Docker 的配置文件 daemon.json。
1
| sudo vim /etc/docker/daemon.json
|
将以下内容添加到 daemon.json 文件中:
1 2 3 4 5
| { "registry-mirrors": [ "https://hub.your_domain.com" ] }
|
解释:
"registry-mirrors": 指定 Docker 客户端使用的镜像加速地址列表。
修改完成后,重启 Docker 服务使配置生效:
1
| sudo systemctl restart docker
|
现在,当你尝试拉取镜像时,Docker 客户端会自动尝试从你配置的加速地址拉取。
1
| docker pull nginx:latest
|
3.1 处理 TLS 证书问题 (不推荐)
在我配置的过程中,发现使用自定义域名和自签名证书时,Docker 客户端会报证书验证错误:
1
| Error response from daemon: Get "https://hub.your_domain.com/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
|
这是因为 Docker 客户端默认会验证 HTTPS 连接的证书。如果你使用的是自签名证书或者内部 CA 签发的证书,需要在 Docker 客户端配置信任该证书颁发机构。 强烈建议使用受信任的 CA 签发的证书来避免安全风险。
如果出于测试目的,你确实需要禁用 TLS 验证,可以添加 insecure-registries 配置项到 /etc/docker/daemon.json 中。
1 2 3 4 5 6 7 8
| { "insecure-registries": [ "hub.your_domain.com" ], "registry-mirrors": [ "https://hub.your_domain.com" ] }
|
注意:使用 insecure-registries 会禁用 TLS 证书验证,这将带来安全风险,可能导致中间人攻击。请仅在明确风险并只在测试环境中使用。生产环境务必使用可信的 SSL 证书。
4. 配置 containerd 使用加速服务 (K3s 环境)
如果你像我一样使用 k3s,那么你的容器运行时是 containerd。你需要修改 containerd 的配置文件来使用镜像加速服务。
containerd 的配置文件通常位于 /etc/rancher/k3s/registries.yaml
处理 TLS 证书问题 (不推荐 for containerd):
与 Docker 类似,containerd 也会验证 TLS 证书。如果你遇到了证书问题,并且 确信风险可控,可以在 endpoint 中使用 http:// 协议禁用 TLS 验证。
1 2 3 4 5
| mirrors: "docker.io": # endpoint指定镜像加速服务的地址。 endpoint: - "http://hub.your_domain.com"
|
同样,强烈不建议在生产环境禁用 TLS 验证。
修改完成后,重启 k3s 服务使配置生效:
1
| sudo systemctl restart k3s
|