Windows Docker 部署 Jenkins:从零到一构建跨平台CI/CD流水线

少年梁大锤

1. 为什么选择Docker部署Jenkins?

在软件开发领域,持续集成和持续交付(CI/CD)已经成为现代开发流程中不可或缺的一部分。Jenkins作为最流行的开源自动化服务器,能够帮助团队自动化构建、测试和部署过程。而Docker的出现,则为Jenkins的部署带来了革命性的便利。

我曾在多个项目中尝试过直接在物理机或虚拟机上安装Jenkins,经常会遇到环境依赖冲突、版本不兼容等问题。后来改用Docker部署后,这些问题都迎刃而解。Docker容器提供了隔离的环境,使得Jenkins可以拥有自己独立的运行空间,不会与主机上的其他应用产生冲突。

对于Windows用户来说,Docker Desktop提供了两种容器模式选择:Linux容器和Windows容器。Linux容器适合大多数Java、Python、Node.js等跨平台应用的构建,而Windows容器则专门为.NET Framework等Windows原生应用提供支持。这种灵活性使得我们可以在同一台Windows机器上为不同类型的项目搭建CI/CD环境。

2. 环境准备与Docker配置

2.1 系统要求检查

在开始之前,我们需要确保Windows系统满足Docker Desktop的基本要求。我建议使用Windows 10专业版或企业版(版本1903或更高),或者Windows 11。家庭版虽然也能运行,但需要额外配置。

硬件方面,至少需要:

  • 4GB内存(8GB以上更佳)
  • 启用虚拟化技术(可在BIOS中检查)
  • 至少20GB的可用磁盘空间(Windows容器镜像通常较大)

2.2 安装Docker Desktop

首先从Docker官网下载最新的Docker Desktop for Windows安装包。安装过程相对简单,但有几个关键点需要注意:

  1. 安装过程中会询问是否启用WSL 2后端,建议勾选此项以获得更好的性能
  2. 安装完成后,系统会提示需要重启
  3. 重启后首次运行Docker Desktop,它会在后台初始化一些组件,这可能需要几分钟时间

我曾经遇到过Docker启动失败的情况,大多数时候都是因为未启用Hyper-V或WSL 2功能。可以通过以下PowerShell命令检查并启用这些功能:

powershell复制# 以管理员身份运行
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

2.3 配置Docker存储位置

默认情况下,Docker会将镜像和容器数据存储在系统盘。为了避免C盘空间不足,我们可以修改存储位置:

  1. 右键点击系统托盘中的Docker图标
  2. 选择"Settings" → "Resources" → "Advanced"
  3. 修改"Disk image location"到其他分区

我习惯在D盘创建一个专门目录,比如"D:\DockerData",这样即使重装系统,只要保留这个目录,之前的镜像和容器数据也不会丢失。

3. Linux容器模式下的Jenkins部署

3.1 拉取Jenkins镜像

打开PowerShell,首先确认Docker正在运行Linux容器模式(Docker Desktop右下角显示"Linux containers")。然后执行以下命令拉取官方Jenkins镜像:

bash复制docker pull jenkins/jenkins:lts

这里我推荐使用LTS(长期支持)版本而非最新版,因为LTS版本更加稳定,适合生产环境。我曾经为了尝鲜使用过最新版,结果遇到了一些插件兼容性问题。

3.2 运行Jenkins容器

接下来是启动容器的关键步骤。我们需要考虑几个重要参数:

bash复制docker run -d --name jenkins-lts `
  -p 8080:8080 -p 50000:50000 `
  --restart unless-stopped `
  -v jenkins_home:/var/jenkins_home `
  jenkins/jenkins:lts

让我解释下这些参数的含义:

  • -d:后台运行容器
  • --name:为容器指定一个易记的名称
  • -p:端口映射,8080是Web界面端口,50000是Jenkins代理通信端口
  • --restart:设置容器自动重启策略
  • -v:数据卷挂载,这里使用了命名卷而非主机目录,更便于管理

使用命名卷的好处是Docker会自动管理存储位置,我们不需要关心具体路径。如果需要查看卷的实际位置,可以使用:

bash复制docker volume inspect jenkins_home

3.3 初始设置与安全配置

容器启动后,首次访问http://localhost:8080会看到解锁界面。获取初始密码的命令是:

bash复制docker exec jenkins-lts cat /var/jenkins_home/secrets/initialAdminPassword

