【Kubernetes从入门到精通】第19篇:Volume——容器数据的“不动产“
上一篇【第18篇】Ingress Controller选型和实战——Nginx Ingress完全指南下一篇【第20篇】ConfigMap——配置管理的正确姿势摘要容器有一个健忘症——重启就失忆删了就彻底消失。你费劲写进去的日志没了、用户上传的图片蒸发了、数据库的数据全丢了……这谁受得了K8s的解决方案是Volume——它是在Pod级别定义的外接存储跟容器生命周期解耦容器挂了Volume里的数据还在新容器起来接着用。这篇文章从如果没有Volume会怎样讲起拆解K8s里最常用的几种Volume类型emptyDir、hostPath、nfs用表格帮你对比选型然后演示两个实战利器——subPath把单个文件挂进去而不是覆盖整个目录和ConfigMap/Secret的挂载。读完这篇你就知道数据放哪儿这个问题的答案了。一、为什么容器需要Volume——“鱼的记忆只有七秒”先感受一下容器失忆的痛【没有Volume——容器重启 数据丢失】 Pod启动 │ ▼ ┌─────────────────────────────────────┐ │ Container: nginx │ │ ─────────────────────────────── │ │ /var/log/nginx/access.log │ 用户请求写入的日志 │ /usr/share/nginx/html/index.html │ 网站文件 │ /tmp/uploaded/pic.jpg │ 用户上传的图片 │ │ │ 这些数据存在容器的文件系统里 │ │ 容器文件系统是临时的——跟鱼一样 │ └─────────────────────────────────────┘ │ │ Pod重启/容器崩溃 ▼ ┌─────────────────────────────────────┐ │ Container: nginx (新容器) │ │ ─────────────────────────────── │ │ /var/log/nginx/access.log → 空的 │ │ /usr/share/nginx/html/index.html → 没了│ │ /tmp/uploaded/pic.jpg → 消失了 │ │ │ │ 我的数据呢 │ └─────────────────────────────────────┘有了Volume之后【有Volume——数据存在外部跟容器生命周期解耦】 ┌─────────────────────────────────────┐ │ Volume │ │ ┌─────────────────────────────┐ │ │ │ 真实的数据存储位置 │ │ │ │ • Node本地磁盘emptyDir │ │ │ │ • Node指定路径hostPath │ │ │ │ • NFS远程存储 │ │ │ │ • 云盘AWS EBS/阿里云盘 │ │ │ │ │ │ │ │ Volume跟Pod同生命周期 │ │ │ │ Pod删了Volume才没 │ │ │ │ 容器重启数据完好 │ │ │ └──────────┬──────────────────┘ │ │ │ 挂载到容器 │ │ ▼ │ │ ┌─────────────────────────────┐ │ │ │ Container │ │ │ │ /var/log/nginx/ → Volume │ │ │ │ 容器以为自己写的是本地磁盘 │ │ │ │ 实际上写的都是Volume │ │ │ └─────────────────────────────┘ │ └─────────────────────────────────────┘要点Volume的生命周期跟Pod绑定不是跟容器绑定。容器重启、重建——只要Pod没删Volume就在。这跟你租房一个道理容器是租客来来去去Volume是房子一直在那儿。租客搬走了房子里的东西不会跟着消失。但房子拆了Pod删除Volume也就没了至少emptyDir是这样。Volume和容器文件系统的对比维度容器文件系统Volume生命周期跟容器绑定重启就没了跟Pod绑定Pod删除才释放容器间共享❌ 各容器独立文件系统✅ 同一Pod的容器可以共享持久化❌ 临时的取决于Volume类型hostPath/NFS可持久性能容器层写时复制性能差直接写底层存储性能好大小限制受镜像层限制取决于底层存储二、常用Volume类型——从临时到永久K8s支持几十种Volume类型但日常用的就那几种。按持久化程度从低到高排列【Volume 持久化排行榜】 持久化程度 ▲ │ ┌─────────────────────────┐ │ │ 云盘 (AWS EBS/PD/disk) │ ← 最高Pod删了数据还在还能漂移到别的Node │ ├─────────────────────────┤ │ │ NFS / CephFS │ ← 高网络存储多Pod共享 │ ├─────────────────────────┤ │ │ hostPath │ ← 中绑定Node磁盘Pod删了数据还在(Node上) │ ├─────────────────────────┤ │ │ emptyDir │ ← 低Pod删了就没但容器重启数据还在 │ └─────────────────────────┘ │ └────────────────────────────────────────────► 共享能力2.1 emptyDir——“Pod级别的临时便签”Pod启动时创建一个空目录Pod内所有容器都能用。Pod删除时目录内容清空。【emptyDir 典型使用场景】 ┌─────────────────────────────────────────────┐ │ Pod │ │ │ │ ┌───────────────┐ ┌──────────────────┐ │ │ │ nginx │ │ filebeat │ │ │ │ 写日志到 │ │ 读日志从 │ │ │ │ /var/log/ │ │ /logs/ │ │ │ └───────┬───────┘ └────────┬─────────┘ │ │ │ │ │ │ │ ┌──────────────┐ │ │ │ └─►│ emptyDir │◄──┘ │ │ │ (共享卷) │ │ │ └──────────────┘ │ │ │ │ 容器间共享文件、临时缓存、中间结果 │ └─────────────────────────────────────────────┘apiVersion:v1kind:Podmetadata:name:nginx-with-loggerspec:volumes:-name:shared-logsemptyDir:{}# 啥也不用配创建个空目录containers:-name:nginximage:nginx:1.25volumeMounts:-name:shared-logsmountPath:/var/log/nginx# nginx日志写到这里-name:log-readerimage:busyboxcommand:[tail,-f,/logs/access.log]volumeMounts:-name:shared-logsmountPath:/logs# 另一个容器从这里读readOnly:true# emptyDir 也可以用内存做存储tmpfs——极速但Pod一挂全没volumes:-name:ram-diskemptyDir:medium:Memory# 用内存读写极快sizeLimit:256Mi# 限制大小防止把Node内存吃光要点emptyDir是Pod级别的——Pod删了就没了。它的典型场景有三个(1) 容器间共享文件如日志代理收集业务日志(2) 临时计算中间结果(3) 用medium: Memory做超高速读写缓存。但千万别拿emptyDir存数据库——Pod一删库就跑了2.2 hostPath——“直连Node磁盘”把Node上的一个目录直接挂载到Pod里。Pod删除后Node上的数据还在。【hostPath——直接挂载Node目录】 Node-1 文件系统 ┌──────────────────────────────────────┐ │ /data/k8s/ │ │ ├── logs/ │ │ │ ├── app.log │ │ │ └── error.log │ │ └── config/ │ │ └── nginx.conf │ └──────────────┬───────────────────────┘ │ hostPath 挂载 ▼ ┌──────────────────────────────────────┐ │ Pod-1 │ │ /var/log/app → hostPath:/data/logs │ │ /etc/nginx → hostPath:/data/config│ └──────────────────────────────────────┘apiVersion:v1kind:Podmetadata:name:hostpath-demospec:volumes:-name:host-logshostPath:path:/data/k8s/logs# Node上的绝对路径type:DirectoryOrCreate# 目录不存在就创建-name:host-confighostPath:path:/etc/kubernetes/ssltype:Directory# 必须已存在containers:-name:appimage:myapp:latestvolumeMounts:-name:host-logsmountPath:/var/log/app-name:host-configmountPath:/etc/ssl/certsreadOnly:truehostPath的type参数很重要type值含义安全性空不检查啥都能挂⚠️ 最低DirectoryOrCreate目录存在就用不存在就创建较安全Directory目录必须已存在✅ 推荐FileOrCreate文件存在就用不存在就创建较少用File文件必须已存在较少用Socket必须是Unix Socket特殊场景要点hostPath是一把双刃剑——好用但危险。同一个hostPath可能被多个Pod同时写造成文件冲突。更严重的是如果Pod被调度到另一个Node上新Pod访问不到原来Node上的数据。hostPath只适合两类场景(1) DaemonSet如日志收集agent每个Node一个(2) 要访问Node系统文件的监控/管理工具。2.3 NFS——“网络共享硬盘”NFS卷让多个Pod跨Node共享同一个文件系统——这是hostPath做不到的。【NFS——多Node多Pod共享】 ┌──────────────────┐ │ NFS Server │ │ 192.168.1.100 │ │ /exports/data │ └────────┬─────────┘ │ 网络挂载 ┌─────┼─────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ Node-1 │ │ Node-2 │ │ Node-3 │ │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ │ │Pod-A │ │ │ │Pod-B │ │ │ │Pod-C │ │ │ │/data │ │ │ │/data │ │ │ │/data │ │ │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └─────────────┴─────────────┘ 都挂载同一个 NFS 目录 /data 里看到的是同一份数据apiVersion:v1kind:Podmetadata:name:nfs-demospec:volumes:-name:shared-datanfs:server:192.168.1.100# NFS服务器地址path:/exports/data# NFS导出路径readOnly:falsecontainers:-name:appimage:myapp:latestvolumeMounts:-name:shared-datamountPath:/data三种常用Volume快速对比类型持久性多Pod共享跨Node性能生产就绪emptyDirPod删了就没✅ 同Pod内共享❌ 绑定Node高本地磁盘/内存临时数据 ✅hostPathPod删了还在⚠️ 同Node可共享❌ 绑定Node高本地磁盘仅DaemonSet ✅NFS独立于Pod✅ 任意Pod✅ 跨Node中受网络影响✅ 但需维护NFS服务器三、Volume的挂载方式——两种模式3.1 普通挂载——整个目录# Volume挂到容器的/mnt/data目录# 容器里 /mnt/data 之前的内容会被Volume覆盖看不到原来的了volumes:-name:myvolemptyDir:{}containers:-name:appvolumeMounts:-name:myvolmountPath:/mnt/data# 挂到这个路径3.2 subPath——“只挂一个文件别把整个目录盖了”这是Volume使用中最容易误解也最实用的技巧。默认挂载会把目标目录整个替换成Volume内容但有时候你只想把一个文件比如配置文件塞进去apiVersion:v1kind:Podmetadata:name:subpath-demospec:volumes:-name:config-volumeconfigMap:name:app-config# ConfigMap里有 nginx.confcontainers:-name:nginximage:nginx:1.25volumeMounts:-name:config-volumemountPath:/etc/nginx/nginx.conf# ❌ 错误会把整个/etc/nginx/覆盖subPath:nginx.conf# ✅ 正确只替换nginx.conf这一个文件【subPath 的作用——挂单个文件 vs 覆盖整个目录】 没有 subPath默认行为 有 subPath ┌────────────────────────┐ ┌────────────────────────┐ │ 容器 /etc/nginx/ │ │ 容器 /etc/nginx/ │ │ ├── nginx.conf ← 覆盖 │ │ ├── nginx.conf ← 替换 │ │ ├── mime.types ← 没了│ │ ├── mime.types ✅ 还在 │ │ ├── modules/ ← 没了│ │ ├── modules/ ✅ 还在 │ │ └── conf.d/ ← 没了│ │ └── conf.d/ ✅ 还在 │ └────────────────────────┘ └────────────────────────┘ 整个目录被Volume内容替换掉了 只替换了nginx.conf一个文件 其他文件全丢失 其他文件完好无损要点subPath是精准替换——它把Volume里的一个文件/目录挂到容器的指定路径不影响该路径下的其他文件。这在配置注入场景是标配用法你只想替换nginx.conf不想把整个/etc/nginx/目录清空。四、挂载ConfigMap和Secret——配置文件注入Volume的一大用途是把ConfigMap和Secret挂载成文件——应用不用改代码直接读文件就行。apiVersion:v1kind:Podmetadata:name:configmap-volume-demospec:volumes:-name:app-configconfigMap:name:myapp-configitems:# 选择性挂载某些key-key:app.propertiespath:application.properties# key→文件名的映射-key:log4j.xmlpath:log4j2.xmldefaultMode:0644# 文件权限containers:-name:appimage:myapp:latestvolumeMounts:-name:app-configmountPath:/app/config# ConfigMap内容变成文件夹里的文件readOnly:true# 挂载后容器里看到的文件结构# /app/config/# ├── application.properties ← app.properties 的内容# └── log4j2.xml ← log4j.xml 的内容# 应用代码里直接读 /app/config/application.properties 即可Secret的挂载一模一样——把configMap换成secretvolumes:-name:tls-certssecret:secretName:tls-secretitems:-key:tls.crtpath:cert.pem-key:tls.keypath:key.pemdefaultMode:0600# 私钥权限必须是600containers:-name:appvolumeMounts:-name:tls-certsmountPath:/etc/ssl/certsreadOnly:true要点用Volume挂载ConfigMap/Secret有一个好处——热更新。ConfigMap/Secret内容改了之后kubelet会在一定时间内同步更新挂载的文件默认约60秒。而用环境变量注入的配置项则不会自动更新必须重启Pod。五、PV/PVC简介——“动态存储管理”前面讲的emptyDir和hostPath都有个致命问题Pod删了数据可能就没了emptyDir或者换Node了数据访问不到hostPath。生产环境需要的是Pod删了数据还在、Pod漂到哪都能访问的存储——这就是PersistentVolumePV和PersistentVolumeClaimPVC。【PV/PVC 概念——存储的预售模式】 K8s管理员 K8s用户你 ──────── ─────────── 创建 PV仓库里的存储单元 创建 PVC申请存储 ┌─────────────────┐ ┌─────────────────┐ │ PV-1: 100Gi │◄────────│ 我要10Gi存储 │ │ NFS:/exports/pv1 │ 绑定 │ PVC: myapp-data │ ├─────────────────┤ └─────────────────┘ │ PV-2: 50Gi │ │ │ AWS EBS: vol-xxx│ │ Pod引用PVC ├─────────────────┤ ▼ │ PV-3: 200Gi │ ┌─────────────────┐ │ Ceph RBD: img-1 │ │ Pod │ └─────────────────┘ │ volumes: │ │ - name: data │ PV 预先准备的存储资源 │ persistentVolumeClaim: PVC 用户的存储需求单 │ claimName: myapp-data └─────────────────┘PVC模式的优势在于关注点分离管理员管存储PV开发者只管用PVC双方不用互相了解对方的配置细节。要点本节只是PV/PVC的一个预告——Volume的本质是给Pod挂存储PV/PVC把这个概念提升到集群级别的存储抽象层。后续文章会有专门的PV/PVC深入篇包括StorageClass动态创建、访问模式RWO/ROX/RWX等。六、Volume的常用命令# 查看Pod的Volume挂载情况kubectl describe pod my-pod|grep-A20Volumes:kubectl describe pod my-pod|grep-A10Mounts:# 进入容器看挂载点kubectlexec-itmy-pod --df-hkubectlexec-itmy-pod --mount|grep/data# 在容器里写文件测试Volume是否工作kubectlexec-itmy-pod --touch/data/test.txt kubectlexec-itmy-pod-clog-reader --ls/logs# 另一个容器看共享Volume# 删除Pod看数据是否还在kubectl delete pod my-pod# 如果是emptyDir → 数据没了# 如果是hostPath → 数据在Node上# 如果是PV/PVC → 数据在存储后端本篇小结Volume让容器从临时工变成有产者核心价值容器文件系统是临时的Volume把数据放在容器外部——容器重启数据还在Pod删除才释放三种常用类型emptyDir临时共享Pod删除即清、hostPath绑定Node持久但绑定节点、NFS网络共享多Node可用subPath妙用精准替换单个文件而不是覆盖整个目录——配置文件注入标配ConfigMap/Secret挂载配置和密钥变成文件应用直接读支持热更新PV/PVC预告生产环境存储管理的基础PVC让你把存储当资源申请下一篇咱们聊ConfigMap——配置管理的正确打开方式。应用配置不再硬编码在镜像里支持热更新、多环境切换、版本管理。上一篇【第18篇】Ingress Controller选型和实战——Nginx Ingress完全指南下一篇【第20篇】ConfigMap——配置管理的正确姿势

