news 2026/9/15 8:18:46

containerd 1.7.16 + nerdctl 1.7.6 + Jenkins

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
containerd 1.7.16 + nerdctl 1.7.6 + Jenkins

环境说明

  • 宿主机系统:CentOS7,已部署 K8s,containerd 版本:1.7.16
  • nerdctl 选用v1.7.6(兼容 containerd 1.7.16,不要用 1.8+)
  • 目标流水线:Git 拉代码 → Maven 打包 → nerdctl 构建镜像 → 推送镜像 → K8s 部署
  • 身份:root 执行

一、安装 nerdctl 1.7.6(适配 containerd 1.7.16)

重点:CentOS7 yum 源无 nerdctl,采用二进制 full 包(自带 buildkit,nerdctl build 必须)

# 1. 下载 nerdctl-full 1.7.6 完整包 wget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-full-1.7.6-linux-amd64.tar.gz # 2. 解压到 /usr/local (覆盖nerdctl、buildctl等二进制文件) tar Cxzvf /usr/local nerdctl-full-1.7.6-linux-amd64.tar.gz # 3. 验证版本 nerdctl version

正常输出会显示:nerdctl version 1.7.6

4. 配置 BuildKit(nerdctl build 构建镜像依赖,K8s containerd 本身不带 buildkit)

# 获取buildkit systemd服务文件 wget https://raw.githubusercontent.com/moby/buildkit/master/examples/systemd/system/buildkit.service mv buildkit.service /etc/systemd/system/ # 因为默认的buildkit.service文件中需要.socket文件,所以执行一下脚本去掉源文件中的socket即可 cat > /etc/systemd/system/buildkit.service <<'EOF' [Unit] Description=BuildKit Documentation=https://github.com/moby/buildkit [Service] ExecStart=/usr/local/bin/buildkitd Restart=always [Install] WantedBy=multi-user.target EOF # 重载systemd,开机自启并启动buildkit systemctl daemon-reload systemctl enable --now buildkit # 检查buildkit状态 systemctl status buildkit

5. 测试 nerdctl 是否可用

nerdctl pull hello-world nerdctl run --rm hello-world

✅ 能正常输出 hello 信息即 nerdctl 安装成功。

坑点提醒

  1. containerd 1.7.16,最高搭配 nerdctl 1.7.x,不能用 1.8 及以上,会出现 API 不兼容
  2. 必须用nerdctl-full包,普通 nerdctl 精简包不带 buildkit,无法执行nerdctl build

二、nerdctl 部署 Jenkins 容器

1. 创建 Jenkins 持久化目录,设置权限(高频坑:容器内 jenkins uid=1000)

# 持久化目录,配置属主1000 mkdir -p /opt/jenkins/home chown 1000:1000 /opt/jenkins/home # 防火墙放行端口(firewalld开启才执行) firewall-cmd --add-port=7070/tcp --permanent firewall-cmd --add-port=50000/tcp --permanent firewall-cmd --reload

2. 拉取新版 Jenkins 镜像

nerdctl pull jenkins/jenkins:2.504.3-lts # 查看镜像列表 nerdctl images

3. 启动 Jenkins 容器

nerdctl run -d \ --name jenkins \ -p 7070:8080 \ -p 50000:50000 \ -v /opt/jenkins-home:/var/jenkins_home \ -v /var/run/containerd/containerd.sock:/var/run/docker.sock \ --restart=always \ jenkins/jenkins:2.504.3-lts

参数说明

  • -v /var/run/containerd/containerd.sock:容器内 jenkins 可以调用宿主机 nerdctl 构建镜像
  • --restart=always:宿主机开机自动拉起 jenkins
  • 不再添加runSetupWizard=false,第一次初始化走正常向导;后续升级重建容器时原有配置保留在 /opt/jenkins-home
  • 如果8080端口号有冲突,记得修改一下映射,例如改成7070则替换一下:-p 7070:8080
# 查看容器运行状态 nerdctl ps # 启动失败时查看日志 nerdctl logs jenkins

4. 获取初始管理员密码,网页解锁 Jenkins

nerdctl exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

浏览器访问:http://宿主机IP:8080,粘贴密码解锁。

三、Jenkins 初始化向导(插件选择,按你之前踩坑优化)

  1. 解锁页面 → 选择【选择插件来安装】,❌不要选择推荐插件(国外源极易超时)
  2. 取消全部勾选,只勾选下面 8 个插件

    表格

    插件名称作用
    Git拉取 Git 源码
    Git Parameter构建时手动选择分支 / Tag,调试方便
    Pipeline流水线核心插件
    Pipeline Graph View流水线图形可视化,直观看 stage 成功失败
    SSH Agent流水线脚本内部使用 ssh 私钥登录服务器
    SSH Build Agents添加远程 SSH 构建节点 node01/node03【核心】
    Credentials Binding管理密钥、账号凭证
    Workspace Cleanup每次构建前清理工作目录

