nerdctl推送rancher本地镜像到harbor

环境准备

因为外网拉取镜像你懂的,非常慢,所以考虑将常用rancher镜像放到本地镜像库

1 安装nerdctl

为什么要安装这个工具,原因在于:

  1. docker 看不到rancher所使用的k3s的镜像列表
  2. crictl 可以看到k3s镜像列表,但主要作为k8s的调试工具 无法export和push
  3. ctr 通过执行如下脚本
js 复制代码
ctr -n k8s.io --address /run/k3s/containerd/containerd.sock images list

可以查看镜像,也可以push,但export image tar时候经常报content digest ... not found错误

  1. 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!

相关推荐
阿里云云原生5 小时前
Personal Agent 观察:拆解全天候运行的技术挑战
云原生·agent
SelectDB技术团队6 小时前
Snowflake 的开源替代怎么选:能力对照、三条部署路径与迁移执行
大数据·数据库·云原生·开源·snowflake·apache doris
时间售卖铺6 小时前
Nginx 反向代理
运维·nginx·云原生
Regentsoft丽晶软件6 小时前
服装B2B分销返利规则引擎:多返利池与历史订单区分的技术设计
云原生·产品运营·需求分析
阿里云云原生7 小时前
非算法工程师也能看懂,推理框架的来龙去脉
云原生
ん贤12 小时前
温习微服务基础知识
微服务·云原生·架构
孔令飞13 小时前
OneX Harness AI Coding 工具介绍
云原生·go·ai编程
flytalei13 小时前
GitOps 实战:基于 Argo CD 的 Kubernetes 应用版本回滚
云原生·容器·kubernetes
Z21-X13 小时前
云原生运维学习笔记:从云计算概念到服务器硬件的入门之旅
运维·笔记·学习·云原生
KIDULT°14 小时前
【K8s 实战】Volume 存储、PV/PVC、ConfigMap 与 Secret 完整实验
云原生·容器·kubernetes