> 技术文档 > 从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路


本篇摘要

本文围绕虚拟化与容器化技术展开,涵盖架构演进、Docker/K8S优势与挑战、namespace隔离实操(如主机名/PID隔离)、磁盘操作(dd/mkfs/df/mount)等,对比虚拟机与容器差异,阐明技术原理与架构选择逻辑,强调资源隔离与弹性伸缩的核心价值。

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

欢迎拜访: 点击进入博主主页

本篇主题: Docker演进+namespace操作详解

制作日期: 2025.08.22

隶属专栏: 点击进入所属Docker专栏

一.技术架构

由于这里过多与对redis之前的演进相似就不重复了如,见 点击速看架构演进,只不过这里多了个容器编排架构。

容器编排架构:

问题背景

  • 业务增长带来系统资源利用率不高的问题,大量资源用于应对短时高并发,平时闲置,需动态扩缩容但难以直接下线服务器。

  • 开发、测试、生产每套环境都需隔离,导致运维工作量大。

  • ​​部署与配置复杂且易错​​:微服务拆分细,导致部署工作量大,配置复杂,容易出错。

  • ​​扩缩容麻烦且易错​​:微服务数量多,扩缩容操作麻烦且容易出错,每次操作后可能需要重新配置环境参数。

  • ​​环境冲突与资源消耗​​:微服务间运行环境可能冲突,需要更多资源或修改配置来解决。

容器化技术及工具

  • 目前最流行的容器化技术是Docker,最流行的容器管理服务是Kubernetes(K8S)。
  • 应用/服务可打包为Docker镜像,通过K8S动态分发和部署镜像。
  • Docker镜像可理解为能运行应用/服务的最小操作系统,包含运行代码及设置好的运行环境。打包成镜像后可分发到相关机器,直接启动镜像即可运行服务,简化部署和运维。

K8S集群情况

  • 通常设有生产和研发K8S集群,一般不共用。
  • 研发集群通过命名空间完成应用隔离。
  • 不同公司划分集群方式不同,有的按研发目的分为研发和测试集群,有的按组织架构实现部门间资源复用 。

通过docker技术,直接降低了对应运维人员的苦恼,但是也增加了对应服务器的负担,于是就引入了云服务器购买等方案。

一张图形象理解docker技术:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

如果我们把docker技术添加过去,发现它就就成了这样:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

对应操作流程:
从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 发现和之前的微服务相比没多大变化,其实真正变化在的就是降低了运维难度,对环境的部署,复用,转移变得轻松了,但是需要的知识储备量就高了。

对应优缺点:

1.​​优点​​

  • ​​部署运维高效​​:部署、运维简单快速,一条命令可完成大量服务的部署或扩缩容。

  • ​​隔离性好​​:容器间文件系统、网络等互相隔离,避免环境冲突。

  • ​​支持滚动更新​​:版本切换可通过命令轻松完成升级或回滚。

2.​​缺点​​

  • 技术门槛高​​:技术栈多样,对研发团队要求较高。

  • ​​资源与成本问题​​:机器仍需公司自行管理,非高峰期也需预留大量机器资源应对高峰,导致机器成本和运维成本高,资源利用率低。(解决方案:可考虑使用云厂商服务器)

因此可以的出对应的技术构架演进图(由服务器到云服务器):

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

对应这些可能会有些疑问:

1. 如何决策要不要演进?

  • 业务需求:业务增长快、模式变化大时需演进架构。
  • 技术瓶颈:现有系统性能差、技术债务高时考虑演进。
  • 团队能力:团队有技术储备且能提升效率时可推进演进。

2. 架构必须这么演进么?

  • 非唯一解:有多种演进方案可选,非固定模式。
  • 成本考量:若优化成本低,可暂不大规模演进。
  • 创新可能:可探索新思路,不局限传统方向。

3. 架构必须是这么几个么?

  • 业务适配:不同业务需定制架构,无固定模式。
  • 技术多元:新兴技术带来更多架构选择。
  • 灵活组合:可创新组合多种技术形成独特架构。

4. Docker 的核心作用?

  • 环境一致:打包应用及依赖,保证多环境运行一致。
  • 资源隔离:容器独立运行,避免相互干扰。
  • 快速部署:提升应用部署和迁移效率。

虚拟化+容器化

  1. 物理机:实际的服务器或计算机,为虚拟机提供硬件环境,也叫“寄主”或“宿主”。
  2. 虚拟化:利用虚拟化技术把一台计算机虚拟为多台逻辑计算机,这些逻辑计算机可运行不同操作系统,应用程序在独立空间运行互不影响,提升工作效率。
  3. 容器化
    • 属于虚拟化技术,即操作系统层虚拟化。
    • 将操作系统内核虚拟化,把用户空间软件实例分割成多个独立单元在内核中运行。
    • 这些软件实例就是容器,对使用者而言像专用服务器程序。
    • 容器技术是虚拟化的一种,Docker是现今容器技术的事实标准。

如图:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 容器A与B内部看不到,但是又共用同一个操纵系统的内核。

