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=truewsl --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!

相关推荐
Java之美3 小时前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
阿里云云原生1 天前
告别冗长链路!Kafka × Table Bucket 实现开放表格式零 ETL 实时入湖
云原生·kafka
SelectDB2 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
秋播4 天前
国内本地WSL2编译rancher源码
云原生
小猿姐6 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
阿里云云原生7 天前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
java_cj7 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
互联网推荐官7 天前
上海软件定制开发公司推荐:从PaaS工程化路径看D-coding的技术取舍
云原生·云计算·paas·软件开发·开发经验·上海
sbjdhjd7 天前
从零搭建企业级 CI/CD(下):Jenkins+GitLab+Harbor 全链路实战指南
git·servlet·ci/cd·云原生·云计算·gitlab·jenkins