相关新闻

MKS PDR-C-2C-BCD 电源模块

MKS PDR-C-2C-BCD 电源模块

MKS PDR-C-2C-BCD 电源模块简介MKS PDR-C-2C-BCD 是 MKS Instruments 推出的电源与数字读出模块,专为 MKS Baratron 电容压力计供电并读取压力信号而设计。产品特点(8条)半机架安装式电源与数字读出单元可为两个压力传感器提供 15 VDC 电源兼…

2026/8/6 8:32:01 阅读更多 →
Cocos Creator 新手入门:从零创建第一个游戏项目的完整指南

Cocos Creator 新手入门:从零创建第一个游戏项目的完整指南

1. 项目概述:从“Hello World”到你的第一个游戏世界很多刚接触 Cocos Creator 的朋友,在安装好编辑器后,面对那个简洁的 Dashboard(仪表盘)界面,常常会感到一丝迷茫:接下来该做什么&#xff1f…

2026/8/6 8:32:01 阅读更多 →
Ubuntu APT镜像源更换指南:原理、选型与实战优化

Ubuntu APT镜像源更换指南:原理、选型与实战优化

1. 项目概述:为什么更换APT镜像源是Ubuntu新手的必修课刚装好Ubuntu,满心欢喜地准备大展拳脚,结果第一条sudo apt update就卡在“0% [正在连接 cn.archive.ubuntu.com]”半天不动,或者速度慢得像在爬。这种体验,相信很…

