2026云原生实战:Docker+K8S+Jenkins构建完整CI/CD流水线
这次我们来看一套面向2026年的容器化与云原生实战教程。这套内容不是零散的知识点堆砌而是将 Docker、Kubernetes (K8S)、Jenkins 和 Linux 运维串联成一个完整的 CI/CD 实战项目。对于刚接触容器技术、想从零搭建一套自动化部署流水线的开发者或运维人员来说这套教程的核心价值在于“学完就能用”——它清晰地展示了如何从单机 Docker 环境一步步构建出具备自动构建、测试、部署能力的 K8S 集群。如果你关心的是如何在 Windows/macOS/Linux 上快速安装 Docker Desktop、如何编写高效的 Dockerfile、如何搭建一个最小可用的 K8S 集群即使是单节点学习环境、如何配置 Jenkins 实现代码提交即自动部署以及如何解决过程中最常见的网络、存储、镜像拉取问题那么这篇文章可以直接收藏。我们将避开庞杂的理论聚焦于可执行的操作、可验证的结果和可复现的排错步骤。1. 核心能力速览本教程涵盖的技术栈和关键实践点如下表所示这不仅是学习路径也是一个最小可用的云原生交付流水线清单。能力项说明与目标技术栈覆盖Docker 容器化 - Kubernetes 编排 - Jenkins 自动化 - Linux 基础运维学习门槛面向零基础或有一定 Linux 命令基础的开发者无需预先精通所有组件。环境要求支持 Windows 10/11 (WSL2)、macOS 及主流 Linux 发行版。内存建议 8GBCPU 支持虚拟化。核心产出1. 一个可运行的 Docker 环境。2. 一个单节点或多节点 K8S 集群。3. 一套 Jenkins CI/CD 流水线能自动构建 Docker 镜像并部署到 K8S。关键技能点Dockerfile 编写、Docker Compose、K8S Pod/Deployment/Service 配置、Jenkins Pipeline (Declarative) Helm Chart 基础。排错重点镜像拉取失败、网络策略冲突、持久化存储配置、Jenkins 插件依赖、K8S 资源权限。2. 适用场景与使用边界这套教程和实战项目主要适合以下几类读者转型 DevOps 的传统开发/运维人员需要快速掌握容器化和自动化部署的核心技能链。计算机相关专业的学生希望通过一个完整的项目理解云原生技术的实际工作流丰富简历项目经验。中小团队技术负责人计划引入容器化和自动化部署需要一套经过验证的、可落地的入门方案进行技术预研。个人项目开发者希望为自己的应用搭建一套专业的、可扩展的部署环境。需要明确的使用边界学习与预研环境教程中搭建的 K8S 集群如使用 Minikube、K3s 或单 Master 集群适用于开发、测试和学习不能直接等同于生产级的高可用集群。生产环境需要考虑多 Master、etcd 集群、网络插件选型、监控日志体系等。资源消耗在本地同时运行 Docker、K8S 集群和 Jenkins对电脑内存和 CPU 有一定要求。如果资源紧张建议按模块分步实践或使用云服务器进行。安全边界教程以保证功能跑通为首要目标涉及的网络策略、镜像仓库认证、K8S RBAC 权限控制等安全最佳实践仅作引导性介绍。在生产部署前必须系统性地加强安全配置。3. 环境准备与前置条件在开始动手之前请确保你的实验环境满足以下基本要求。这是后续所有步骤能够顺利进行的基础。3.1 硬件与操作系统操作系统Windows 10/11 (版本 2004 及以上需启用 WSL2)、macOS 10.15 或任意主流 Linux 发行版如 Ubuntu 20.04/22.04 LTS, CentOS 7/8。内存建议 8 GB 或以上。运行 K8S 单节点集群至少需要 2-3 GB 空闲内存加上 Jenkins 和 Docker8GB 是流畅体验的起点。CPU现代双核以上处理器并确保在 BIOS/UEFI 中已开启虚拟化技术如 Intel VT-x 或 AMD-V。这对于在 Windows/macOS 上运行 Docker Desktop 和 K8S 至关重要。磁盘空间至少预留 20 GB 可用空间用于安装软件、拉取基础镜像和存储项目文件。3.2 关键软件检查清单在安装 Docker 之前请先完成这些检查Windows 用户确认已安装并启用WSL 2。在 PowerShell管理员中运行wsl --list --verbose查看。若未安装请参考微软官方文档安装。虚拟化检查Windows打开任务管理器 - “性能”选项卡 - “CPU”查看“虚拟化”是否已启用。Linux/macOS通常在终端运行egrep -c ‘(vmx|svm)’ /proc/cpuinfo(Linux) 或sysctl -a | grep machdep.cpu.features(macOS)输出非0则支持。网络准备确保主机可以正常访问互联网用于下载安装包和拉取 Docker 镜像。了解公司或家庭网络是否有特殊的代理或防火墙规则。4. Docker 安装与基础实战Docker 是整个技术栈的基石。我们采用最通用的安装方式并立即通过一个实战项目来巩固。4.1 Docker 安装以 Ubuntu 22.04 为例以下脚本完成了仓库配置、依赖安装和 Docker Engine 的安装。# 1. 卸载旧版本如有 sudo apt-get remove docker docker-engine docker.io containerd runc # 2. 安装依赖包允许 apt 通过 HTTPS 使用仓库 sudo apt-get update sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 3. 添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 4. 设置稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 5. 安装 Docker Engine sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 6. 验证安装 sudo docker run hello-world如果看到 “Hello from Docker!” 的输出说明安装成功。对于 Windows/macOS 用户强烈建议直接下载并安装 Docker Desktop它集成了 Docker Engine、CLI 和图形化管理界面并内置了 K8S 支持选项。4.2 第一个 Docker 实战容器化一个 Python Web 应用我们创建一个简单的 Flask 应用并将其容器化。创建项目目录及文件mkdir my-flask-app cd my-flask-app编写应用代码app.pyfrom flask import Flask app Flask(__name__) app.route(‘/‘) def hello(): return ‘h1Hello, Docker K8S!/h1pThis is my first containerized app./p‘ if __name__ ‘__main__‘: app.run(host‘0.0.0.0‘, port5000)编写依赖文件requirements.txtFlask2.3.2编写 Dockerfile这是构建镜像的“食谱”。# 使用官方 Python 轻量级镜像作为基础 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装依赖使用国内镜像源加速可选 RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制应用代码 COPY . . # 声明容器运行时暴露的端口 EXPOSE 5000 # 定义容器启动命令 CMD [“python”, “app.py”]构建 Docker 镜像# -t 为镜像打标签格式为 name:tag docker build -t my-flask-app:1.0 .使用docker images查看构建成功的镜像。运行容器# -d 后台运行-p 将主机8080端口映射到容器5000端口 docker run -d -p 8080:5000 --name my-flask-container my-flask-app:1.0验证打开浏览器访问http://localhost:8080应该能看到 Flask 应用的欢迎页面。使用docker ps查看运行中的容器docker logs my-flask-container查看容器日志。5. Kubernetes (K8S) 单机集群搭建与部署在生产中K8S 集群由多台机器组成。为了学习和开发我们使用轻量级工具在单机上快速搭建一个集群。5.1 使用 Minikube 搭建本地 K8S 集群Minikube 是最流行的本地单节点 K8S 方案。# 1. 安装 MinikubeLinux 示例 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube # 2. 启动集群需要提前安装好 Docker minikube start --driverdocker # 3. 验证集群状态 minikube status kubectl get nodes # 如果 kubectl 未安装minikube 会提示安装命令kubectl是操作 K8S 的命令行工具。Minikube 启动后会自动配置kubectl的上下文。5.2 将 Flask 应用部署到 K8S现在我们把之前容器化的 Flask 应用部署到 Minikube 集群中。创建 DeploymentDeployment 管理 Pod容器组的副本和更新策略。# flask-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: flask-app-deployment spec: replicas: 2 # 运行2个副本Pod selector: matchLabels: app: flask-app template: metadata: labels: app: flask-app spec: containers: - name: flask-app image: my-flask-app:1.0 # 使用本地构建的镜像 ports: - containerPort: 5000 resources: requests: memory: “64Mi” cpu: “250m” limits: memory: “128Mi” cpu: “500m”应用配置kubectl apply -f flask-deployment.yaml创建 ServiceService 为 Pod 提供一个稳定的网络访问入口。# flask-service.yaml apiVersion: v1 kind: Service metadata: name: flask-app-service spec: selector: app: flask-app # 选择标签为 app: flask-app 的 Pod ports: - protocol: TCP port: 80 # Service 对外的端口 targetPort: 5000 # 容器内部的端口 type: NodePort # 类型为 NodePort会在每个节点上开放一个端口30000-32767kubectl apply -f flask-service.yaml访问应用# 获取 Service 的 NodePort 端口 kubectl get svc flask-app-service # 输出中会有一行类似80:3xxxx/TCP其中 3xxxx 就是节点端口 # 获取 Minikube 节点的 IP minikube ip # 在浏览器中访问http://minikube-ip:node-port你应该能看到和之前 Docker 运行时一样的页面。通过kubectl get pods可以看到两个 Pod 正在运行。6. Jenkins 安装与 CI/CD 流水线配置Jenkins 是整个自动化流程的“大脑”。我们将它安装在 Docker 中并配置一个 Pipeline 任务实现代码提交 - 自动构建镜像 - 更新 K8S 部署。6.1 使用 Docker 运行 Jenkins# 创建 Jenkins 数据卷防止数据丢失 mkdir -p ~/jenkins_home chmod 777 ~/jenkins_home # 注意权限问题生产环境需细化权限 # 运行 Jenkins 容器 docker run -d \ --name jenkins \ -p 8080:8080 \ -p 50000:50000 \ -v ~/jenkins_home:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/usr/bin/docker \ jenkins/jenkins:lts-jdk17-v /var/run/docker.sock:/var/run/docker.sock这是 Docker in Docker (DinD) 的一种简便方式让 Jenkins 容器能使用宿主机的 Docker 引擎。访问http://localhost:8080根据提示从容器日志 (docker logs jenkins) 中获取初始管理员密码完成安装。6.2 安装必要插件首次登录后在“系统管理” - “插件管理” - “可选插件”中搜索并安装以下关键插件Pipeline支持声明式流水线。Docker Pipeline在流水线中执行 Docker 命令。Kubernetes CLI在流水线中执行kubectl命令。Git从 Git 仓库拉取代码。6.3 配置 Jenkins 凭据与工具配置 Docker Hub 凭据如果你有公共/私有仓库在“凭据” - “系统” - “全局凭据”中添加用户名密码类型的凭据用于推送镜像。配置 kubeconfig为了让 Jenkins 能访问 Minikube 集群需要将宿主机的~/.kube/config文件内容复制到 Jenkins 的一个“Secret file”类型凭据中或在 Jenkins 容器内安装kubectl并配置。6.4 创建第一个 Pipeline 任务在 Jenkins 首页点击“新建任务”输入任务名如flask-app-pipeline选择“流水线”点击确定。在流水线配置页面的“Pipeline”区域选择“Pipeline script”并填入以下脚本pipeline { agent any // 使用任意可用的代理执行器 environment { // 定义环境变量 DOCKER_IMAGE ‘your-dockerhub-username/my-flask-app:${BUILD_NUMBER}‘ KUBE_CONFIG credentials(‘minikube-kubeconfig‘) // 引用凭据ID } stages { stage(‘Checkout‘) { steps { // 从 Git 仓库拉取代码此处需替换为你的仓库地址 git ‘https://github.com/your-username/my-flask-app.git‘ } } stage(‘Build Docker Image‘) { steps { script { // 使用宿主机 Docker 构建镜像 docker.build(DOCKER_IMAGE) } } } stage(‘Push to Registry‘) { steps { script { // 登录 Docker Hub 并推送镜像需配置凭据 docker.withRegistry(‘https://registry.hub.docker.com‘, ‘docker-hub-credential‘) { docker.image(DOCKER_IMAGE).push() } } } } stage(‘Deploy to K8S‘) { steps { script { // 将 kubeconfig 写入文件 writeFile file: ‘${WORKSPACE}/kubeconfig‘, text: KUBE_CONFIG // 使用 kubectl 设置上下文并更新部署的镜像 sh “““ kubectl --kubeconfig${WORKSPACE}/kubeconfig set image deployment/flask-app-deployment flask-app${DOCKER_IMAGE} --record ”““ } } } } post { always { // 清理工作空间 cleanWs() } } }点击保存。点击“立即构建”来触发流水线。在“阶段视图”中你可以实时看到每个步骤的执行状态和日志。7. 资源占用与性能观察在本地运行这一整套环境了解其资源消耗对于规划生产环境至关重要。Docker Daemon作为后台服务常驻内存约 200-500 MBCPU 占用很低。Minikube 集群启动一个单节点集群包含 API Server、etcd、Scheduler 等核心组件会占用约 2-3 GB 内存和 1-2 个 CPU 核心。使用minikube dashboard命令打开仪表板可以直观查看资源使用情况。Jenkins 容器Jenkins 本身Java 应用内存占用在 500 MB 到 1 GB 之间具体取决于安装的插件数量和并发任务数。可以通过docker stats jenkins命令监控。应用 Pod我们的 Flask 应用 Pod每个副本请求 64Mi 内存实际占用可能更低。使用kubectl top pods命令查看实际资源使用。磁盘空间Docker 镜像和容器、K8S 的 etcd 数据、Jenkins 的工作空间和构建历史会持续占用磁盘。定期清理无用镜像 (docker image prune) 和 Jenkins 旧构建记录是必要的。性能优化小贴士限制资源始终在 K8S 的 Deployment 中为容器设置resources.requests和resources.limits防止单个应用异常消耗所有资源。使用轻量级基础镜像如python:3.9-slim比python:3.9体积小很多。Alpine Linux 镜像更小但可能遇到兼容性问题。Jenkins 代理对于大型项目不要将所有构建任务都放在 Master 节点。可以配置 Kubernetes 插件让 Jenkins 在 K8S 集群中动态创建 Pod 作为构建代理任务完成后销毁节省资源。8. 常见问题与排查方法在实践过程中你几乎一定会遇到下面这些问题。这里提供快速的排查思路。问题现象可能原因排查方式解决方案docker run报错端口被占用主机端口已被其他进程使用。netstat -tulpngrep :8080(Linux) 或lsof -i :8080 (macOS)。Minikube 启动失败1. 虚拟化未开启。2. 驱动不匹配。3. 网络问题。1. 检查 BIOS 虚拟化设置。2. 查看minikube start --driverdocker的详细日志 (--alsologtostderr)。3. 检查防火墙或代理。1. 开启 BIOS 虚拟化。2. 尝试其他驱动如--driverhyperkit(macOS)。3. 配置正确的 HTTP/HTTPS 代理。kubectl get pods显示 ImagePullBackOff1. 镜像名称错误或不存在。2. 私有仓库无权限。kubectl describe pod pod-name查看 Events 详情。1. 检查 Deployment YAML 中的image字段。2. 为私有仓库创建imagePullSecrets。Jenkins Pipeline 中 Docker 命令失败Jenkins 容器内无法访问 Docker 守护进程。在 Pipeline 的sh步骤中运行docker version测试。确保启动 Jenkins 容器时正确挂载了 Docker Socket (-v /var/run/docker.sock:/var/run/docker.sock)。Jenkins 无法执行kubectlkubectl未安装或kubeconfig配置错误。在 Jenkins 的“脚本命令行”中尝试执行kubectl get nodes。1. 在 Jenkins 容器内安装kubectl。2. 确保提供的kubeconfig文件内容正确且上下文指向目标集群。Pipeline 推送镜像到 Docker Hub 失败认证失败。检查 Jenkins 中 Docker Hub 凭据的 ID 是否与 Pipeline 脚本中引用的docker-hub-credential一致。在 Jenkins 凭据管理页面检查或重新配置凭据。应用更新后浏览器访问仍是旧版本浏览器缓存或 K8S Service 负载均衡到旧 Pod。1. 使用浏览器无痕模式访问。2.kubectl get pods查看新 Pod 是否已就绪 (Running)。3.kubectl describe svc查看 Endpoints 是否指向新 Pod IP。1. 清理浏览器缓存。2. 等待 K8S 滚动更新完成。 Deployment 的strategy可控制更新速度。9. 最佳实践与进阶方向当你成功跑通整个流程后以下实践能让你的项目更健壮、更接近生产标准。基础设施即代码 (IaC)不要手动点击 Jenkins 界面创建任务。将 Jenkins Pipeline 脚本Jenkinsfile存放在项目代码库根目录在 Jenkins 中创建“流水线任务来自 SCM”的任务实现流水线配置的版本化管理。使用 Helm 管理 K8S 应用将 Deployment、Service、ConfigMap 等 YAML 文件打包成 Helm Chart。只需一个helm install命令即可部署整个应用并通过values.yaml轻松配置不同环境开发、测试、生产的参数。引入镜像仓库在生产中不应直接使用 Docker Hub 的公共仓库。搭建私有镜像仓库如 Harbor或使用云服务商提供的仓库并配置镜像扫描和安全策略。完善的监控与日志为 K8S 集群部署 Prometheus 和 Grafana 来监控资源指标和应用性能。使用 EFKElasticsearch, Fluentd, Kibana或 Loki 栈来集中收集和查询容器日志。GitOps 工作流考虑使用 Argo CD 或 Flux 等 GitOps 工具。将应用所需的 K8S 清单文件存储在 Git 仓库中Argo CD 会自动同步仓库与集群的状态实现声明式、自动化的持续部署。安全加固容器安全使用非 root 用户运行容器定期扫描镜像漏洞。K8S RBAC为 Jenkins 等服务账户配置最小必要权限而非使用cluster-admin。网络策略使用 Calico 等网络插件定义 Pod 间的网络隔离策略。这套从 Docker 到 K8S 再到 Jenkins CI/CD 的实战链路清晰地展示了一个现代化应用从代码到上线的核心自动化流程。最大的价值不在于一次性记住所有命令而在于理解了每个环节的职责和衔接方式。当你再次遇到“如何自动部署”这类问题时你的思路会非常清晰容器化 - 编排定义 - 自动化触发。最先应该验证的是 Docker 部分确保你能成功构建和运行一个自定义镜像。最容易踩的坑集中在网络和权限上比如 Jenkins 与 Docker/K8S 的通信问题。后续的进阶可以从优化 Pipeline 效率并行阶段、增加测试环节、集成代码质量扫描、实现蓝绿部署等方面深入。建议将本教程中的每个 YAML 文件和脚本都保存下来它们是你构建更复杂流水线的最佳起点。