环境准备
因为外网拉取镜像你懂的,非常慢,所以考虑将常用rancher镜像放到本地镜像库
1 安装nerdctl
为什么要安装这个工具,原因在于:
- docker 看不到rancher所使用的k3s的镜像列表
- crictl 可以看到k3s镜像列表,但主要作为k8s的调试工具 无法export和push
- ctr 通过执行如下脚本
js
ctr -n k8s.io --address /run/k3s/containerd/containerd.sock images list
可以查看镜像,也可以push,但export image tar时候经常报content digest ... not found错误
- nerdctl 既可以看到镜像也可以save和push
通过外网下载github.com/containerd/...
直接解压到/usr/local/bin目录
js
tar -zxvf nerdctl-full-2.0.37D-linux-amd64.tar.gz -C /usr/local/bin
#验证安装
nerdctl version
2 安装harbor
下面摘自元宝
前置条件
确认 WSL 开启 systemd(/etc/wsl.conf加 [boot] systemd=true,wsl --shutdown重启),然后安装 Docker 和 Compose:
sql
sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo systemctl start docker && sudo systemctl enable docker
docker --version && docker compose version
下载并解压 Harbor 离线包
以 v2.11.1 为例(可换最新版):
bash
cd /opt
sudo wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz
sudo tar -xzf harbor-offline-installer-v2.10.3.tgz
cd harbor
配置 harbor.yml
bash
sudo cp harbor.yml.tmpl harbor.yml
sudo nano harbor.yml
最小修改(HTTP 模式,适合本地测试):
yaml
hostname: reg.farvision.com # 或 WSL IP(如 172.28.x.x 供 Windows 访问)
http:
port: 8080 # 避免与宿主机 80 冲突
# ↓ 注释掉整个 https 段(若无证书)
# https:
# port: 443
# certificate: /your/cert.crt
# private_key: /your/cert.key
harbor_admin_password: Harbor12345
data_volume: /data/harbor
⚠️ WSL 中 hostname 不要用 localhost/127.0.0.1 同时开 HTTPS 注释掉,Windows 浏览器访问用 WSL IP + 端口。
导入镜像并安装
bash
# 先加载离线镜像(必须在 install.sh 之前)
sudo docker load -i harbor.v2.11.1.tar.gz
# 执行安装
sudo ./install.sh
出现 ✔ ----Harbor has been installed and started successfully.----即成功。
访问与 Docker 客户端配置
wsl和宿主机的hosts 文件中配置reg.farvision.com 的ip 然后浏览器访问reg.farvision.com:8080 即可。
默认账号:admin/ Harbor12345
让 Docker 信任 HTTP 私有仓库(WSL 和宿主机都要配):
ruby
// /etc/docker/daemon.json
{
"insecure-registries": ["reg.farvision.com:8080"]
}
sudo systemctl restart docker
docker登录测试:
docker login 127.0.0.1:8080 -u admin -p Harbor12345
nerdctl 登录测试
js
nerdctl login reg.farvision.com:8080 -u admin -p Harbor12345 --insecure-registry

使用nerdctl导出tar
把如下shell保存到rancher-image-save.sh
js
#!/bin/bash
set -e
# ====== 根据环境修改 ======
CONTAINERD_SOCK="/run/k3s/containerd/containerd.sock"
NAMESPACE="k8s.io"
PLATFORM="linux/amd64"
OUT_DIR="./rancher-images"
# K3s / RKE2 请取消注释对应行
# CONTAINERD_SOCK="/run/k3s/containerd/containerd.sock"
# CONTAINERD_SOCK="/run/rke2/containerd/containerd.sock"
mkdir -p "$OUT_DIR"
echo ">>> 查找 rancher 镜像..."
crictl images | awk '$1 ~ /rancher/ {print $1 ":" $2}' | sort -u > images.txt
if [ ! -s images.txt ]; then
echo "未找到 rancher 镜像,退出"
exit 1
fi
while read img; do
safe_name=$(echo "$img" | tr '/:@' '_')
echo ">>> 导出 $img -> ${OUT_DIR}/${safe_name}.tar"
nerdctl \
--address "$CONTAINERD_SOCK" \
-n "$NAMESPACE" \
save -o "${OUT_DIR}/${safe_name}.tar" \
"$img"
done < images.txt
echo "✅ 所有 rancher 镜像已导出到 $OUT_DIR"
然后运行shell即可
js
chmod +x ./rancher-image-save.sh
./rancher-image-save.sh
推送到harbor
推送到harbor不必先导出。
保存一下内容到shell文件rancher-image-push.sh,可以批处理操作
js
#!/bin/bash
set -e
# ====== 根据环境修改 ======
HARBOR="reg.farvision.com:8080"
PROJECT="rancher"
NAMESPACE="k8s.io"
CONTAINERD_SOCK="/run/k3s/containerd/containerd.sock"
PLATFORM="linux/amd64"
# K3s 节点用上面那个 socket
# 普通 containerd 改为:CONTAINERD_SOCK="/run/containerd/containerd.sock"
# Harbor 登录
nerdctl --address "$CONTAINERD_SOCK" \
login "$HARBOR" -u admin -p Harbor12345 --insecure-registry
echo ">>> 查找 rancher 镜像..."
nerdctl --address "$CONTAINERD_SOCK" -n "$NAMESPACE" images --filter "dangling=false" | awk '$1 ~ /rancher/ {print $1 ":" $2}' | sort -u > rancher-images.txt
if [ ! -s rancher-images.txt ]; then
echo "未找到 rancher 镜像,退出"
exit 1
fi
while read img; do
# 拼目标镜像:reg.farvision.com:8080/rancher/xxx:tag
img_name=$(echo "$img" | awk -F'/' '{print $NF}')
target="$HARBOR/$PROJECT/$img_name"
echo ">>> Tag: $img -> $target"
nerdctl --address "$CONTAINERD_SOCK" -n "$NAMESPACE" tag "$img" "$target"
echo ">>> Push: $target"
nerdctl --address "$CONTAINERD_SOCK" -n "$NAMESPACE" push "$target" --insecure-registry
done < rancher-images.txt
echo "✅ 所有 rancher 镜像已推送到 Harbor"
注意第19行过滤掉了name和tag都为none的镜像,然后运行shell即可
js
chmod +x ./rancher-image-push.sh
./rancher-image-push.sh
登录harbor,查看rancher项目,已上传成功 
enjoy!