龙芯3B6000服务器上基于Docker部署Jenkins的完整实践指南

发布时间:2026/7/27 8:18:35
龙芯3B6000服务器上基于Docker部署Jenkins的完整实践指南 最近在帮一个团队做国产化环境下的持续集成方案他们用的是一台龙芯 3B6000 的服务器。说实话一开始听到“在龙芯上用 Docker 跑 Jenkins”这个需求我脑子里闪过的第一个念头是这会不会是个“缝合怪”组合毕竟龙芯的 LoongArch 架构、Docker 的容器化、Jenkins 的自动化这三者凑一起听起来就像要把三个不同世界的规则手册拼成一本。但真正上手后我发现事情比想象中有趣也更有代表性。这不仅仅是一次简单的软件安装更像是一次对“在非主流架构上构建标准化工程能力”的完整压力测试。你会遇到从 CPU 指令集、操作系统适配、容器运行时到应用配置的完整链路问题。而解决这些问题的过程恰恰能帮你把 Jenkins 和 Docker 的理解从“会用”推进到“懂为什么这么用”的层面。所以这篇文章不会是一份简单的“apt-get install”清单。我想和你聊聊在龙芯 3B6000 这样的平台上如何系统性地思考和完成 Jenkins 的 Docker 化部署。我们会从最底层的环境适配开始一步步走到一个稳定、可维护的 CI/CD 流水线。过程中那些关于镜像、网络、存储和权限的“坑”才是真正有价值的部分。1. 先别急着docker run理解龙芯平台的特殊性很多人一上来就找 Jenkins 的 Docker 镜像然后docker run结果大概率会碰壁。在龙芯 3B6000 上第一步必须是认清战场环境。这不是 X86也不是 ARM而是 LoongArch。1.1 架构差异是根本为什么通用镜像不工作你从 Docker Hub 上直接拉取的jenkins/jenkins:lts镜像默认是为linux/amd64或linux/arm64构建的。龙芯 3B6000 的 LoongArch 架构通常标识为loong64与它们指令集不兼容。直接运行会导致类似exec format error的错误。这引出了第一个核心认知在异构平台上软件生态的完备性直接决定了部署的复杂度。对于 Jenkins 这种复杂的 Java 应用我们需要的不是一个简单的二进制文件而是一整套包含正确架构的 JRE、依赖库和 Jenkins 本身的运行时环境。怎么办你有三条路寻找官方或社区提供的loong64镜像这是最理想的情况。幸运的是随着龙芯生态的完善一些基础镜像和流行软件的 LoongArch 版本已经开始出现。你需要去 Docker Hub 或其他镜像仓库搜索带有loong64标签的镜像。基于 LoongArch 的基础镜像自行构建如果没有现成的 Jenkins 镜像你需要从龙芯提供的 LoongArch 版本的基础操作系统镜像如loongnix、openanolis/loong64等开始自己编写 Dockerfile安装 JDK再安装 Jenkins。这考验你对 Dockerfile 和 Jenkins 依赖的理解。使用binfmt_misc与 QEMU 进行跨架构模拟这是一种取巧但可能有性能损耗和兼容性风险的方法。通过在宿主机上注册 QEMU 用户态模拟器让 Docker 能够运行非本机架构的镜像。对于学习和测试可以但对于生产环境的 CI/CD 服务器我不推荐。我们的主攻方向应该是前两条。在开始之前先用命令确认你的系统架构uname -m如果输出是loongarch64那么你就站在了正确的起点上。1.2 操作系统与内核确保容器引擎的基石稳固Docker 的运行依赖于 Linux 内核的特定功能如命名空间、控制组cgroup和存储驱动。龙芯的主流发行版如 Loongnix、Anolis OS LoongArch 版通常已经包含了这些支持。但在安装 Docker 之前最好做一次快速检查内核版本uname -r确保不是过于陈旧的版本。cgroup 支持检查/proc/filesystems是否包含cgroup和cgroup2。现代 Docker 更倾向于 cgroup v2。存储驱动龙芯平台常用的overlay2驱动需要内核支持。可以grep overlay /proc/filesystems确认。这些检查是为了避免 Docker 安装后无法启动或者容器运行出现一些底层错误。一个稳定的宿主系统是容器化一切的前提。1.3 网络与存储规划提前想好避免后期搬家在物理服务器或虚拟机上部署服务我们通常会规划 IP、磁盘挂载。在容器化部署时这个思维习惯同样重要甚至更重要因为容器是“临时”的数据需要持久化。网络模式Jenkins 作为 CI/CD 大脑需要被构建节点Agent和开发人员访问。最简单的就是使用 Docker 的bridge网络并通过-p参数将容器的 8080 端口映射到宿主机的某个端口如 8080。如果需要更复杂的网络隔离或使用宿主网络需要提前规划。数据持久化Jenkins 的所有配置、任务、插件、构建日志都必须存储在容器之外否则容器一删除一切归零。我们必须通过 Docker 的-v或--mount参数将宿主机的目录挂载到容器内的/var/jenkins_home。这个宿主机目录的权限、磁盘空间和备份策略都需要事先考虑。把环境特殊性、网络和存储这三个问题想清楚我们才能写出一个真正能用的docker run命令而不是一个跑起来就报错或数据丢失的“一次性玩具”。2. 实战部署从拉取镜像到服务就绪理论清晰后我们进入动手环节。假设我们选择最理想的路径找到了一个可用的loong64架构的 Jenkins 镜像。2.1 获取与验证镜像首先搜索并拉取镜像。镜像名称可能因来源而异例如docker pull jenkins/jenkins:lts-loong64 # 或者来自某个特定的仓库 # docker pull registry.example.com/jenkins:loongarch64拉取完成后强烈建议验证其架构docker image inspect jenkins/jenkins:lts-loong64 --format{{.Architecture}}确认输出是loong64或loongarch64。注意如果找不到官方loong64镜像你可能需要基于openanolis/loong64或cr.loongnix.cn/library/loongnix这类基础镜像自行构建。这需要你熟悉 Jenkins 的安装流程和依赖并编写一个多阶段的 Dockerfile 来优化镜像大小。2.2 准备持久化存储与首次运行在宿主机上创建一个目录用于存放 Jenkins 的所有数据并确保当前用户有读写权限因为容器内 Jenkins 进程通常以jenkins用户运行UID 通常是 1000。sudo mkdir -p /var/jenkins_home sudo chown -R 1000:1000 /var/jenkins_home # 将所有权赋予 UID 1000 # 如果不确定也可以放宽权限但生产环境不建议 777 # sudo chmod 777 /var/jenkins_home现在运行你的第一个 Jenkins 容器docker run -d \ --name my-jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v /var/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ jenkins/jenkins:lts-loong64解释一下参数-d: 后台运行。--name: 给容器起个名字方便管理。-p 8080:8080: 将容器内 Jenkins Web 界面的 8080 端口映射到宿主机 8080。-p 50000:50000: 映射 JNLP 端口用于连接基于 Java 的构建代理Agent。-v /var/jenkins_home:/var/jenkins_home:最关键的一步将宿主机目录挂载到容器内实现数据持久化。-v /var/run/docker.sock:/var/run/docker.sock:可选但强大。这将宿主机的 Docker 守护进程套接字挂载到容器内使得 Jenkins 容器可以直接调用宿主机的 Docker 命令即所谓的 “Docker-out-of-Docker” 或 “DooD”。这样你的 Jenkins Pipeline 就可以创建和管理其他 Docker 容器用于构建、测试这在 CI/CD 中非常常见。但请注意安全风险这相当于给了 Jenkins 容器很高的宿主机权限。最后的jenkins/jenkins:lts-loong64是你的镜像名。2.3 初始解锁与插件安装容器运行后访问http://你的服务器IP:8080。你会看到 Jenkins 的解锁页面。获取初始密码通过docker logs my-jenkins命令查看容器日志找到类似Jenkins initial password is: xxxxxxxxxxxxxxxxxxxxxx的行复制密码填入 Web 页面。安装推荐插件接下来 Jenkins 会建议安装一批常用插件。在龙芯环境下这里可能遇到第一个挑战。由于网络和架构原因从 Jenkins 官方更新中心下载插件可能会很慢甚至失败。建议选择“安装推荐插件”但要有耐心。如果某些插件反复失败可以后续在“插件管理”中单独安装。创建管理员用户按照提示完成初始管理员账户设置。至此一个最基本的 Jenkins 服务已经在你的龙芯 3B6000 上跑起来了。但这只是万里长征第一步一个能看的管理界面离一个可用的 CI/CD 引擎还差得远。3. 配置优化与核心问题排查服务起来后真正的工程化工作才开始。你需要把它配置得稳定、高效、安全。3.1 插件管理网络与架构兼容性插件是 Jenkins 的灵魂也是问题高发区。更新站点默认的官方更新站点可能较慢。你可以考虑更换为国内的镜像源如清华、华为镜像源。在“插件管理” - “高级” - “升级站点”中修改 URL。但请注意镜像源的插件索引更新可能有延迟。架构兼容性绝大多数 Jenkins 插件是纯 Java 的.jpi或.hpi文件与 CPU 架构无关这是好消息。但极少数插件可能包含原生Native库例如某些通过 JNI 调用本地代码的插件。这类插件在 LoongArch 上很可能无法工作。安装时需留意错误信息。通常核心的 Git、Pipeline、Docker 等插件都没有问题。离线安装如果网络问题无法解决可以手动从 Jenkins 插件官网 下载插件.hpi文件然后在“高级”选项卡中通过“上传插件”进行离线安装。3.2 性能与资源调优龙芯 3B6000 的性能与同代 X86 处理器有差异合理的资源限制很重要。JVM 参数Jenkins 是 Java 应用可以通过环境变量调整其内存。在docker run时添加-e JAVA_OPTS-Xmx2048m -Xms512m这里将最大堆内存设为 2GB初始堆内存 512MB。请根据你的服务器实际内存调整例如 8GB 内存的机器给 Jenkins 分配 4GB 是合理的。Docker 资源限制使用--cpus、--memory等参数限制容器资源防止单个容器耗尽主机资源。docker run -d --name my-jenkins --cpus2.0 --memory4g ...3.3 常见问题与排查链路部署过程中你大概率会遇到一些问题。别慌按这个顺序排查现象容器启动后立即退出。排查docker logs my-jenkins看最后几行错误信息。最常见的是权限问题/var/jenkins_home目录权限不对Jenkins 用户无法写入。用ls -la /var/jenkins_home检查并用chown修正。端口冲突宿主机 8080 端口已被占用。用netstat -tlnp | grep 8080检查修改-p参数映射到其他端口如-p 8081:8080。架构错误镜像架构不匹配。用docker image inspect确认。现象能访问网页但非常卡顿或插件安装失败。排查网络在容器内docker exec -it my-jenkins bash然后ping www.baidu.com或curl -I https://updates.jenkins.io检查网络连通性。资源用docker stats my-jenkins查看容器 CPU 和内存使用情况判断是否资源不足。磁盘 I/O如果宿主机磁盘性能差也会导致 Jenkins 响应慢。检查/var/jenkins_home所在磁盘的利用率df -h和 IO 等待iostat。现象Pipeline 中执行 Docker 命令失败如果挂载了 Docker Socket。排查在 Jenkins Pipeline 的sh步骤中运行docker version或docker info看是否正常。检查容器内/var/run/docker.sock的文件权限确保 Jenkins 进程通常是jenkins用户有访问权限。有时需要将 Jenkins 用户加入宿主机的docker组通过在 Dockerfile 中创建用户并指定 GID或者在宿主机上调整/var/run/docker.sock的权限不推荐有安全风险。4. 从“能用”到“好用”构建龙芯原生 CI/CD 流水线Jenkins 部署成功只是拿到了入场券。在龙芯平台上CI/CD 流水线的构建有其特殊意义——你很可能是在为一个 LoongArch 架构的软件项目进行构建和测试。这意味着你的构建环境Agent也需要是 LoongArch 的。4.1 构建节点的选择静态 Agent 与 Docker 动态 Agent静态 Agent常驻节点在另一台或同一台龙芯机器上部署一个 Jenkins Agent将其注册到 Jenkins Master。这种方式稳定适合需要固定环境或大量依赖的构建任务。你需要准备 LoongArch 版本的 JDK、Maven/Gradle、Node.js 等工具链。Docker 动态 Agent推荐这是更云原生、更灵活的方式。利用前面提到的 Docker Socket 挂载在 Jenkins Pipeline 中使用docker或dockerfile代理动态启动一个基于 LoongArch 镜像的容器来执行构建步骤。例如一个简单的 Jenkinsfile 可能如下pipeline { agent { docker { image openanolis/loong64:8 // 使用一个LoongArch的基础镜像 args -v /tmp:/tmp // 可以挂载一些必要卷 } } stages { stage(Build) { steps { sh uname -m // 这里应该输出 loongarch64 sh java -version // 在这里执行你的编译命令例如 mvn clean package } } } }这种方式能确保每次构建都在一个纯净、一致的 LoongArch 环境中进行非常适合自动化。4.2 镜像仓库与依赖加速在龙芯生态中软件源和镜像仓库是另一个需要关注的点。基础镜像寻找可靠的 LoongArch 基础镜像源如cr.loongnix.cn龙芯开源镜像站、openanolis等。依赖代理对于 Maven、NPM、Pip 等依赖下载配置国内镜像源或公司内部代理至关重要能极大提升构建速度。这些配置可以写在构建容器的 Dockerfile 里或者通过 Jenkins 的“全局工具配置”注入环境变量。4.3 安全与维护建议定期备份/var/jenkins_home这是你的全部身家。使用tar或rsync定期备份整个目录到异地。升级策略Jenkins 和插件定期有安全更新。升级前务必在测试环境验证并完整备份。对于 Docker 部署升级通常意味着拉取新镜像停止旧容器用新镜像启动并挂载原有的数据卷。控制权限谨慎使用 Docker Socket 挂载。如果不需要在 Pipeline 中动态创建容器就不要挂载。如果必须挂载要严格控制 Jenkins 项目的权限避免执行任意危险的 Docker 命令。监控监控 Jenkins 容器的资源使用CPU、内存、磁盘、日志中的错误信息以及构建队列的长度。在龙芯 3B6000 上通过 Docker 部署 Jenkins最终交付的不仅仅是一个自动化工具。它是一套验证过的、在国产化平台上构建现代软件工程能力的可行路径。从克服架构差异到配置持久化存储再到构建真正可用的 LoongArch 原生流水线每一步都在加深你对容器化、基础设施即代码和持续集成的理解。当你看到第一个为 LoongArch 平台编译的软件包通过这条流水线自动构建、测试并发布时你就会明白所有的前期折腾都是值得的。这不再是简单的技术移植而是在一个新的计算基石上重建高效、标准的开发运维工作流。