当前位置: 首页 > article >正文

从课后题到实战:手把手教你用Docker和Kubernetes搭建自己的第一个私有云环境

从课后题到实战手把手教你用Docker和Kubernetes搭建自己的第一个私有云环境当你在ICT课程中第一次听到云计算这个词时脑海中浮现的可能是那些漂浮在天空中的服务器集群或者是某个遥远数据中心里闪烁的机器。但云计算的核心概念其实很简单——它就像电力一样是一种按需使用的计算资源服务。而今天我们要把这个抽象的概念变成你电脑上可以触摸的现实。想象一下你刚学完云计算的理论课程课本上满是选择题和填空题云计算的特点是什么、IaaS和PaaS的区别在哪里。这些知识很重要但纸上得来终觉浅。真正的理解来自于实践——就像学游泳不能只在岸上比划动作一样。这就是为什么我们要从课后题走向实战用Docker和Kubernetes搭建一个属于你自己的迷你私有云。1. 环境准备从零开始的云基石在开始我们的云之旅前我们需要准备一些基础工具。不同于企业级云平台动辄需要数十台服务器我们的迷你云环境只需要一台配置尚可的笔记本电脑或台式机。我推荐使用Linux系统如Ubuntu 20.04 LTS因为它在云计算领域有着最广泛的支持。首先让我们安装Docker——这是构建我们云环境的基石。Docker就像是一个神奇的集装箱系统它能把应用程序和它们所需的一切打包在一起确保在任何地方都能以相同的方式运行。# 更新软件包索引 sudo apt-get update # 安装必要的依赖包 sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo \ deb [archamd64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 验证Docker是否安装成功 sudo docker run hello-world如果一切顺利你会看到一条欢迎信息证明Docker已经准备就绪。接下来我们需要安装Kubernetes简称K8s——这是我们的云操作系统负责管理和编排所有的Docker容器。对于本地开发环境Minikube是最佳选择。它能在你的电脑上创建一个单节点的Kubernetes集群完美满足学习和测试需求# 安装kubectlKubernetes命令行工具 sudo apt-get install -y kubectl # 下载并安装Minikube curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube # 启动Minikube集群 minikube start --driverdocker # 验证集群状态 kubectl get nodes现在你已经拥有了一个功能完整的单节点Kubernetes集群虽然它看起来很简单但这个小小的集群包含了云计算的所有核心概念和组件。2. 容器化你的第一个应用从理论到实践还记得那些关于容器技术的选择题吗容器与传统虚拟机的区别是什么现在让我们通过实际操作来真正理解这些概念。我们将从一个简单的Python Flask应用开始。创建一个名为app.py的文件from flask import Flask app Flask(__name__) app.route(/) def hello_world(): return Hello, Cloud! if __name__ __main__: app.run(host0.0.0.0, port5000)这个应用非常简单——它只是在访问根路径时返回Hello, Cloud!。但重点不在于应用的复杂性而在于如何将它容器化。接下来创建一个Dockerfile注意没有文件扩展名# 使用官方Python运行时作为基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 将当前目录内容复制到容器的/app目录下 COPY . /app # 安装所需的包 RUN pip install flask # 暴露端口5000 EXPOSE 5000 # 定义环境变量 ENV NAME World # 容器启动时运行app.py CMD [python, app.py]现在我们可以构建并运行这个容器# 构建Docker镜像 docker build -t cloud-app . # 运行容器 docker run -p 5000:5000 cloud-app打开浏览器访问http://localhost:5000你会看到Hello, Cloud!的消息。恭喜你已经成功容器化了你的第一个应用。让我们深入理解一下这个过程镜像(Image): 就像是一个应用程序的模板包含了运行所需的一切容器(Container): 是镜像的运行实例轻量且隔离Dockerfile: 定义了如何构建镜像的步骤与传统的虚拟机相比容器有以下几个关键优势特性虚拟机容器启动时间分钟级秒级性能有额外开销接近原生磁盘占用GB级MB级隔离性强中等可移植性中等高通过这个简单的例子你应该能更直观地理解那些课本上的概念了。容器化是云计算的基础而Docker让它变得简单易用。3. Kubernetes编排你的迷你云操作系统现在我们有了容器化的应用但真正的云计算不仅仅是运行单个容器。我们需要一个系统来管理这些容器的生命周期、网络、存储等——这就是Kubernetes的作用。还记得那些关于云计算三层服务的填空题吗Kubernetes本质上是一个PaaS平台即服务系统它为我们提供了管理容器化应用所需的各种功能。让我们把之前的Flask应用部署到Kubernetes集群中。首先我们需要创建一个部署(Deployment)配置文件deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: cloud-app spec: replicas: 3 selector: matchLabels: app: cloud-app template: metadata: labels: app: cloud-app spec: containers: - name: cloud-app image: cloud-app ports: - containerPort: 5000这个配置文件告诉Kubernetes创建一个名为cloud-app的部署运行3个副本实例使用我们之前构建的cloud-app镜像暴露容器的5000端口应用这个配置kubectl apply -f deployment.yaml现在Kubernetes会确保始终有3个我们的应用实例在运行。如果其中一个崩溃了Kubernetes会自动创建一个新的来替代它。这就是云计算中高可用性的体现。但是我们如何访问这些实例呢在Kubernetes中我们使用Service来暴露应用。创建service.yamlapiVersion: v1 kind: Service metadata: name: cloud-app-service spec: selector: app: cloud-app ports: - protocol: TCP port: 80 targetPort: 5000 type: LoadBalancer应用这个Servicekubectl apply -f service.yaml在Minikube环境中我们可以使用以下命令获取访问URLminikube service cloud-app-service --url这个URL会指向我们的应用Kubernetes会自动在3个实例之间进行负载均衡。你可以尝试刷新页面多次虽然看起来没什么变化但实际上请求可能被分发到了不同的实例上。让我们看看Kubernetes中的一些核心概念如何对应到云计算理论中Pod: 最小的部署单元可以包含一个或多个容器Deployment: 定义应用的期望状态Kubernetes会确保实际状态与之匹配Service: 提供稳定的访问入口实现服务发现和负载均衡ReplicaSet: 确保指定数量的Pod副本始终运行这些组件共同构成了一个弹性、可扩展的系统——这正是云计算的核心特征。通过这个简单的例子你已经实现了一个迷你版的PaaS平台4. 进阶配置完善你的私有云环境现在我们已经有了一个基本的云环境但它还缺少一些关键功能。让我们来添加存储和网络配置使它更接近真实的云平台。4.1 持久化存储在云计算中存储是一个关键组件。Kubernetes提供了PersistentVolumePV和PersistentVolumeClaimPVC来管理存储资源。让我们为我们的应用添加一个简单的计数器功能并将计数存储在持久化卷中。首先修改app.pyfrom flask import Flask import os app Flask(__name__) # 计数器文件路径 COUNTER_FILE /data/counter.txt app.route(/) def hello_world(): # 读取或初始化计数器 try: with open(COUNTER_FILE, r) as f: count int(f.read()) except (FileNotFoundError, ValueError): count 0 # 增加计数器 count 1 # 保存计数器 with open(COUNTER_FILE, w) as f: f.write(str(count)) return fHello, Cloud! Visitor number: {count} if __name__ __main__: # 确保/data目录存在 os.makedirs(/data, exist_okTrue) app.run(host0.0.0.0, port5000)更新Docker镜像docker build -t cloud-app .创建持久化存储配置storage.yamlapiVersion: v1 kind: PersistentVolume metadata: name: cloud-app-pv spec: storageClassName: manual capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: /mnt/data --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cloud-app-pvc spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 1Gi更新deployment.yaml以使用持久化存储apiVersion: apps/v1 kind: Deployment metadata: name: cloud-app spec: replicas: 3 selector: matchLabels: app: cloud-app template: metadata: labels: app: cloud-app spec: containers: - name: cloud-app image: cloud-app ports: - containerPort: 5000 volumeMounts: - name: storage mountPath: /data volumes: - name: storage persistentVolumeClaim: claimName: cloud-app-pvc应用这些更改kubectl apply -f storage.yaml kubectl apply -f deployment.yaml现在我们的应用有了持久化存储即使Pod重启或重新创建计数器也会保持不变。这演示了云计算中持久化存储的概念。4.2 网络策略在云计算环境中网络安全至关重要。Kubernetes提供了NetworkPolicy资源来控制Pod之间的网络流量。让我们创建一个简单的网络策略限制只有特定标签的Pod可以访问我们的应用。创建network-policy.yamlapiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: cloud-app-policy spec: podSelector: matchLabels: app: cloud-app ingress: - from: - podSelector: matchLabels: role: frontend这个策略规定只有带有role: frontend标签的Pod可以访问app: cloud-app的Pod其他所有流量都会被拒绝应用这个策略kubectl apply -f network-policy.yaml虽然在这个简单的例子中我们看不到明显的效果但在生产环境中这种细粒度的网络控制是确保云安全的关键。4.3 自动扩展云计算的另一个关键特性是弹性伸缩。Kubernetes提供了Horizontal Pod AutoscalerHPA来自动调整Pod数量基于CPU使用率或其他指标。首先我们需要安装Metrics Server来收集资源使用情况minikube addons enable metrics-server然后创建HPA配置kubectl autoscale deployment cloud-app --cpu-percent50 --min1 --max5这个命令告诉Kubernetes根据CPU使用率自动调整Pod数量目标CPU使用率为50%最少1个Pod最多5个Pod虽然我们的简单应用不会产生足够的负载来触发自动扩展但这个配置展示了云计算中快速弹性伸缩的概念。5. 从迷你云到真实世界的映射现在你已经拥有了一个功能完整的迷你私有云环境。让我们回顾一下这个环境如何对应到真实的云计算概念和架构IaaS层由Minikube创建的虚拟机或你的物理机器提供基础计算资源PaaS层Kubernetes平台提供了应用运行所需的各种服务SaaS层我们部署的Flask应用就是一个简单的软件服务这种分层架构正是现代云计算平台的核心设计。通过这个实践项目你应该能够更清晰地理解那些课本上的抽象概念资源池化Kubernetes将底层的计算资源抽象为可统一管理的池按需自助服务通过kubectl命令你可以随时部署和管理应用快速弹性伸缩HPA可以根据负载自动调整资源可计量服务Metrics Server提供了资源使用情况的监控更重要的是你现在拥有的不仅是一堆理论知识而是一个可以继续扩展和实验的真实系统。你可以尝试部署更复杂的多服务应用实验不同的存储后端配置更精细的网络策略探索Kubernetes的其他功能如StatefulSets、DaemonSets等云计算的世界远比我们在这个简单项目中展示的要广阔得多但这个实践为你打开了一扇门——从枯燥的理论走向激动人心的实践。当你在面试或工作中被问到云计算相关问题时你不再只能背诵课本定义而可以自信地说让我给你看看我在自己搭建的云环境中的实践经验...