2026/8/6 8:32:01 阅读更多 →

最新新闻

Spring Cloud Feign 文件下载踩坑记:远程方法返回void,Feign接口却能返回ResponseEntity?

Spring Cloud Feign 文件下载踩坑记:远程方法返回void,Feign接口却能返回ResponseEntity?

前言 在微服务架构中,使用 Feign 进行服务间调用是最常见的实践之一。但在文件下载场景中,你是否遇到过这样的困惑:远程服务的接口明明返回的是 void,为什么我的 Feign 接口可以声明为 ResponseEntity<byte[]>? 本文将通过一个真实的踩坑案例,深入剖析 Feign 的工…

2026/8/6 12:45:07 阅读更多 →
狼人杀咒狐角色深度解析:第三方阵营的生存策略与胜利之道

狼人杀咒狐角色深度解析:第三方阵营的生存策略与胜利之道

1. 项目概述&#xff1a;从“第三方”到“咒狐”的玩法革命 狼人杀这个游戏&#xff0c;核心魅力在于逻辑对抗与身份博弈。但玩久了&#xff0c;你会发现好人、狼人、神职的套路逐渐固化&#xff0c;预言家上警、狼人悍跳、女巫盲毒……流程化操作让游戏少了些惊喜。这时候&…

2026/8/6 12:45:07 阅读更多 →
语义分割与实例分割:从像素分类到目标分离的技术演进与实战指南

