搭建Docker镜像加速服务

许久未看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
# CentOS && RHEL && Rocky
sudo yum -y install curl
# ubuntu && debian
sudo apt -y install curl

# 国外环境 (直连 Github)
bash -c "$(curl -fsSL https://raw.githubusercontent.com/dqzboy/Docker-Proxy/main/install/DockerProxy_Install.sh)"

# 国内环境 CDN 加速地址 (推荐)
bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/dqzboy/Docker-Proxy/install/DockerProxy_Install.sh)"

# 国内 Github 代理地址 (备选)
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_session_tickets off;
#ssl_protocols TLSv1.2 TLSv1.3;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#ssl_prefer_server_ciphers on;
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

搭建Docker镜像加速服务
http://example.com/2024/12/31/搭建Docker镜像加速服务/
作者
Sanli Ma
发布于
2024年12月31日
许可协议