相关文章:

从课后题到实战:手把手教你用Docker和Kubernetes搭建自己的第一个私有云环境

从课后题到实战:手把手教你用Docker和Kubernetes搭建自己的第一个私有云环境 当你在ICT课程中第一次听到"云计算"这个词时,脑海中浮现的可能是那些漂浮在天空中的服务器集群,或者是某个遥远数据中心里闪烁的机器。但云计算的核心概…...

TDD + DDD 双剑合璧:我是如何用测试驱动出清晰领域模型的

TDD DDD 双剑合璧:我是如何用测试驱动出清晰领域模型的 当业务需求像一团迷雾般模糊不清时,我们往往陷入两难:要么过早陷入技术实现细节,导致模型偏离业务本质;要么在抽象讨论中原地打转,迟迟无法产出可验…...

5.3小记1

现在已经爬取了猫途鹰上九寨沟风景区和澳门所有评论数量大于两百的景点的评论了,筛选条件是总评论数量大于两百,爬取数据是中文简体内容,所以数量实际并不多。而且九寨沟景区的景点并不仅仅有九寨沟风景区,这只是一个总的&#xf…...

[特殊字符]️ 从零到一:手把手教你用 re.findall() 打造智能爬虫(2026最新实战)

目录 一、前言:为什么 2026 年我还要写一篇关于 re.findall() 的爬虫文章? 二、 re.findall() 到底是什么? 2.1 一句话解释 2.2 re.findall() 三大返回值陷阱(90% 的新手都踩过) 陷阱一:有分组时,返回元组列表 陷阱二:嵌套分组,只捕获最内层 陷阱三:(?...) 非…...