语义分割与实例分割:从像素分类到目标分离的技术演进与实战指南

1. 从像素分类到目标分离&#xff1a;分割技术的演进与核心价值 在计算机视觉的浩瀚世界里&#xff0c;我们最初教会计算机“看”到物体&#xff0c;比如在一张图片里框出一只猫&#xff08;目标检测&#xff09;。但这还不够&#xff0c;我们还想知道这只猫的每一个像素具体是…

2026/8/6 12:45:06 阅读更多 →
8月深度测评:2026年10款好用的ai写小说软件(附写小说软件实操避坑与去痕迹指南)

8月深度测评:2026年10款好用的ai写小说软件(附写小说软件实操避坑与去痕迹指南)

这两年AI工具井喷式发展&#xff0c;对于很多常年被“卡文”折磨的创作者来说&#xff0c;这绝对是个好消息。 为了给大家排雷&#xff0c;顺便整理一下我自己的工作流&#xff0c;我真把市面上主流的文本处理和创作工具挨个试了个遍。下面把筛选出来的10款好用的写小说软件按…

2026/8/6 12:45:06 阅读更多 →
KMS智能激活脚本终极指南:5分钟永久激活Windows与Office

KMS智能激活脚本终极指南:5分钟永久激活Windows与Office

KMS智能激活脚本终极指南&#xff1a;5分钟永久激活Windows与Office 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统弹出激活提示而烦恼吗&#xff1f;Office突然变成只读模式…