那么为什么要进行容器化与虚拟化:

  • 让利用唯一资源完成更多任务。
  • 通过类似docker技术打包容器化,保证不会出现机器变化等导致的问题出现异常。
  • 弹性资源伸缩:可以随时操作简单的增多与减少。
  • 差异化环境提供:即随时轻松切换环境(如ubuntu centos)
  • docker容器化后启动极快,无需虚拟内核。
  • 沙箱安全:每个容器自己在自己的范围操作,不会影响外部。
  • 易拓展:拓展镜像,拓展功能非常轻松。

虚拟机与容器

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  1. 虚拟机(Virtual Machine, VM)

    • 层级:硬件层与操作系统层之间。
    • 原理:模拟完整硬件接口,运行独立操作系统(如Windows上运行Android系统)。
    • 特点:功能完整但资源占用高,适合跨平台环境隔离。
  2. 容器(Container)

    • 层级:操作系统层与函数库层之间。
    • 原理:模拟操作系统接口(如Docker利用Namespace/Cgroup),隔离应用及依赖。
    • 特点:轻量(共享宿主机内核)、启动快、资源占用少,属应用级虚拟化。

如何实现?

虚拟机:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  1. Type 1 Hypervisor(裸机虚拟化)

    • 架构:直接运行在物理硬件(HARDWARE)上,无宿主操作系统。
    • 特点:高性能、低延迟,直接管理硬件资源。
    • 典型代表:Xen、VMware ESXi。
  2. Type 2 Hypervisor(托管虚拟化)

    • 架构:运行在宿主操作系统(HOST OS)之上,依赖宿主OS管理硬件。
    • 特点:部署灵活,但性能略低(需经过宿主OS层)。
    • 典型代表:VirtualBox、VMware Workstation。
  3. 核心区别

    • Type 1:硬件→Hypervisor→Guest OS(高效,适合企业级)。
    • Type 2:硬件→Host OS→Hypervisor→Guest OS(易用,适合开发/测试)。

容器化:

  • 容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行各程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。

二.空间命名隔离(namespace)

dd命令

  • 全称:Data Description 。
  • 作用:是一个在 Unix 和类 Unix 系统(如 Linux)上用于复制和转换文件的命令。它可以对磁盘、分区等进行低级别的操作,比如制作磁盘镜像、从镜像恢复数据、创建空文件等。例如,使用 dd if=/dev/zero of=test.img bs=1M count=100 可以创建一个大小为100MB的全零文件 test.img ,这里 if 表示输入文件(/dev/zero 是一个特殊的设备文件,会不断输出空),of 表示输出文件,bs 指定块大小,count 指定块的数量。

如下:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 无法查看以为全0,不可打印,故出现卡死假象。

dd 命令核心参数速查表