DLSS Swapper终极指南:3步完成游戏性能优化,告别手动替换烦恼

DLSS Swapper终极指南:3步完成游戏性能优化,告别手动替换烦恼 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾在《赛博朋克2077》中为了提升几帧而翻遍游戏目录?是否在《控制…...

【RT-DETR涨点改进】TGRS 2026 |独家创新首发、下采样涨点改进篇| 引入MWHL最大池化-小波下采样,同时融合最大池化与小波变换的优势,助力红外小目标检测,遥感目标检测有效涨点

一、本文介绍 🔥本文给大家介绍使用 MWHL最大池化-小波下采样 改进RT-DETR网络模型,在下采样阶段同时融合最大池化与小波变换的优势,在保留强响应语义信息的同时有效维持特征的结构细节,从而缓解传统下采样过程中小目标特征易丢失的问题。该模块通过频域与空间域信息的协…...

多核处理器内存分区技术解析与工程实践

1. 多核处理器系统分区的核心挑战与设计哲学在嵌入式系统领域,我们正面临一个有趣的矛盾:一方面,现代设备的功能复杂度呈指数级增长,导致单个子系统规模不断扩大;另一方面,这些子系统又需要更紧密的集成协作…...

通过Python快速编写第一个调用Taotoken多模型聊天补全的程序