在插件安装环节,我建议先选择"安装推荐插件",等系统运行起来后再根据需要添加其他插件。创建管理员账户时,务必使用强密码并妥善保存。

安全方面有几个重要设置:

  1. 进入"Manage Jenkins" → "Configure Global Security"
  2. 启用"Enable security"
  3. 选择适合的授权策略(如"Matrix-based security")
  4. 考虑设置反向代理并启用HTTPS

4. Windows容器模式下的Jenkins部署

4.1 切换到Windows容器模式

在Docker Desktop右下角点击"Switch to Windows containers",系统会下载必要的组件并重启Docker服务。这个过程可能需要几分钟时间,取决于网络速度。

需要注意的是,Windows容器对系统版本有严格要求。例如,windowsservercore-ltsc2019镜像只能在Windows 10版本1809或更高版本上运行。我曾经在版本不匹配的系统上尝试运行,结果遇到了各种兼容性问题。

4.2 拉取并运行Windows版Jenkins

Windows容器镜像通常体积较大,首次下载需要耐心等待:

powershell复制docker pull jenkins/jenkins:windowsservercore-ltsc2019
docker run -d --name jenkins-win `
  -p 8080:8080 -p 50000:50000 `
  --restart unless-stopped `
  -v jenkins_win_home:C:\ProgramData\Jenkins\JenkinsHome `
  jenkins/jenkins:windowsservercore-ltsc2019

Windows容器的一个常见问题是端口冲突。如果8080端口已被占用,可以更改为其他端口,如:

powershell复制docker run -d --name jenkins-win `
  -p 9090:8080 -p 50001:50000 `
  ...

4.3 Windows特定配置

Windows容器中的Jenkins在构建.NET Framework项目时需要特别注意:

  1. 确保容器内已安装所需的.NET Framework版本
  2. MSBuild工具路径需要正确配置
  3. 可能需要安装额外的Windows功能

进入容器内部进行配置的方法:

powershell复制docker exec -it jenkins-win powershell

在容器内部,我们可以像在普通Windows服务器上一样安装软件和配置环境。不过,最佳实践是将这些配置步骤写入Dockerfile,构建自定义镜像。

5. 高级配置与优化技巧

5.1 数据备份策略

Jenkins的所有配置和任务数据都存储在jenkins_home目录中。我强烈建议定期备份这个目录。对于Linux容器,可以设置一个简单的备份脚本:

bash复制docker stop jenkins-lts
docker run --rm --volumes-from jenkins-lts `
  -v $(pwd):/backup alpine `
  tar cvf /backup/jenkins_backup.tar /var/jenkins_home
docker start jenkins-lts

对于生产环境,可以考虑使用云存储或网络共享来存储备份文件。我曾经因为磁盘故障丢失过Jenkins数据,从那以后就养成了定期备份的习惯。

5.2 性能调优

随着项目增多,Jenkins可能会出现性能下降的情况。以下是一些优化建议:

  1. 增加JVM内存参数:
    bash复制docker run -e JAVA_OPTS="-Xmx2048m -Xms1024m" ...
    
  2. 限制并行构建数量
  3. 定期清理旧的构建记录
  4. 使用SSD存储jenkins_home

5.3 插件管理

插件是Jenkins强大功能的来源,但也可能成为不稳定的因素。我的经验是:

  1. 定期检查并更新插件
  2. 移除不再使用的插件
  3. 在测试环境验证新插件后再应用到生产环境
  4. 备份插件列表(可以通过Jenkins CLI导出)

一个实用的插件列表获取命令:

bash复制docker exec jenkins-lts ls /var/jenkins_home/plugins

6. 构建第一个CI/CD流水线

6.1 创建简单流水线

让我们从创建一个简单的Java项目构建流水线开始:

  1. 新建Item → 选择"Pipeline"
  2. 在Pipeline部分选择"Pipeline script"
  3. 输入以下Groovy脚本:
    groovy复制pipeline {
      agent any
      stages {
        stage('Build') {
          steps {
            sh 'mvn clean package'
          }
        }
        stage('Test') {
          steps {
            sh 'mvn test'
          }
        }
      }
    }
    
  4. 保存并立即构建

6.2 配置Git仓库集成

大多数项目都会使用版本控制系统。配置Git集成的方法:

  1. 安装Git插件(如果尚未安装)
  2. 在"Manage Jenkins" → "Global Tool Configuration"中设置Git路径
  3. 在流水线脚本中添加checkout步骤:
    groovy复制pipeline {
      agent any
      stages {
        stage('Checkout') {
          steps {
            git branch: 'main', url: 'https://github.com/your/repo.git'
          }
        }
        ...
      }
    }
    