⚠️ Maven 相关插件在初始化向导页面搜不到,初始化完成后后台再安装。

  1. 点击安装插件,等待下载。

提示部分插件安装失败不用处理,直接继续,进后台切换清华源补装缺失插件。

  1. 创建管理员账号,保存用户名 + 密码

四、Web 初始化 & 安全配置

  1. 打开页面,填入日志输出的初始 admin 密码,完成初始化
  2. Manage Jenkins → Security
    • Security Realm:Jenkins’ own user database
    • Authorization:Logged-in users can do anything
    • Save
  3. Manage Users,创建 admin 账号,设置登录密码
  4. 退出重新登录验证账号密码

五、凭证配置& 远程 SSH Agent 节点

Manage Jenkins → Credentials → System → Global credentials 添加 2 类凭证:

  1. Manage JenkinsCredentialsSystemGlobal credentials新增凭证:Git 仓库账号密码 / 服务器 SSH 私钥
  2. Manage JenkinsManage Nodes and CloudsNew Node新建 SSH 代理节点,填入 node 服务器 IP、SSH 凭证、远程工作目录(依赖 SSH Build Agents 插件)
  3. 镜像仓库凭证(可选):仓库账号密码,用于 nerdctl push 镜像

六、全局工具配置

Manage JenkinsGlobal Tool Configuration

  1. JDK:新增 JDK,自动安装或填写宿主机 JDK 路径
  2. Maven:新增 Maven,自动安装版本,配置阿里云镜像 settings.xml

七、配置凭证 & 远程 SSH Agent 节点

New Item → 输入项目名称 → Pipeline

Pipeline Definition 选择Pipeline script,粘贴上面 Jenkinsfile; 或者选择Pipeline script from SCM,从 git 仓库读取 Jenkinsfile(推荐正式项目)。

八、流水线 Jenkinsfile 模板(适配 nerdctl+containerd)