2026/8/6 12:45:06 阅读更多 →
Linux进程监控工具ps/top/htop实战指南

Linux进程监控工具ps/top/htop实战指南

1. Linux进程监控的核心价值在Linux系统管理中&#xff0c;进程监控就像汽车仪表盘对于驾驶员的意义。当我在生产环境第一次遇到服务异常时&#xff0c;通过实时查看进程状态快速定位到某个Java进程内存泄漏的场景&#xff0c;让我深刻体会到这项技能的重要性。现代Linux系统通…

2026/8/6 12:44:06 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述&#xff1a;为什么我们需要深入LimboAI的C内核&#xff1f;如果你是一名使用Godot引擎的游戏开发者&#xff0c;尤其是对AI行为逻辑有较高要求的项目&#xff0c;那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好&#xff0c;我是老张&#xff0c;一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架&#xff0c;处理了角色移动和碰撞&#xff0c;这一期&#xff0c;我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延&#xff0c;无需电控启动&#xff0c;是建筑被动消防系统核心构件&#xff0c;行业依托新规管控、城市更新、工业安全升级迎来稳定扩容&#xff0c;整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流&#xff1a;一个核心问题的诞生想象一下&#xff0c;你是一个城市供水系统的总工程师。你的城市有多个水源&#xff08;水库&#xff09;&#xff0c;需要通过一个复杂的地下管道网络&#xff0c;将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起&#xff1a;为什么我们需要互相关几年前&#xff0c;我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号&#xff0c;理论上它们接收到的声音波形应该非常相似&#xff0c;只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →