环境说明
- 宿主机系统: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 buildkit5. 测试 nerdctl 是否可用
nerdctl pull hello-world nerdctl run --rm hello-world✅ 能正常输出 hello 信息即 nerdctl 安装成功。
坑点提醒
- containerd 1.7.16,最高搭配 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=7070/tcp --permanent firewall-cmd --add-port=50000/tcp --permanent firewall-cmd --reload2. 拉取新版 Jenkins 镜像
nerdctl pull jenkins/jenkins:2.504.3-lts # 查看镜像列表 nerdctl images3. 启动 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 jenkins4. 获取初始管理员密码,网页解锁 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 相关插件在初始化向导页面搜不到,初始化完成后后台再安装。
- 点击安装插件,等待下载。
提示部分插件安装失败不用处理,直接继续,进后台切换清华源补装缺失插件。
- 创建管理员账号,保存用户名 + 密码。
四、Web 初始化 & 安全配置
- 打开页面,填入日志输出的初始 admin 密码,完成初始化
- Manage Jenkins → Security
- Security Realm:
Jenkins’ own user database - Authorization:
Logged-in users can do anything - Save
- Security Realm:
- Manage Users,创建 admin 账号,设置登录密码
- 退出重新登录验证账号密码
五、凭证配置& 远程 SSH Agent 节点
Manage Jenkins → Credentials → System → Global credentials 添加 2 类凭证:
Manage Jenkins→Credentials→System→Global credentials新增凭证:Git 仓库账号密码 / 服务器 SSH 私钥Manage Jenkins→Manage Nodes and Clouds→New Node新建 SSH 代理节点,填入 node 服务器 IP、SSH 凭证、远程工作目录(依赖 SSH Build Agents 插件)- 镜像仓库凭证(可选):仓库账号密码,用于 nerdctl push 镜像
六、全局工具配置
Manage Jenkins→Global Tool Configuration
- JDK:新增 JDK,自动安装或填写宿主机 JDK 路径
- 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)
- 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:添加远程构建节点
- 插件下载超时:初始化不勾选大量推荐插件,装好立刻切换清华更新源
- nerdctl: command not found
容器内没有 nerdctl,两种方案: 方案 A(推荐):Jenkinsfile 里用宿主机全路径
/usr/local/bin/nerdctlsh '/usr/local/bin/nerdctl build -t xxx .'方案 B:把宿主机 nerdctl 二进制挂载进容器(不推荐,版本耦合)
- 权限报错:permission denied /var/run/containerd.sock
将 jenkins 容器内用户加入宿主机 containerd 用户组,或者宿主机临时调整 sock 权限(内网环境)
- Maven 打包下载依赖慢:在 maven settings.xml 配置阿里云镜像,放到 jenkins-home maven 目录
重点补充:容器内部默认没有 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 界面配置(最简单,推荐)
- 登录 Jenkins 后台,进入:
Manage Jenkins→Plugins→Advanced settings - 页面拉到底,找到Update Sites(升级站点)
- 把原来默认官方地址删掉,粘贴上面 2.504 专用清华链接
- 点Submit(提交)保存
- 【关键】重启 Jenkins 容器生效
#nerdctl重启命令 nerdctl restart jenkins- 重启完成后,回到插件页面,等待拉取插件清单。
注意:新版 Jenkins 界面没有 Check now 按钮,保存 + 重启后自动拉取更新清单。
方法二:命令行修改配置文件(界面修改报错时用,nerdctl 容器)
- 进入 jenkins 容器
nerdctl exec -it jenkins bash- 进入 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- 退出容器,宿主机重启 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)
- ❌ 不要使用旧通用地址:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json,2.504 版本会版本校验失败 - 修改完必须重启容器,只点提交不重启不生效
- 切换源后如果依然报错:删除 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 核心插件,避免并发下载超时。