类别 参数 作用 示例 基础操作 if=file 输入文件(默认标准输入) if=/dev/zero of=file 输出文件(默认标准输出) of=test.img bs=size 块大小(输入/输出统一,如 1Mbs=1M count=n 复制 n 个块 count=100 skip=n 跳过输入文件前 nskip=5(跳过前 5MB) seek=n 跳过输出文件前 nseek=5(跳过输出前 5MB) 转换选项 conv=ascii 转换 EBCDIC → ASCII conv=ascii conv=ebcdic 转换 ASCII → EBCDIC conv=ebcdic conv=lcase 小写转大写 conv=lcase conv=ucase 大写转小写 conv=ucase conv=swab 交换每对字节(AB→BA) conv=swab conv=noerror 出错时继续执行 conv=noerror conv=sync 出错时用零填充对齐块 conv=sync 状态控制 status=none 隐藏所有输出(静默模式) status=none status=progress 显示实时进度(需新版 ddstatus=progress

mkfs命令

  • 全称:Make File System 。
  • 作用:用于在指定设备(如硬盘分区)上创建文件系统。它是一个前端工具,会根据不同的参数调用具体的文件系统创建工具(如 mkfs.ext4 用于创建 ext4 文件系统,mkfs.xfs 用于创建 XFS 文件系统等)。例如,mkfs.ext4 /dev/sda1 会在 /dev/sda1 这个分区上创建 ext4 文件系统(可以理解成一个磁盘)

进行格式化(文件必须有大小可用dd命令):

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路
检查下:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

df命令

  • 全称:Disk Free 。
  • 作用:用于显示文件系统的磁盘空间使用情况,包括已用空间、可用空间、总空间以及挂载点等信息 。例如,执行 df -h-h 选项以人类可读的格式显示容量,如 KB、MB、GB 等)可以清晰地看到各个文件系统的磁盘空间使用概况。
    这张图片是关于 Shell 命令 df 的说明文档,主要内容如下:
1. 命令基本格式

df [OPTION]... [FILE]...

2. 常见参数
  • -a, --all:包含所有的具有 0 Blocks 的文件系统
  • -h, --human-readable:使用人类可读的格式(预设值是不加这个选项的…)
  • -H, --si:很像 -h,但是用 1000 为单位而不是用 1024
  • -t, --type=TYPE:限制列出文件系统的 TYPE
  • -T, --print-type:显示文件系统的形式

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

mount命令

  • 全称:Mount 。
  • 作用:用于将存储设备(如硬盘分区、光盘、U盘等)或文件系统挂载到 Linux 文件系统的目录树中的某个挂载点上,使得用户可以访问设备中的数据。例如,mount ./test.img 会将 ./test.img 这个 USB 设备分区挂载到 mounttest 目录下,之后就可以通过访问 mounttest 来读写该设备中的内容。
命令基本格式
  • mount [-l]
  • mount [-t vfstype] [-o options] device dir
常见参数说明
  1. -l:显示已加载的文件系统列表。
  2. -t:指定加载的文件系统类型(如ext3、ext4、iso9660、tmpfs、xfs等),多数情况下可不指定,mount会自动识别。
  3. -o options:用于描述设备或文件的挂接方式,常见选项有:
    • loop:将文件当作硬盘分区挂接。
    • ro:以只读方式挂接设备。
    • rw:以读写方式挂接设备。

此外,还对device(要挂接的设备)和dir(挂载点目录)进行了简要说明。

用法:

这里之前使用了mkfs命令把对应有内容大小的文件然后格式化成对应文件系统(磁盘),因为linux对应的磁盘需要挂载才能使用,不像windows自己回挂载:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

后面把它挂载到一个比如目录,接下就能访问这个目录实现对对应磁盘操作(进行挂载的磁盘或文件系统需要有大小)。

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

成功被挂载,然后进行使用:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

unshare命令

  • 全称:Unshare 。
  • 作用:用于创建新的命名空间(namespace),并使当前进程及其子进程脱离原来的命名空间相关资源。命名空间是 Linux 内核提供的一种隔离机制,可以隔离进程、网络、文件系统挂载等资源。比如,unshare --mount --map-root-user --pid --fork --mount-proc /bin/bash 可以创建一个新的挂载命名空间、新的 PID 命名空间等,并以根用户权限启动一个新的 bash shell 环境,在这个新环境中可以独立地进行文件系统挂载等操作,与原系统的资源相互隔离 。
核心功能

unshare 允许你在新的命名空间中运行程序,使得该程序在文件系统挂载、网络、进程 ID、主机名/域名、IPC(进程间通信)等层面与原系统环境“隔离”,常用于容器化、沙箱测试或资源隔离场景。

常用参数及功能
参数(短选项 + 长选项) 核心作用 -i, --ipc 启动新进程时,不与父进程共享 IPC 命名空间(即信号量、消息队列、共享内存等 IPC 资源相互隔离)。 -m, --mount 启动新进程时,不与父进程共享 Mount 命名空间(文件系统挂载点彼此独立,可挂载/卸载而不影响原系统)。 -n, --net 启动新进程时,不与父进程共享 Net 命名空间(网络设备、协议栈、端口等完全隔离,可配置独立网络环境)。 -p, --pid 启动新进程时,不与父进程共享 PID 命名空间(新进程在自己的 PID 空间里,能看到“从 1 开始”的进程树)。 -u, --uts 启动新进程时,不与父进程共享 UTS 命名空间(主机名、域名可独立设置,互不影响)。 -U, --user 启动新进程时,不与父进程共享 User 命名空间(用户/用户组 ID 可以重新映射,实现权限隔离)。 -V, --version 查看 unshare 命令自身的版本信息。 --forkunshare 先 fork 一个子进程,再在子进程里执行后续要运行的程序(常配合命名空间使用,规范进程层级)。 --mount-proc 在进入新 Mount 命名空间后,自动挂载 proc 文件系统(让新进程能看到“自己视角”的 /proc,方便调试与管理)。
主机名隔离:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

再开一台机器发现名字名字实现了隔离:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

基于pid的隔离测试:

直接隔离:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

因为新进程是重新创建的,和父进程无任何关系,自然不能干别的事。

需要--fork,然它继承一下父进程:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

这里查看pid信息:ls /proc:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路
发现还能看到之前父进程的,这里因此需要进行重新挂载(--mount-proc)一下子进程的proc文件系统(也就是让它有个全新的):

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • exit退出当前环境。

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 这里发现只有我们启动的那俩进程pid了。

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 但是新开一个机器就不一样,成功隔离。

基于mount隔离测试:

首先先取消之前挂载的文件系统:

umount 被挂载目录

但是发现:
从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

说明有进程还在访问,这里直接强行关闭:

umount -l 被挂载目录

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 关闭成功。

然后进行挂载隔离发现:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 因为刚取消了这个目录对应挂载,结构发生变化,故需要退出重新执行unshare就行了:

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路
从虚拟化基石到云原生架构的降维打击:用dd/mkfs玩转namespace隔离,解锁Docker/K8S资源密码,看透物理机到云服务器的进化之路

  • 上面被隔离的子进程机器发现成功挂载,但是宿主机看不到,成功实现挂载隔离。

三.本篇小结

通过实践学习了虚拟化与容器化技术,用dd、mkfs等命令操作磁盘,理解了namespace隔离(如主机名、PID隔离)的原理;掌握了Docker/Kubernetes解决资源利用率低、环境冲突等问题的优势,也认识到其技术门槛与成本挑战,更清晰把握了从物理机到云服务器的架构演进逻辑。