环境说明
- 宿主机系统: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 安装成功。
坑点提醒
- containerd 1.6.33,最高搭配 nerdctl 1.7.x,不能用 1.8 及以上,会出现 API 不兼容
- 必须用
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 初始化向导(插件选择,按你之前踩坑优化)
-
解锁页面 → 选择 【选择插件来安装】 ,❌不要选择推荐插件(国外源极易超时)
-
取消全部勾选,只勾选下面 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 相关插件在初始化向导页面搜不到,初始化完成后后台再安装。
- 点击安装插件,等待下载。
提示部分插件安装失败不用处理,直接继续,进后台切换清华源补装缺失插件。
- 创建管理员账号,保存用户名 + 密码。
四、更换 Jenkins 清华插件更新源(解决插件下载慢 / 超时,必做)
-
主页 →
Manage Jenkins→Plugin Manager→Advanced -
修改【升级站点】URL:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
-
提交保存,重启 jenkins 容器
nerdctl restart jenkins
五、后台补充安装 Maven 插件
Manage Jenkins→Plugin Manager→Available plugins- 搜索勾选:
- Maven Integration plugin
- Pipeline Maven Integration
- 勾选
Install without restart直接安装。
六、全局工具配置
Manage Jenkins → Global Tool Configuration
- JDK:新增 JDK,自动安装或填写宿主机 JDK 路径
- Maven:新增 Maven,自动安装版本,配置阿里云镜像 settings.xml
七、配置凭证 & 远程 SSH Agent 节点
Manage Jenkins→Credentials→System→Global credentials新增凭证:Git 仓库账号密码 / 服务器 SSH 私钥Manage Jenkins→Manage Nodes and Clouds→New 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)
- containerd 1.6.33,nerdctl 最高只能用 1.7.x,不要升级 1.8+,API 不兼容
nerdctl build报错:buildkit 未启动,执行systemctl enable --now buildkit- Jenkins 调用 nerdctl 失败:启动命令必须挂载
/var/run/containerd/containerd.sock - Jenkins 权限报错:
/opt/jenkins/home目录必须chown 1000:1000 - 初始化页面找不到 Maven 插件:初始化向导插件子集不全,后台插件管理器安装
- SSH 两个插件区分:
- SSH Agent:流水线 shell 内部使用 ssh 密钥
- SSH Build Agents:添加远程构建节点
- 插件下载超时:初始化不勾选大量推荐插件,装好立刻切换清华更新源
需要的话,我可以给你一份一键安装脚本 install.sh,直接复制执行,一次性装好 nerdctl1.7.6+buildkit。