pipeline { agent any environment { // 镜像名称,使用构建号作为版本标签 IMAGE_NAME = "health-app:${env.BUILD_NUMBER}" // 镜像仓库地址,按需修改 REGISTRY = "harbor.yourdomain.com/health" } stages { stage('拉取代码') { steps { git url: 'https://gitxxx/your-project.git', credentialsId: 'git-cred' } } stage('Maven打包') { steps { sh 'mvn clean package -DskipTests' } } stage('nerdctl 构建镜像') { steps { sh ''' nerdctl build -t ${IMAGE_NAME} . ''' } } stage('推送镜像【可选,不需要可注释】') { steps { sh ''' nerdctl tag ${IMAGE_NAME} ${REGISTRY}/${IMAGE_NAME} nerdctl push ${REGISTRY}/${IMAGE_NAME} ''' } } } post { always { cleanWs() // Workspace Cleanup插件,每次构建完清理工作目录 } success { echo "构建成功:镜像 ${IMAGE_NAME}" } failure { echo "构建失败!" } } }

九、常用运维命令

# nerdctl nerdctl version nerdctl images nerdctl ps nerdctl ps -a nerdctl pull nerdctl build -t xxx . # jenkins容器管理 nerdctl logs -f jenkins nerdctl restart jenkins nerdctl stop jenkins nerdctl rm jenkins # 重装Jenkins(保留/opt/jenkins/home数据,配置不丢) nerdctl stop jenkins nerdctl rm jenkins nerdctl rmi docker.m.daocloud.io/jenkins/jenkins:2.462.1-lts-jdk17 # buildkit服务 systemctl status buildkit systemctl restart buildkit

十、踩坑清单(适配你当前 containerd1.6.33 + nerdctl1.7.6)

  1. containerd 1.6.33,nerdctl 最高只能用 1.7.x,不要升级 1.8+,API 不兼容
  2. nerdctl build报错:buildkit 未启动,执行systemctl enable --now buildkit
  3. Jenkins 调用 nerdctl 失败:启动命令必须挂载/var/run/containerd/containerd.sock
  4. Jenkins 权限报错:/opt/jenkins/home目录必须chown 1000:1000
  5. 初始化页面找不到 Maven 插件:初始化向导插件子集不全,后台插件管理器安装
  6. SSH 两个插件区分:
    • SSH Agent:流水线 shell 内部使用 ssh 密钥
    • SSH Build Agents:添加远程构建节点
  7. 插件下载超时:初始化不勾选大量推荐插件,装好立刻切换清华更新源
  8. nerdctl: command not found
  9. 容器内没有 nerdctl,两种方案: 方案 A(推荐):Jenkinsfile 里用宿主机全路径/usr/local/bin/nerdctl

    sh '/usr/local/bin/nerdctl build -t xxx .'

    方案 B:把宿主机 nerdctl 二进制挂载进容器(不推荐,版本耦合)

  10. 权限报错:permission denied /var/run/containerd.sock
  11. 将 jenkins 容器内用户加入宿主机 containerd 用户组,或者宿主机临时调整 sock 权限(内网环境)

  12. Maven 打包下载依赖慢:在 maven settings.xml 配置阿里云镜像,放到 jenkins-home maven 目录
  13. 重点补充:容器内部默认没有 nerdctl 二进制!上面 Jenkinsfile 如果直接写nerdctl会提示命令找不到,要改成宿主机绝对路径 `/...

Jenkins 2.504.3 配置清华源(2 种方法,优先界面操作,nerdctl 容器环境)

✅ 2.504.3 专用地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/dynamic-stable-2.504/update-center.json这个是版本绑定动态源,不要用旧的通用 update-center.json,会报版本不匹配。

方法一:Web 界面配置(最简单,推荐)

  1. 登录 Jenkins 后台,进入:Manage JenkinsPluginsAdvanced settings
  2. 页面拉到底,找到Update Sites(升级站点)
  3. 把原来默认官方地址删掉,粘贴上面 2.504 专用清华链接
  4. Submit(提交)保存
  5. 【关键】重启 Jenkins 容器生效
#nerdctl重启命令 nerdctl restart jenkins
  1. 重启完成后,回到插件页面,等待拉取插件清单。

注意:新版 Jenkins 界面没有 Check now 按钮,保存 + 重启后自动拉取更新清单。

方法二:命令行修改配置文件(界面修改报错时用,nerdctl 容器)

  1. 进入 jenkins 容器
nerdctl exec -it jenkins bash
  1. 进入 jenkins 家目录,修改hudson.model.UpdateCenter.xml
cd /var/jenkins_home cat > hudson.model.UpdateCenter.xml <<'EOF' <?xml version='1.1' encoding='UTF-8'?> <sites> <site> <id>default</id> <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/dynamic-stable-2.504/update-center.json</url> </site> </sites> EOF
  1. 退出容器,宿主机重启 jenkins
nerdctl restart jenkins

可选增强:改写插件下载地址(解决部分插件 hpi 包依然走国外 CDN)

容器内执行,替换 default.json 里的插件下载域名,全部走清华镜像:

#进入容器 nerdctl exec -it jenkins bash cd /var/jenkins_home/updates #备份 cp default.json default.json.bak #替换下载地址 sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json

这个步骤可选,能进一步提高插件下载成功率,解决你截图里那种部分插件超时失败问题。

排查 & 避坑重点(针对 2.504.3)

  1. ❌ 不要使用旧通用地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json2.504 版本会版本校验失败
  2. 修改完必须重启容器,只点提交不重启不生效
  3. 切换源后如果依然报错:删除 updates 缓存
#容器内执行 rm -rf /var/jenkins_home/updates/*

然后重启 jenkins 4. 网络校验:容器内先测试能不能访问这个 json

nerdctl exec jenkins curl -I https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/dynamic-stable-2.504/update-center.json

返回 200 就是正常。

安装插件建议

换完清华源后,分批勾选插件,不要一次性勾选几十个,优先装凭证、git、pipeline 核心插件,避免并发下载超时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 8:18:24

Java对象与封装深度解析:从JVM内存到工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 8:15:11

Spring事务管理从原理到实战:@Transactional失效场景与排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 8:14:19

工业路由器双SIM与看门狗如何协同?掉线恢复机制详解

摘要&#xff1a; 工业路由器高可用设计不能简单理解为“双SIM自动重启”。真正有效的掉线恢复&#xff0c;需要把链路健康检测、SIM切换、系统级看门狗、业务重连和恢复阈值放在同一套故障模型中设计。导语&#xff1a; 工业路由器在实验室测试时可能长期正常&#xff0c;但进…

作者头像 李华
网站建设 2026/9/15 8:13:04

Codex 智能体实操课:让 AI 帮设计师承担重复执行工作

『梦想零负重 ◆ 创业新起点』&#x1f4ac;大家好&#xff0c;欢迎来到【轻创点子】◆ 今日主题设计师真正稀缺的&#xff0c;从来不是 “多做几张图”&#xff0c;而是灵感判断、风格决策、构图把控和作品沉淀的时间。如果能把反复执行的机械工作交给 AI&#xff0c;把注意力…

作者头像 李华
网站建设 2026/9/15 8:12:15

服装AI质检,最先应该替代哪一段人工?

1. 背景 服装工厂引入 AI 质检&#xff0c;很多管理者第一反应是「能不能一步到位&#xff0c;把人工全部换掉」。但实际落地经验告诉我们&#xff1a;一上来就想完全替代人工&#xff0c;反而容易翻车。更稳妥的思路&#xff0c;是优先替换那些高重复、高强度、容易疲劳&#…

作者头像 李华