6.3 添加构建后操作

完整的CI/CD流程通常包括构建后的部署步骤。例如,可以将构建产物发布到Nexus或推送到服务器:

groovy复制stage('Deploy') {
  steps {
    sshPublisher(
      publishers: [
        sshPublisherDesc(
          configName: 'production-server',
          transfers: [
            sshTransfer(
              sourceFiles: 'target/*.jar',
              removePrefix: 'target',
              remoteDirectory: '/opt/app'
            )
          ]
        )
      ]
    )
  }
}

记得先在Jenkins中配置SSH服务器的连接信息。我建议使用SSH密钥而非密码,并在Jenkins凭据系统中安全地存储这些敏感信息。

内容推荐

基于STM32C8T6与DM542的步进电机精准正反转控制实战
本文详细介绍了基于STM32C8T6微控制器与DM542驱动器的步进电机精准正反转控制实战。从硬件准备、接线详解到定时器PWM配置和方向控制逻辑实现,提供了完整的开发流程和调试技巧,帮助开发者快速掌握步进电机控制技术。
ARM Coresight OpenOCD 系列 1 -- OpenOCD 架构解析与核心组件
本文深入解析了ARM Coresight OpenOCD的架构与核心组件,详细介绍了其三层架构模型、JTAG/SWD驱动层、目标设备支持层及GDB服务器实现。通过实战配置指南和高级调试技巧,帮助开发者快速掌握OpenOCD在ARM芯片调试中的应用,提升调试效率与灵活性。
从仿真到实战:如何用SPICE模型分析一个简单的Buck电源电路(含寄生参数)
本文详细介绍了如何使用SPICE模型分析包含寄生参数的Buck电源电路,从基础建模到高级仿真技巧。通过真实元件模型获取、寄生参数影响分析及参数扫描等方法,帮助工程师在仿真阶段预判电路性能,优化设计效率与稳定性。特别适合电源设计工程师和电子爱好者提升SPICE仿真实战能力。
Linux系统信息查询的隐藏宝藏:getent命令从入门到脚本实战(含服务端口、用户组管理)
本文深入探讨了Linux系统中getent命令的强大功能,从基础查询到高级脚本应用,涵盖用户组管理、服务端口排查等实用场景。作为系统信息查询的隐藏宝藏,getent提供统一接口访问passwd、group、services等多种数据库,极大提升了运维效率和脚本编写便利性。
【实战排查指南】Jupyter Notebook 500 Internal Server Error:从错误日志到根治方案
本文详细解析了Jupyter Notebook出现500 Internal Server Error的常见原因及解决方案。从错误日志分析到系统化修复方法,包括版本升级、依赖检查、环境隔离等实用技巧,帮助开发者快速定位并解决Jupyter Notebook报错问题,提升开发效率。
你的网络在“抽风”吗?手把手教你定位OSPF邻居反复Up/Down的元凶
本文深入解析OSPF邻居关系频繁Up/Down的六大根源,包括链路质量、设备资源过载、定时器参数失配等,提供从物理层到协议层的全栈诊断方法,并给出可落地的解决方案,帮助网络工程师快速定位并根治OSPF故障定位难题,保障网络稳定性。
手把手教你彻底卸载顽固的McAfee企业版(附PE系统操作指南)
本文提供了彻底卸载顽固McAfee企业版的详细指南,包括诊断、标准卸载流程、PE环境深度清理及后期验证。特别针对没有管理员权限的用户,介绍了使用微PE工具箱等工具的安全操作步骤,确保系统资源释放且不损害稳定性。
从“找不到库”到“顺畅运行”:深入解析libopencv_core.so加载失败的系统级根源与实战修复
本文深入解析了libopencv_core.so加载失败的系统级根源,提供了从基础排查到高级修复的完整解决方案。涵盖动态库查找机制、ldconfig缓存更新、环境变量配置、编译时rpath设置以及多版本OpenCV共存处理等实战技巧,帮助开发者彻底解决error while loading shared libraries问题。
【Python】数据分析实战:pandas describe()函数在数据探索中的高效应用
本文深入探讨pandas describe()函数在Python数据分析中的高效应用,涵盖基础用法、参数优化、异常值检测及业务解读等实战技巧。通过电商、金融等真实案例,展示如何利用describe()快速洞察数据分布、识别异常,并生成自动化报告,提升数据分析效率与决策质量。
别再‘好好说话’了!从酒馆闲聊到高效团队沟通,聊聊‘无目的对话’的技术价值
本文探讨了技术团队如何从非结构化对话中汲取创新能量,揭示了‘无目的对话’在高效团队沟通中的技术价值。通过案例分析和方法论,展示了自由交流如何催生突破性解决方案,并提供了构建‘虚拟酒馆’等实用技巧,帮助团队提升创意产出。
M1/M2 Mac用户看过来:保姆级VMware Fusion Pro安装CentOS 7 ARM版教程(含镜像下载与常见循环启动问题解决)
本文为M1/M2 Mac用户提供详细的VMware Fusion Pro安装CentOS 7 ARM版教程,涵盖镜像下载、虚拟机配置及常见循环启动问题解决方案。特别针对ARM架构优化,帮助开发者高效搭建Linux开发环境,提升工作效率。
【源码拆解】PyTorch官方FCN-ResNet50:从Backbone到Head的模块化解析与实战调优
本文深入解析PyTorch官方FCN-ResNet50模型的模块化设计与实战调优技巧。从Backbone的ResNet50魔改到FCN Head的轻量级解码器设计,详细介绍了空洞卷积、双线性插值等关键技术,并提供了学习率策略、数据增强组合等实战调优指南,帮助开发者高效实现语义分割任务。
Pyecharts图表离线部署实战:解决内网环境HTML白屏的完整配置流程(附echarts.min.js下载)
本文详细介绍了Pyecharts图表在内网环境中的离线部署解决方案,重点解决HTML白屏问题。通过获取正确的echarts.min.js文件、配置本地路径及优化目录结构,确保图表在隔离环境中正常渲染。文章还提供了企业级部署的最佳实践和自动化方案,帮助开发者高效实现数据可视化。
【正点原子STM32】IIC总线实战:PCF8574 IO扩展与中断驱动的嵌入式系统设计
本文详细解析了STM32通过I²C总线驱动PCF8574实现IO扩展与中断驱动的嵌入式系统设计。从PCF8574芯片特性、I²C通信时序要点到中断驱动设计技巧,提供了完整的实战经验与优化方案,适用于工业控制、智能家居等场景,帮助开发者高效解决IO资源不足问题。
(实战)Graphviz从零部署到应用:环境配置、常见报错排查与可视化验证
本文详细介绍了Graphviz从零部署到应用的完整流程,包括环境配置、常见报错排查与可视化验证。通过实战示例,帮助开发者快速掌握Graphviz在数据可视化、决策树展示和微服务架构中的应用,提升工作效率。特别针对配置环境和报错问题提供了实用解决方案。
【技术拆解】从VGG16到FCN:全卷积化改造、多尺度融合与上采样策略全解析
本文深入解析了从VGG16到FCN的全卷积化改造过程,详细介绍了FCN-32s、FCN-16s和FCN-8s的多尺度融合与上采样策略。通过对比实验和实用技巧,展示了FCN在语义分割任务中的关键优势,包括输入尺寸灵活性、空间信息保留和端到端训练特性。文章还探讨了现代语义分割网络的演进,如U-Net和PSPNet的创新应用。
别再手动改图了!用VB.NET给SolidWorks做个‘一键变尺寸’小工具(附完整代码)
本文介绍如何利用VB.NET开发SolidWorks参数化工具,实现一键修改零件尺寸,大幅提升设计效率。通过详细的代码示例和开发步骤,帮助工程师告别重复劳动,专注于创造性设计。文章涵盖环境配置、核心功能实现、错误处理及团队协作等关键环节,特别适合SolidWorks二次开发初学者。
从零到一:在CentOS 7上部署openDCIM 23.02全记录
本文详细记录了在CentOS 7系统上部署openDCIM 23.02的全过程,包括环境准备、LAMP环境搭建、安全加固、安装流程及生产环境维护建议。openDCIM作为数据中心基础设施管理工具,能有效提升运维效率,支持可视化机架图、资产信息记录、电源链路管理等功能,适合Linux环境下部署。
剖析Vue3+Vite+TS+UniApp项目中uview-plus样式打包失效的深层原因与精准修复
本文深入分析了Vue3+Vite+TS+UniApp项目中uview-plus样式打包失效的深层原因,揭示了依赖冲突导致的样式加载问题。通过统一依赖版本、优化构建配置等系统化解决方案,有效修复了uView-plus在生产环境中的样式丢失问题,为开发者提供了实用的工程化建议和疑难排查指南。
串行EEPROM AT24C32实战:从引脚配置到I2C驱动代码全解析
本文全面解析串行EEPROM AT24C32的硬件连接与I2C驱动实现,涵盖引脚配置、典型电路设计、I2C通信协议及实战代码。详细讲解AT24C32在设备参数存储中的应用技巧,包括数据校验、延长寿命写法和常见问题排查,助力开发者高效使用这款存储器芯片。
已经到底了哦
精选内容
热门内容
最新内容
告别conda!用Docker一键搞定SMC++ v1.15.4,轻松分析群体基因组历史
本文介绍了如何利用Docker容器化技术一键部署SMC++ v1.15.4,简化群体基因组历史分析流程。通过Docker实现环境隔离与可复现性,研究者可以快速进行有效种群分析,避免传统conda安装的依赖冲突问题,显著提升研究效率。
别再只会调Kp了!手把手教你用Arduino给直流电机调一个稳如老狗的电流环PID
本文详细介绍了如何使用Arduino为直流电机配置稳定的电流环PID控制。从诊断电机抖动现象到硬件准备、参数整定及抗饱和处理,提供了完整的实战指南。特别适合需要解决电机负载变化问题的机器人或3D打印机项目开发者。
老项目兼容不求人:Keil4与Keil5共存安装最稳方案(附资源包与2032年激活方法)
本文详细介绍了Keil4与Keil5双版本共存的终极实践方案,解决嵌入式开发中的兼容性问题。通过科学的安装路径规划、注册表修改技巧和稳定的激活方法,确保新旧项目无缝切换。特别适用于维护工业控制设备和家电主控板的工程师,提供2032年后的长期维护解决方案。
Simulink 自动代码生成电机控制:模型预测控制(MPC)模块参数整定实战(1)
本文详细介绍了在Simulink环境下使用模型预测控制(MPC)模块进行电机控制的参数整定实战。从PI控制器到MPC的升级路径出发,分享了MPC模块的基础配置、系统级仿真验证及参数优化技巧,帮助工程师快速掌握自动代码生成技术在电机控制中的应用。
实战演练:利用hping3模拟DDoS攻击与防御验证(环境搭建+攻击复现)
本文详细介绍了如何利用hping3工具模拟DDoS攻击并进行防御验证,包括环境搭建、攻击复现和防御措施。通过实战演练,读者可以掌握SYN Flood、UDP Flood等攻击方式,并学习如何配置SYN Cookie、速率限制等防护策略,提升网络安全防护能力。
从零到一:GUI Guider与LVGL嵌入式UI开发实战
本文详细介绍了从零开始使用GUI Guider与LVGL进行嵌入式UI开发的实战经验。涵盖环境准备、版本匹配、工程创建、UI设计、代码移植及性能优化等关键步骤,特别针对小屏幕适配和STM32整合提供了实用技巧,帮助开发者高效构建嵌入式用户界面。
别再乱开Lumen了!UE5新手必看的Lumen与Nanite、虚拟阴影搭配避坑指南
本文为UE5新手提供了Lumen与Nanite、虚拟阴影的黄金配置法则,帮助开发者避免常见的漏光、阴影闪烁和帧率暴跌问题。通过详细的配置方案和实战技巧,优化渲染性能,提升光影质量,适用于移动端、影视级画质等不同场景。
从零到一:在VSCode中配置CMake与C++调试环境实战
本文详细介绍了如何在VSCode中配置CMake与C++调试环境,从基础安装到项目创建、调试配置及常见问题排查,帮助开发者快速搭建高效的开发环境。教程涵盖VSCode插件安装、CMake项目结构、tasks.json与launch.json配置,以及调试技巧与效率优化。
用STM32G431复刻蓝桥杯省赛真题:一个四层升降控制器的完整代码拆解
本文详细解析了使用STM32G431复刻蓝桥杯嵌入式省赛四层升降控制器的完整开发过程。从硬件初始化、状态机设计到PWM控制电机和人机交互实现,提供了关键代码示例和调试技巧,帮助开发者高效解决嵌入式控制系统中的复杂问题。
从C++到Python:在CLion中无缝切换开发语言的实践指南
本文详细介绍了如何在CLion中无缝切换C++和Python开发,提升跨语言项目效率。通过环境配置、项目结构优化、调试技巧和性能工具链整合,帮助开发者充分利用CLion的混合调试和智能补全功能,实现高效开发。特别适合需要在C++和Python间切换的开发者。