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!

相关推荐
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
不吃香菜kkk、3 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 天前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21
春天花会开1314 天前
Supabase 自部署 Edge Functions 超时从 60s 延长到 360s 完整复盘
运维·云原生
ysu_03144 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
天天喝旺仔5 天前
分布式服务容错实战:用 Sentinel 实现限流、熔断与降级
分布式·微服务·云原生·sentinel
逐流人5 天前
Containerd容器管理实战:从架构原理到nerdctlcrictl工具链
linux·运维·云原生·容器·云计算·containerd
运维开发王义杰6 天前
跨项目直连数据库:是架构反模式,还是现实的工程妥协?
云原生