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

在 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记-TPAMI 2024】FreqFusion:用于密集图像预测的频率感知特征融合

Frequency-aware Feature Fusion for Dense Image Prediction 用于密集图像预测的频率感知特征融合 Abstract&#xff1a;密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点&#xff0c;现代分层模型通常利用特征融合&#xff0c;直接添加…

PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍

2025-02-22 20:10物联全栈123 尊敬的诸位&#xff01;我是一名物联网工程师。关注我&#xff0c;持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中&#xff0c;扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…

【deepseek】本地部署+webui访问

背景 最近deepseek很火&#xff0c;但是官网的老是被限流使用&#xff0c;还有就是自己也想着玩一玩&#xff0c;于是准备在自己电脑跑一个 直接附上结果地址mydeepseek 准备工作 windows和linux都可 我这里选择linux&#xff0c;ubuntu系统 安装ollama 看下图&#xff0…

【Vue工作原理】初始化启动文件加载流程

参考资料&#xff1a;配置参考 | Vue CLI vue-cli项目如果项目根目录下没有vue-config.js文件&#xff0c;默认入口文件entry&#xff0c;模板文件template&#xff0c;以及filename分别是什么?&#xff08;参考DeepSeek回答&#xff09; 根据Vue CLI文档&#xff0c;当没有配…

【构建工具】Gradle 8中Android BuildConfig的变化与开启方法

随着Gradle 8的发布&#xff0c;Android开发者需要注意一个重要变化&#xff1a;BuildConfig类的生成现在默认被关闭了&#xff01;&#xff01;&#xff01;。这个变化可能会影响许多依赖于BuildConfig的项目&#xff08;别问&#xff0c;问就是我也被影响了&#xff0c;多好用…

ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)

目录 引言使用SPI + DMA 方式实现思路分析1. 查看WS2812的datasheet手册2. 根据官方的led_strip组件的方式,自己手把手实现一遍3.完整的程序(实现霓虹灯效果)引言 参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路,只有明白实现的思路,方能将其…

每日Attention学习24——Strip Convolution Block

模块出处 [TIP 21] [link] CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery 模块名称 Strip Convolution Block (SCB) 模块作用 多方向条形特征提取 模块结构 模块特点 类PSP设计&#xff0c;采用四个并行分支提取不同维度的信息相比于…

ctfshow——版本控制泄露源码

题目提示&#xff1a;版本控制很重要&#xff0c;但不要部署到生产环境更重要。 题目内容如下图所示 本题结合题目和提示可以知道&#xff0c;我们要通过查看生产环境来查找flag。 所以我们可以在URL上进行操作&#xff0c;这时候就需要目录扫描来查看了。 发现存在一个.git的…

关于网络端口探测:TCP端口和UDP端口探测区别

网络端口探测是网络安全领域中的一项基础技术&#xff0c;它用于识别目标主机上开放的端口以及运行在这些端口上的服务。这项技术对于网络管理和安全评估至关重要。在网络端口探测中&#xff0c;最常用的两种协议是TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用…

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要&#xff1a;纯电动商用车的工作环境存在路况复杂、工况恶劣等情况&#xff0c;导致整车电气设备的磨损速率加快&#xff0c;造成电气设备绝缘电阻持续下降&#xff0c;如不及时处理&#xff0c;可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…

LeetCode详解之如何一步步优化到最佳解法:14. 最长公共前缀

LeetCode详解系列的总目录&#xff08;持续更新中&#xff09;&#xff1a;LeetCode详解之如何一步步优化到最佳解法&#xff1a;前100题目录&#xff08;更新中...&#xff09;-CSDN博客 LeetCode详解系列的上一题链接&#xff1a;LeetCode详解之如何一步步优化到最佳解法&am…

使用VS Code远程开发OpenAI API

由于OpenAI的API在国内不可用&#xff0c;我们要针对API进行开发困难比较大。 如果你有一个能使用OpenAI API的Linux服务器&#xff0c;我们可以方便地使用VS Code的远程开发功能来解决这个问题。 如果没有&#xff0c;你也可以试试获得一个免费的国外服务器&#xff0c;网上有…

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统&#xff0c;作者为蒲乐天&#xff0c;后端基于puyuetianPHP框架驱动&#xff0c;前端基于 puyuetianUI框架驱动&#xff0c;默认编辑器为puyuetianEditor富文本编辑器&#xff0c;其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

Java线程池入门03

1. 这3种创建线程池的方式有风险 FixedThreadPool : 固定大小的线程池SingleThreadExecutor : 单个线程的线程池CachedThreadPool : 可缓存的线程池 FixedThreadPool内部其实也是使用ThreadPoolExecutor来创建的 等价于 : new ThreadPoolExecutor(nThreads, nThreads, 0L, Tim…

C#连接sql server

连接时&#xff0c;出现如下提示&#xff1a; ERROR [IM014] [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中&#xff0c;驱动程序和应用程序之间的体系结构不匹配 原因是odbc的驱动和应用程序的架构不一致。我的odbc如下所示&#xff1a; 显示为64位&#xff0c;而c#程序显…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 为什么选择Elasticsearch&#xff1f;——典型应用场景深度解析1. 引言2. 日志分析&#xff1a;海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现&#xff1a; 2.…

SQLite 安装教程以及可视化工具介绍

目录 简述 1. Windows 系统安装 1.1 下载预编译的二进制文件 1.2 解压文件 1.3 配置环境变量 1.4 验证安装 2. GUI 可视化工具 2.1 免费工具 2.1.1 DB Browser for SQLite 2.1.2 SQLiteStudio 2.1.3 SQLite Expert 2.1.4 SQLiteGUI 2.1.5 Antares SQL 2.1.6 DbGa…

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…

IP------PPP协议

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

山东大学软件学院ai导论实验之生成对抗网络

目录 实验目的 实验代码 实验内容 实验结果 实验目的 基于Pytorch搭建一个生成对抗网络&#xff0c;使用MNIST数据集。 实验代码 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data…