通过Python快速编写第一个调用Taotoken多模型聊天补全的程序 1. 准备工作 在开始编写Python程序调用Taotoken多模型聊天补全之前,需要确保已经完成以下准备工作。首先需要注册Taotoken账号并获取API Key。登录Taotoken控制台后,可以在API Key管理页面创…...

【RT-DETR涨点改进】TGRS 2026 |独家创新首发、特征融合改进篇| 引入HEWL小波特征融合模块,通道-空间-频域交互联合高频增强,助力红外小目标检测,多模态目标检测有效涨点

一、本文介绍 🔥本文给大家介绍使用 HEWL小波特征融合模块 改进RT-DETR网络模型,作用在于在特征融合与上采样阶段引入频域高频信息指导特征重建,使模型在检测过程中不仅关注语义信息,还能够有效保留目标的边缘与细节结构,从而提升对小目标和弱目标的表达能力。通过小波分…...

Cursor规则集:用AI代码助手实现团队编码规范自动化

1. 项目概述:当你的代码编辑器开始“思考”如果你是一名开发者,最近可能频繁听到一个词:Cursor。它不再仅仅是一个光标,而是一款正在悄然改变许多程序员工作流的AI代码编辑器。而今天要聊的,不是Cursor本身&#xff0c…...

基于强化学习的层次化知识检索系统设计与优化

1. 项目背景与核心挑战 大型语言模型(LLM)在知识检索任务中常面临层次化数据结构处理的困境。传统检索方式依赖静态索引和固定匹配模式,难以适应知识图谱、文档树等嵌套层级场景。我在实际项目中发现,当用户查询涉及"计算机科…...

XIAO双通道Wi-Fi电能表:家庭能源监控利器

1. 项目概述:XIAO双通道Wi-Fi交流电能表最近在折腾家庭能源监控系统时,发现Seeed Studio新推出的XIAO双通道Wi-Fi交流电能表是个很有意思的设备。这款基于ESP32-C6模组的电能表配备了两个100A电流互感器(CT钳),可以直接接入Home Assistant实现…...

稀疏计算优化LLM预训练:原理、技术与硬件加速

1. 稀疏计算在LLM预训练中的核心价值大型语言模型(LLM)预训练的计算瓶颈主要来自矩阵乘法运算。在Transformer架构中,前馈网络(FFN)模块占据了大部分计算量——随着模型规模增大,FFN的计算占比可高达总预训练浮点运算的50%以上。传统密集矩阵乘法需要处理…...

Agent 一接骨架屏页面就开始误判完成态:从 Readiness Signal 到 DOM Stabilization 的工程实战

浏览器 Agent 一进企业后台,最容易踩的坑往往不是页面太慢,而是页面看起来已经“加载好了”,实际仍停留在骨架屏、占位卡片和半成品 DOM。⚠️ 人类会等列表真实出现再点,Agent 如果只看到按钮可见、节点已挂载,就可能…...

A11y Bridge:为AI Agent实现毫秒级Android自动化交互

1. 项目概述:为AI Agent赋予“实时视觉”与“触手”在移动应用自动化测试和AI智能体交互领域,我们常常面临一个核心瓶颈:如何让运行在电脑上的程序“看见”并“操作”手机屏幕?传统的方法,无论是基于adb shell screenc…...

Flutter 跨平台实战:OpenHarmony 健康管理应用 Day3|页面路由跳转与多表单联动实现

🎯 Flutter 跨平台实战:OpenHarmony 健康管理应用 Day3|页面路由跳转与多表单联动实现 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 🚀 前言 大家好!本篇是我真实完成 Flutte…...

Agent 一接富文本编辑器就开始改错块:从 Selection Grounding 到 Undo Fence 的工程实战

