使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像

news2025/4/11 13:25:19

在 Kubernetes 1.24及以上版本环境中,docker不再被支持,主要使用Containerd 是常用的容器运行。默认情况下,Containerd 使用 HTTPS 协议与镜像仓库通信。然而,在某些场景下(如测试环境或内部网络),我们可能需要通过 HTTP 协议访问私有镜像仓库。本文将详细介绍如何安装Harbor及配置 Containerd 以支持 HTTP 协议,并拉取 Harbor 私有镜像仓库中的镜像。

我之前有文章写了如何在线安装docker和下载harbor安装包使用https部署,参考:Docker-compose部署Harbor实操(含故障处理),本文中,全部采用离线包方式,并使用的是http协议。

本文中的系统软件信息:
1.Docker version 24.0.5, build ced0996
2.Docker Compose version v2.24.7
3.Centos7.9
4.Harbor v2.9.1-5cbb1b01
5.Containerd-1.7.14
6.Crictl version v1.26.0

前置准备:
1.准备一个网络路径挂载点,将需要准备的离线安装包放入其内,在部署的时候可以直接调用。
2.本文中共有1个离线包及1个测试镜像需要提前下载好,可以自行替换软件版本和镜像

离线包内容(本文中不提供离线包的下载,包中的配置文件会在文中写出来,其他的可以自行网上搜索下载或版本替换):
注:dashboard.tar是镜像包可替换,containerd.service,docker.service,config.toml是配置文件可照抄按需修改,其他的均为程序包,需要网上下载好
在这里插入图片描述

Harbor服务端(192.168.1.2)

安装docker,docker-compose,harbor
注:网络路径为192.168.1.1:/volume1/Share/,挂载到本机的/share目录,离线包所有内容均在此目录

# 创建 /share 目录,用于挂载 NFS 共享
mkdir /share

# 安装 NFS 客户端工具
yum -y install nfs-utils

# 挂载 NFS 共享到 /share 目录
mount -t nfs 192.168.1.1:/volume1/Share/ /share

# 将 NFS 挂载配置添加到 /etc/fstab,确保系统重启后自动挂载
echo "192.168.1.1:/volume1/Share /share nfs defaults 0 0" | sudo tee -a /etc/fstab

# 停止并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 临时关闭 SELinux
setenforce 0

# 永久禁用 SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config

# 创建 /docker 目录,用于存放 Docker 安装文件
mkdir -p /docker

# 从 NFS 共享中复制 Docker 安装包到 /docker 目录
cp /share/docker-24.0.5.tgz /docker

# 解压 Docker 安装包
tar xvf /docker/docker-24.0.5.tgz -C /docker

