1. 前期准备
准备一台国外可以正常访问 Docker 、Google 和 K8s 的服务器,且没有被墙的
2.基础环境安装
- 添加 YUM 源
[root@proxy ~]# yum update
[root@proxy ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@proxy ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装 Docker
#可以查看所有仓库中所有docker版本,并选择特定版本安装
[root@proxy ~]# yum list docker-ce --showduplicates | sort -r
[root@proxy ~]# yum install -y docker-ce
- 启动 Docker
[root@proxy ~]# systemctl enable docker && systemctl start docker
3. 部署镜像仓库代理
- 创建账号密码【可选】
配置账号密码:设置密码认证后,我们在进行拉取镜像时就需要先 docker login登入到我们的自建的代理镜像仓库,然后才可以拉取镜像
!!注意:执行htpasswd命令时,请把username和password修改为你自己的账号和密码
- 添加docker-compose.yml文件
- 如果你要开启Proxy认证的话请把 #- ./htpasswd:/auth/htpasswd 注释取消掉
下载项目
git clone https://github.com/dqzboy/Docker-Proxy.git
- 启动
docker compose up -d
-
nginx反向代理
● 进入 clone 项目的 nginx 目录,修改文件registry-proxy.conf中域名的信息
● 若没有域名申请一个,或者使用 CF 代理 HTTPS
● 启动 Nginx -
通过 UI.YOU_DOMAIN 访问
4. 自动化脚本配置
#!/bin/bash
# 检查环境类型
if command -v k3s &>/dev/null || systemctl status k3s &>/dev/null; then
ENV="k3s"
CERTS_DIR="/var/lib/rancher/k3s/agent/etc/containerd/certs.d"
elif command -v kubelet &>/dev/null; then
ENV="k8s"
CERTS_DIR="/etc/containerd/certs.d"
else
echo "❌ 无法识别 Kubernetes 环境(既不是 k3s,也不是标准 kubelet)"
exit 1
fi
echo "✅ 检测到环境类型:$ENV"
echo "📝 镜像代理配置目录:$CERTS_DIR"
# 镜像代理主机 IP
MIRROR_IP="192.168.17.222"
# registry => 端口映射
declare -A REGISTRY_PORTS=(
[docker.io]=51000
[ghcr.io]=52000
[gcr.io]=53000
[k8s.gcr.io]=54000
[registry.k8s.io]=55000
[quay.io]=56000
[mcr.microsoft.com]=57000
[docker.elastic.co]=58000
[nvcr.io]=59000
)
# 是否强制覆盖(可选参数)
FORCE=false
if [[ "$1" == "--force" ]]; then
FORCE=true
echo "⚠️ 启用强制覆盖模式"
fi
# 遍历并生成 hosts.toml
for REGISTRY in "${!REGISTRY_PORTS[@]}"; do
PORT=${REGISTRY_PORTS[$REGISTRY]}
MIRROR_URL="http://${MIRROR_IP}:${PORT}"
DIR="${CERTS_DIR}/${REGISTRY}"
FILE="${DIR}/hosts.toml"
sudo mkdir -p "$DIR"
CONTENT=$(cat <<EOF
server = "https://${REGISTRY}"
[host."${MIRROR_URL}"]
capabilities = ["pull", "resolve"]
EOF
)
if [[ -f "$FILE" && "$FORCE" == false ]]; then
CURRENT=$(sudo cat "$FILE")
if [[ "$CURRENT" == "$CONTENT" ]]; then
echo "✅ 已存在且相同: $FILE,跳过"
continue
else
echo "⚠️ 文件已存在但内容不同: $FILE,使用 --force 参数可覆盖"
continue
fi
fi
echo "$CONTENT" | sudo tee "$FILE" > /dev/null
echo "✅ 写入完成: $FILE"
done
# 提示用户是否需要重启服务
if [[ "$ENV" == "k3s" ]]; then
echo "✅ 配置完成。请重启 K3s:sudo systemctl restart k3s"
else
echo "✅ 配置完成。请重启 containerd:sudo systemctl restart containerd"
fi
评论区