containerd 1.6.33 + nerdctl 1.7.6 + Jenkins

环境说明

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

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

重点: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.6.33,最高搭配 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=8080/tcp --permanent
firewall-cmd --add-port=50000/tcp --permanent
firewall-cmd --reload

2. 拉取 Jenkins LTS 镜像(DaoCloud 国内加速,jdk17)

复制代码
nerdctl pull docker.m.daocloud.io/jenkins/jenkins:2.462.1-lts-jdk17
# 查看镜像列表
nerdctl images

3. 启动 Jenkins 容器

复制代码
nerdctl run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v /opt/jenkins/home:/var/jenkins_home \
-v /var/run/containerd/containerd.sock:/var/run/containerd/containerd.sock \
--restart=always \
docker.m.daocloud.io/jenkins/jenkins:2.462.1-lts-jdk17

参数说明

  • -v /var/run/containerd/containerd.sock:容器内 jenkins 可以调用宿主机 nerdctl 构建镜像

  • --restart=always:宿主机开机自动拉起 jenkins

  • 如果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. 创建管理员账号,保存用户名 + 密码

四、更换 Jenkins 清华插件更新源(解决插件下载慢 / 超时,必做)

  1. 主页 → Manage JenkinsPlugin ManagerAdvanced

  2. 修改【升级站点】URL:

    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

  3. 提交保存,重启 jenkins 容器

    nerdctl restart jenkins

五、后台补充安装 Maven 插件

  1. Manage JenkinsPlugin ManagerAvailable plugins
  2. 搜索勾选:
  • Maven Integration plugin
  • Pipeline Maven Integration
  1. 勾选Install without restart直接安装。

六、全局工具配置

Manage JenkinsGlobal Tool Configuration

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

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

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

八、Pipeline Jenkinsfile 示例(SpringBoot 打包 + nerdctl 构建镜像 + K8s 部署)

复制代码
pipeline {
    agent { label 'node01' }
    stages {
        stage('拉取代码') {
            steps {
                git url: 'https://gitee.com/xxx/xxx.git', branch: 'main'
            }
        }
        stage('Maven打包') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        stage('nerdctl构建镜像') {
            steps {
                sh '''
                nerdctl build -t my-spring-app:${BUILD_NUMBER} .
                '''
            }
        }
        stage('推送镜像 + K8s部署') {
            steps {
                // nerdctl push 镜像到私有镜像仓库
                // kubectl apply -f k8s/deploy.yaml
            }
        }
    }
}

九、常用运维命令

复制代码
# 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. 插件下载超时:初始化不勾选大量推荐插件,装好立刻切换清华更新源

需要的话,我可以给你一份一键安装脚本 install.sh,直接复制执行,一次性装好 nerdctl1.7.6+buildkit。

相关推荐
Ningcode_cloud2 天前
Kubernetes 弹性伸缩实验手册:从集群搭建到 HPA / VPA 自动扩缩容
云原生·k8s·prometheus
ZzzZZzzzZZZzzzz…4 天前
K8s---组件
运维·云原生·容器·kubernetes·k8s·k8s组件
张洛闻Eren4 天前
云原生k8s【第八课】: ETCD 备份与恢复
linux·运维·docker·kubernetes·k8s
张洛闻Eren5 天前
云原生k8s【第七课】:集群监控与可观测性
linux·运维·docker·云原生·容器·kubernetes·k8s
Eminem895 天前
9、k8s亲和性与污点容忍度
k8s
鹤落晴春7 天前
有状态应用 vs 无状态应用
运维·云原生·k8s
Eminem898 天前
8、k8s nodename和nodeSelector调度pod
k8s
cg.family10 天前
K8s内部pod间的负载均衡原理
k8s
w2005122413 天前
Pod管理
linux·服务器·云原生·容器·k8s·podman