# 将解压后的 Docker 二进制文件复制到 /usr/bin 目录
cp /docker/docker/* /usr/bin/

# 从 NFS 共享中复制 Docker 服务文件到系统服务目录
cp /share/docker.service /etc/systemd/system/
# 查看Docker 服务文件
cat /etc/systemd/system/docker.service

内容如下:

[Unit]
# 描述服务的名称和用途
Description=Docker Application Container Engine

# 提供 Docker 官方文档的链接
Documentation=https://docs.docker.com

# 指定服务启动的依赖条件:
# - network-online.target:确保网络已启动
# - firewalld.service:确保防火墙服务已启动
After=network-online.target firewalld.service

# 指定服务启动的依赖关系:
# - network-online.target:确保网络已启动
Wants=network-online.target

[Service]
# 指定服务类型为 "notify",表示服务启动后会通知 systemd
Type=notify

# Docker 守护进程的启动命令:
# - /usr/bin/dockerd:Docker 守护进程的路径
# - -H unix:///var/run/docker.sock:指定 Docker 监听的 Unix 套接字路径
# - --selinux-enabled=false:禁用 SELinux 支持
# - --default-ulimit nofile=65536:65536:设置默认的文件描述符限制
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock --selinux-enabled=false --default-ulimit nofile=65536:65536

# 重新加载服务的命令:发送 HUP 信号给主进程
ExecReload=/bin/kill -s HUP $MAINPID

# 设置资源限制:
# - LimitNOFILE=infinity:文件描述符数量无限制
# - LimitNPROC=infinity:进程数量无限制
# - LimitCORE=infinity:核心文件大小无限制
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# 如果系统支持 TasksMax,可以取消注释以设置任务数量无限制
# 仅 systemd 226 及以上版本支持此功能
#TasksMax=infinity

# 设置服务启动的超时时间为 0,表示无超时限制
TimeoutStartSec=0

# 启用 cgroup 委托,避免 systemd 重置 Docker 容器的 cgroup
Delegate=yes

# 设置杀死模式为 "process",表示仅杀死 Docker 进程,而不是整个 cgroup 中的所有进程
KillMode=process

# 设置服务在失败时自动重启
Restart=on-failure

# 设置服务启动失败的限制:
# - StartLimitBurst=3:允许在 60 秒内最多重启 3 次
# - StartLimitInterval=60s:重启时间窗口为 60 秒
StartLimitBurst=3
StartLimitInterval=60s

[Install]
# 指定服务安装的目标,表示服务将被添加到多用户模式中
WantedBy=multi-user.target

# 赋予 Docker 服务文件可执行权限
chmod +x /etc/systemd/system/docker.service

# 从 NFS 共享中复制 Docker Compose 文件到 /usr/local/bin 目录
cp /share/docker-compose /usr/local/bin/

# 赋予 Docker Compose 文件可执行权限
chmod +x /usr/local/bin/docker-compose

# 重新加载 systemd 配置
systemctl daemon-reload

# 启动 Docker 服务
systemctl restart docker

# 查看 Docker 服务状态
systemctl status docker

# 验证 Docker Compose 版本
docker-compose -v

# 验证 Docker 版本
docker --version

# 创建 /harbor 目录,用于存放 Harbor 安装文件
mkdir -p /harbor

# 从 NFS 共享中复制 Harbor 离线安装包到 /harbor 目录
cp /share/k8s/harbor/harbor-offline-installer-v2.9.1.tgz /harbor

# 解压 Harbor 离线安装包
tar -zxvf /harbor/harbor-offline-installer-v2.9.1.tgz -C /harbor

# 进入 Harbor 安装目录
cd /harbor/harbor

# 复制 Harbor 配置文件模板并重命名为 harbor.yml
cp harbor.yml.tmpl harbor.yml
# 编辑harbor配置文件
vi /harbor/harbor/harbor.yml

修改hostname为本机IP,注释掉所有https字段(红框内),图片最下方为默认密码,有需要可以修改,其他可以不动
在这里插入图片描述

# 进入 Harbor 安装目录
cd /harbor/harbor

# 运行 prepare 脚本
# 该脚本会根据 harbor.yml 文件生成 Harbor 运行所需的配置文件和目录结构
./prepare

# 运行 install.sh 脚本
# 该脚本会安装并启动 Harbor 服务,包括数据库、Redis、Nginx 和 Harbor 核心组件
./install.sh

# 查看运行状态
docker ps

都up了就没问题
在这里插入图片描述

Containerd客户端(192.168.1.3)

安装containerd,runc,crictl
注:网络路径为192.168.1.1:/volume1/Share/,挂载到本机的/share目录,离线包所有内容均在此目录

# 创建 /share 目录,用于挂载 NFS 共享
mkdir /share

# 安装 NFS 客户端工具
yum -y install nfs-utils

# 挂载 NFS 共享到 /share 目录
mount -t nfs 192.168.1.1:/volume1/Share/ /share

# 将 NFS 挂载配置添加到 /etc/fstab,确保系统重启后自动挂载
echo "192.168.1.1:/volume1/Share /share nfs defaults 0 0" | sudo tee -a /etc/fstab

# 停止并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 临时关闭 SELinux
setenforce 0

# 永久禁用 SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config

# 安装 runc
cp  /share/runc.amd64 /tmp/
install -m 755 /tmp/runc.amd64 /usr/local/sbin/runc
rm -f /tmp/runc.amd64
cp -p /usr/local/sbin/runc  /usr/local/bin/runc
cp -p /usr/local/sbin/runc  /usr/bin/runc

# 拷贝共享目录中containerd相关安装配置文件
cp  /share/containerd-1.7.14-linux-amd64.tar.gz /tmp/

# 安装 containerd
tar Cxzvf /usr/local /tmp/containerd-1.7.14-linux-amd64.tar.gz
rm -f /tmp/containerd-1.7.14-linux-amd64.tar.gz

# 配置开机启动 containerd.service
cp  /tmp/containerd.service /etc/systemd/system/containerd.service
rm -f /tmp/containerd.service
systemctl daemon-reload
systemctl enable containerd

# 查看containerd.service服务文件
cat /etc/systemd/system/containerd.service

内容如下:

[Unit]
# 描述服务的名称和用途
Description=containerd container runtime

# 提供 containerd 官方文档的链接
Documentation=https://containerd.io

# 定义服务的启动顺序依赖
# 确保在网络、本地文件系统和 D-Bus 服务启动后再启动 containerd
After=network.target local-fs.target dbus.service

[Service]
# 在启动 containerd 之前加载 overlay 内核模块
# 如果模块加载失败,忽略错误继续执行
ExecStartPre=-/sbin/modprobe overlay

# 启动 containerd 服务
ExecStart=/usr/local/bin/containerd

# 定义服务类型为 notify,表示服务启动完成后会通知 systemd
Type=notify

# 允许 containerd 管理其子进程的 cgroup
Delegate=yes

# 定义杀死进程的模式为仅杀死 containerd 进程,而不是整个 cgroup
KillMode=process

# 定义服务在失败时自动重启
Restart=always

# 定义服务重启的间隔时间为 5 秒
RestartSec=5

# 设置进程数和核心文件大小的限制为无限制
# 建议使用 cgroups 进行容器本地资源管理
LimitNPROC=infinity
LimitCORE=infinity

# 设置任务最大数量为无限制
# 仅 systemd 226 及以上版本支持此选项
TasksMax=infinity

# 调整 OOM(Out of Memory)分数,降低 containerd 被 OOM Killer 杀死的概率
OOMScoreAdjust=-999

[Install]
# 定义服务在 multi-user.target 启动时自动启动
WantedBy=multi-user.target
关键点说明:
[Unit] 部分:

Description:描述服务的名称和用途。
Documentation:提供官方文档链接。
After:定义服务的启动顺序依赖,确保网络、本地文件系统和 D-Bus 服务启动后再启动 containerd。
[Service] 部分:

ExecStartPre:在启动 containerd 之前加载 overlay 内核模块,如果模块加载失败,忽略错误继续执行。
ExecStart:启动 containerd 服务。
Type=notify:定义服务类型为 notify,表示服务启动完成后会通知 systemd。
Delegate=yes:允许 containerd 管理其子进程的 cgroup。
KillMode=process:定义杀死进程的模式为仅杀死 containerd 进程,而不是整个 cgroup。
Restart=always:定义服务在失败时自动重启。
RestartSec=5:定义服务重启的间隔时间为 5 秒
DeepSeek-V3
DeepSeek-V3
# 生成 containerd 默认配置文件
mkdir -p /etc/containerd/
containerd config default > /etc/containerd/config.toml

# 备份默认配置文件
mv /etc/containerd/config.toml /etc/containerd/config.toml.bk

# 拷贝并查看containerd 配置文件
cp /share/config.toml  /etc/containerd/
cat /etc/containerd/config.toml

内容如下:

# 配置 containerd 的 CRI(Container Runtime Interface)插件
[plugins."io.containerd.grpc.v1.cri".registry]

  # 配置镜像仓库的镜像(mirror)设置
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]

    # 为特定的镜像仓库地址(192.168.1.2)配置镜像
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.2"]
      # 指定镜像仓库的访问端点(endpoint),使用 HTTP 协议
      endpoint = ["http://192.168.1.2"]

  # 配置镜像仓库的认证信息
  [plugins."io.containerd.grpc.v1.cri".registry.configs]

    # 为特定的镜像仓库地址(192.168.1.2)配置认证信息
    [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.2".auth]
      # 配置访问镜像仓库的用户名
      username = "admin"
      # 配置访问镜像仓库的密码(默认密码,如果之前改了这里也要改)
      password = "Harbor12345"
# 配置使用crictl管理 containerd 镜像
cp /share/crictl-v1.26.0-linux-amd64.tar.gz /tmp
tar zxvf /tmp/crictl-v1.26.0-linux-amd64.tar.gz -C /usr/local/bin
rm -f /tmp/crictl-v1.26.0-linux-amd64.tar.gz
cat >/etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
EOF

# 重启 containerd
systemctl restart containerd
systemctl status containerd

在Containerd客户端(192.168.1.3)导入镜像

# 1. 导入镜像文件 dashboard.tar
# 将本地的镜像文件导入到 containerd 中
ctr image import /share/dashboard.tar

# 2. 列出所有镜像
# 查看当前 containerd 中已存在的镜像,确认导入是否成功
ctr image ls

# 3. 重新打标签
# 将导入的镜像 docker.io/kubernetesui/dashboard:v2.7.0 重新打标签为 192.168.1.2/library/dashboard:v2.7.0
# 这一步是为了将镜像标记为私有仓库的地址,方便后续上传
ctr image tag docker.io/kubernetesui/dashboard:v2.7.0 192.168.1.2/library/dashboard:v2.7.0

# 4. 再次列出所有镜像
# 确认重新打标签是否成功,检查是否存在新的镜像标签
ctr image ls

在这里插入图片描述

在Containerd客户端(192.168.1.3)上传镜像

# 将镜像推送到私有 Harbor 仓库
# --plain-http: 使用 HTTP 协议而不是 HTTPS(适用于未启用 HTTPS 的仓库)
# --user admin:Harbor12345: 指定 Harbor 仓库的用户名和密码(用于身份验证)
# 192.168.1.2/library/dashboard:v2.7.0: 目标镜像的完整地址,格式为 <仓库地址>/<项目>/<镜像名>:<标签>
ctr image push --plain-http --user admin:Harbor12345 192.168.1.2/library/dashboard:v2.7.0

在这里插入图片描述

在Containerd客户端(192.168.1.3)下载镜像

# 从私有 Harbor 仓库拉取镜像
# --plain-http: 使用 HTTP 协议而不是 HTTPS(适用于未启用 HTTPS 的仓库)
# 192.168.1.2/library/dashboard:v2.7.0: 目标镜像的完整地址,格式为 <仓库地址>/<项目>/<镜像名>:<标签>
ctr image pull --plain-http 192.168.1.2/library/dashboard:v2.7.0

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dify在Ubuntu20.04系统的部署

文章目录 一、dify 介绍1.核心功能优势2.应用场景 二、dify 安装(docker方式)1.代码库下载2.配置文件修改3.启动docker 容器 三、遇到问题与解决1.使用sudo docker compose up -d报错2.使用service docker start报错 一、dify 介绍 Dify 是一款开源的大语言模型&#xff08;LL…

达梦:内存相关参数

目录 28个相关参数1. 内存池相关MEMORY_POOLMEMORY_N_POOLSMEMORY_BAK_POOL 2. 大缓冲区相关HUGE_BUFFERHUGE_BUFFER_POOLS 3. 共享缓冲区相关BUFFERBUFFER_POOLSBUFFER_MODEMAX_BUFFER 4. 快速池相关FAST_POOL_PAGES 5. 回收池相关RECYCLE_POOLS 6. 回滚段池相关ROLLSEG_POOLS…

计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

《Qt动画编程实战:轻松实现头像旋转效果》

《Qt动画编程实战&#xff1a;轻松实现头像旋转效果》 Qt 提供了丰富的动画框架&#xff0c;可以轻松实现各种平滑的动画效果。其中&#xff0c;旋转动画是一种常见的 UI 交互方式&#xff0c;广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…

SpringBoot3—快速入门

一、简介 &#xff08;1&#xff09;前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA &#xff08;2&#xff09;环境要求 &#xff08;3&#xff09;SpringBoot3是什么 核心概念&#xff1a;Spring Boot 底层是 Spring&#xff0c;能简单、快速地创建一个独立的、生…

Python基于机器学习的微博舆情情感分析系统,微博评论情感分析可视化系统(全新升级)

大家好&#xff0c;今天为大家带来的是Python基于机器学习的微博舆情情感分析系统&#xff0c;微博评论情感分析可视化系统&#xff0c;这个系统在原本的系统上进行优化升级。 算法从开源框架的 snlow &#xff0c;到支持机器学习的 lstm 算法可以手动输入语句&#xff0c;进行…

Matlab地图绘制教程第2期—水陆填充图

上一期分享了海岸线图的绘制方法&#xff1a; 本着由浅入深的理念&#xff0c;本期再来分享一下水陆填充图的绘制方法。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab地图绘制教程系列&#xff0c;旨在降低大家使用Matlab进行地图类科研绘图的门槛&#xff0c;…

云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书

云创智城YunCharge 新能源充电行业系统说明书 ⚡官方文档 ⚡官网地址 1. 引言 随着全球环境保护和能源危机的加剧&#xff0c;新能源汽车行业得到了快速发展&#xff0c;充电基础设施建设也随之蓬勃发展。新能源充电行业系统旨在提供高效、便捷的充电服务&#xff0c;满足电…

(八)Java-Collection

一、Collection接口 1.特点 Collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object&#xff1b; 有些Collection的实现类&#xff0c;可以存放重复的元素&#xff0c;有些不可以&#xff1b; 有些Collection的实现类&#xff0c;有些是有序的&#xff08;Li…

小程序高度问题背景scss

不同的机型&#xff0c;他的比例啥的都会不一样&#xff0c;同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…

Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)

漏洞简介&#xff1a; Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境&#xff1a; 春秋云镜中的漏洞靶标&#xff0c;CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…

基于Spark的电商供应链系统的设计与实现

目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 &#xff08;一&#xff09;分布式计算系统Spark &#xff08;二&#xff09;数据仓库Hive &#xff08;三&#xff09;读取服务器本地磁盘的日志数据Flume &#xff08;四&#xff09;分布式消息队列Kafka …

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(二)

1.安装mogondb数据库 参考MongoDB安装配置教程&#xff08;详细版&#xff09;_mongodb安装详细步骤-CSDN博客 安装mondbcompass数据库连接工具 参考https://www.mongodb.com/zh-cn/docs/compass/current/connect/ 2.后端服务 1.创建src文件夹 并在src文件夹下创建 index…

server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)

从你提供的配置文件&#xff08;应该是 Spring Boot 的 application.yml 或 application.properties 文件&#xff09;来看&#xff0c;以下部分与会话超时时间相关&#xff1a; server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…

使用vscode导出Markdown的PDF无法显示数学公式的问题

我的硬件环境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件&#xff0c;数学公式都是显示的源代码。 我看了许多教程&#xff0c;给的是这个方法&#xff1a;在md文件对应的html文件中加上以下代码&#xff1a…

Idea编译项目很久之后,提示 Error:java:OutOfMemoryError:insufficient memory

项目挺老的的了&#xff0c;平常项目启动&#xff0c;也要挺久的&#xff0c;但是最起码能启动成功&#xff0c;今天下午的时候&#xff0c;项目启动了十几分&#xff0c;一直在转圈&#xff0c;后面控制台输出了这一行异常 Error:java:OutOfMemoryError:insufficient memory …

LSTM长短期记忆网络-原理分析

1 简介 概念 LSTM&#xff08;Long Short-Term Memory&#xff09;也称为长短期记忆网络&#xff0c;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;专门设计用于解决传统RNN的梯度消失问题和长程依赖问题。LSTM通过引入门机制和细胞状态&#xff0c;能够更…

IP------PPP协议

这只是IP的其中一块内容PPP&#xff0c;IP还有更多内容可以查看IP专栏&#xff0c;前一章内容为网络类型&#xff0c;可通过以下路径查看IP---网络类型-CSDN博客&#xff0c;欢迎指正 3.PPP协议 1.PPP优点 网络类型&#xff1a;p2p PPP---点到点协议 兼容性会更强凡是接口或…

基于 C++ Qt 的 Fluent Design 组件库 QFluentWidgets

简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库&#xff0c;内置超过 150 个开箱即用的 Fluent Designer 组件&#xff0c;支持亮暗主题无缝切换和自定义主题色。 编译示例 以 Qt5 为例&#xff08;Qt6 也支持&#xff09;&#xff0c;将 libQFluentWidgets.d…

ClkLog里程碑:荣获2024上海开源技术应用创新竞赛三等奖

2024年10月&#xff0c;ClkLog团队参加了由上海计算机软件技术开发中心、上海开源信息技术协会联合承办的2024上海数智融合“智慧工匠”选树、“领军先锋”评选活动——开源技术应用创新竞赛。我们不仅成功晋级决赛&#xff0c;还荣获了三等奖&#xff01;这一成就不仅是对ClkL…