很多团队以为 Agent 接上富文本编辑器后,剩下只是“把字打进去”。真到生产环境,事故常出在另一层:模型知道要改哪一句,人却只看到整篇文档被误覆盖。最常见的现象不是不会写,而是改错块、删错段、撤销失控。这类问题一…...

Agent 一接浏览器本地存储就开始串租户:从 Storage Namespace 到 Session Snapshot 的工程实战

很多浏览器 Agent 在演示环境里很稳,一进多租户后台就开始出现“登的是 B 账号,提交的却是 A 组织草稿”的事故。⚠️ 问题不在 DOM 识别,而在浏览器本地状态没跟任务边界一起清空。Cookie 已刷新,页面却仍会从旧的 localStorage、…...

2026年企业网站建设趋势:为什么说“移动优先”不再是可选项而是必选项?

2026年企业网站建设趋势:为什么说“移动优先”不再是可选项而是必选项?如果你今天还在问“我的网站需要适配手机吗”,你可能已经错过了两年的窗口期。2026年,超过65%的网站流量来自移动设备。谷歌早已全面采用移动优先索引——这意…...

如何在Windows上快速安装安卓应用:APK Installer完整免费指南

如何在Windows上快速安装安卓应用:APK Installer完整免费指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松运行安卓应用&#xff…...

5个理由告诉你为什么LyricsX是macOS上最智能的歌词伴侣

5个理由告诉你为什么LyricsX是macOS上最智能的歌词伴侣 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX 还在为找不到合适的歌词软件而烦恼吗?LyricsX作为一款专为macOS设计的…...

git worktree

文章目录1.简介2.格式3.常用选项4.示例4.1 为现有分支创建 worktree4.2 创建新分支并同时创建 worktree4.3 查看所有 worktree4.4 移除不再需要的 worktree4.5 锁定 worktree(防止在 prune 时被清除)4.6 清理已删除的 worktree 引用5.小结参考文献1.简介…...

做端侧 AI 应用,绝不等于强行跑大模型

【端侧 AI 实践】如何在 20MB 包体积限制下,实现小程序的"实时"AR 视觉与 VLM 场景理解? 在构建基于 AI 的摄影辅助小程序时,我们面临了一个非常经典且棘手的端侧 AI 架构矛盾。 理想情况下,我们希望通过视觉大模型&…...

终极指南:如何快速下载GitHub中的单个文件和目录?

终极指南:如何快速下载GitHub中的单个文件和目录? 【免费下载链接】DownGit Create GitHub Resource Download Link 项目地址: https://gitcode.com/gh_mirrors/do/DownGit 你是否经常遇到这样的情况?在GitHub上发现了一个很棒的开源项…...

解决ArduinoIDE2.2.X以上版本不能使用ESP8266-littlefs问题

参考该篇方案 GitHub - earlephilhower/arduino-littlefs-upload: Build and uploads LittleFS filesystems for the Arduino-Pico RP2040, RP2350, ESP8266, and ESP32 cores under Arduino IDE 2.2.1 or higher GitHub #videoTogetherLoading {touch-action: none;height: …...

OpenClaw授权防火墙:从原理到实践,构建Web3代币授权主动防御体系

1. 项目概述与核心价值最近在开源社区里,一个名为openclawunboxed/openclaw-approval-firewall的项目引起了我的注意。乍一看这个标题,它融合了“OpenClaw”、“Approval”和“Firewall”三个关键词,对于熟悉区块链和智能合约安全领域的朋友来…...

GraphRAG与Dify集成实战:构建基于知识图谱的智能问答应用

1. 项目概述:当知识图谱遇上智能体,GraphRAG与Dify的化学反应最近在折腾一个挺有意思的开源项目,叫brightwang/graphrag-dify。如果你同时关注知识图谱(GraphRAG)和AI应用开发平台(Dify)这两个领…...

Cursor Free VIP终极指南:如何永久免费使用AI编程助手的完整教程

Cursor Free VIP终极指南:如何永久免费使用AI编程助手的完整教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reache…...

Claude Code 浏览器自动化插件 Browserbase Skills 完整上手指南。

最近有个问题一直在我脑子里转:AI 编程助手写代码够厉害,但到了"打开网页、点按钮、填表单"这种活,它反而束手无策。Claude Code 能帮你生成一整个项目,却不能帮你自动登进去测一下效果。多多少少感觉是有点讽刺。直到我…...

linux反代

一ddnsgo泛域名解析二...