跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Docker 入门前置:容器虚拟化基础之 Namespace 空间隔离

介绍 Docker 容器虚拟化的基础概念 Namespace,包括其六种类型及隔离机制,并结合实际命令演示如何利用 dd、mkfs、df、mount 和 unshare 工具进行资源管理与命名空间隔离操作。

二进制发布于 2026/2/16更新于 2026/5/2924 浏览
Docker 入门前置:容器虚拟化基础之 Namespace 空间隔离

Namespace

namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。

Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

Namespace 参数与说明

namespace系统调用参数被隔离的全局系统资源引入内核版本
UTSCLONE_NEWUTS主机名和域名2.6.19
IPCCLONE_NEWIPC信号量、消息队列和共享内存 - - 进程间通信2.6.19
PIDCLONE_NEWPID进程编号2.6.24
NetworkCLONE_NEWNET网络设备、网络栈、端口等2.6.29
MountCLONE_NEWNS文件系统挂载点2.4.19
UserCLONE_NEWUSER用户和用户组3.8

容器环境下的隔离效果

  • UTS:每个容器能看到自己的 hostname,拥有独立的主机名和域名。
  • IPC:同一个 IPC namespace 的进程之间能互相通讯,不同的 IPC namespace 之间不能通信。
  • PID:每个 PID namespace 中的进程可以有其独立的 PID,每个容器可以有其 PID 为 1 的 root 进程。
  • Network:每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号。
  • Mount:每个容器能看到不同的文件系统层次结构。
  • User:每个 container 可以有不同的 user 和 group id。

隔离两个进程的实现思路

  1. 首先容器进程与进程之间需要隔离,所以需要 PID 隔离
  2. 容器 A 进程不能读取容器 B 进程通讯内容需要隔离信号量等,所以需要 IPC 隔离
  3. 容器 A 进程不能读取容器 B 进程的文件,所以需要 Mount 隔离
  4. 容器 A 进程不能读取容器 B 进程的 socket,所以需要网络隔离、主机隔离
  5. Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。

一、dd 命令详解

Linux dd 命令用于读取、转换并输出数据。 dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

语法:dd OPTION

常见参数

参数说明
if=文件名输入文件名,默认为标准输入,即指定源文件
of=文件名输出文件名,默认为标准输出,即指定目的文件
ibs=bytes一次读入 bytes 个字节,即指定一个块大小为 bytes 个字节
obs=bytes一次输出 bytes 个字节,即指定一个块大小为 bytes 个字节
bs=bytes同时设置读入/输出的块大小为 bytes 个字节
cbs=bytes一次转换 bytes 个字节,即指定转换缓冲区大小
skip=blocks从输入文件开头跳过 blocks 个块后再开始复制
seek=blocks从输出文件开头跳过 blocks 个块后再开始复制
count=blocks仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数
conv=ascii转换 ebcdic 为 ascii
conv=ebcdic转换 ascii 为 ebcdic
conv=ibm转换 ascii 为 alternate ebcdic
conv=block把每一行转换为长度为 cbs,不足部分用空格填充
conv=unblock使每一行的长度都为 cbs,不足部分用空格填充
conv=lcase把大写字符转换为小写字符
conv=ucase把小写字符转换为大写字符
conv=swap交换输入的每对字节
conv=noerror出错时不停止
conv=notrunc不截短输出文件
conv=sync将每个输入块填充到 ibs 个字节,不足部分用空(NUL)字符补齐
--help显示帮助信息
--version显示版本信息

示例

# 生成1个镜像文件
dd if=/dev/zero of=fdimage.img bs=8k count=10240

# 将 testfile 文件中的所有英文字母转换为大写,然后转成为 testfile_1 文件
dd if=testfile_2 of=testfile_1 conv=ucase

二、mkfs 命令详解

用于在设备上创建 Linux 文件系统,俗称格式化,比如我们使用 U 盘的时候可以格式化。

语法:mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

常见参数

参数说明
-t fstype指定要建立何种文件系统;如 ext3,ext4
filesys指定要创建的文件系统对应的设备文件名
blocks指定文件系统的磁盘块数
-V详细显示模式
fs-options传递给具体的文件系统的参数

实例

# 将 sda6 分区格式化为 ext4 格式
mkfs -t ext4 /dev/sda6

# 格式化镜像文件为 ext4
mkfs -t ext4 ./fdimage.img

三、df 命令详解

Linux df 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。

语法:df [OPTION]... [FILE]...

常见参数

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

案例

# 查看磁盘使用情况
df -h

# 查看磁盘的系统类型
df -Th

四、mount 命令详解

mount 命令用于加载文件系统到指定的加载点。此命令也常用于挂载光盘,使我们可以访问光盘中的数据,因为你将光盘插入光驱中,Linux 并不会自动挂载,必须使用 Linux mount 命令来手动完成挂载。

Linux 系统下不同目录可以挂载不同分区和磁盘设备,它的目录和磁盘分区是分离的,可以自由组合(通过挂载),不同的目录数据可以跨越不同的磁盘分区或者不同的磁盘设备。挂载的实质是为磁盘添加入口(挂载点)。

语法:mount [-l] mount [-t vfstype] [-o options] device dir

常见参数

参数说明
-l显示已加载的文件系统列表
-t vfstype加载文件系统类型支持常见系统类型的 ext3,ext4,iso9660,tmpfs,xfs 等,大部分情况可以不指定,mount 可以自己识别
-o loop用来把一个文件当成硬盘分区挂接上系统
-o ro采用只读方式挂接设备
-o rw采用读写方式挂接设备
device要挂接(mount)的设备
dir挂载点的目录

案例

# 将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt

# 将镜像挂载到 /mnt/testext4 下面,需要确保挂载点也就是目录存在
mkdir -p /mnt/testext4
mount ./fdimage.img /mnt/testext4

五、unshare 命令详解

unshare 主要能力是使用与父程序不共享的名称空间运行程序。

语法:unshare [options] program [arguments]

常用参数

参数说明
-i, --ipc不共享 IPC 空间
-m, --mount不共享 Mount 空间
-n, --net不共享 Net 空间
-p, --pid不共享 PID 空间
-u, --uts不共享 UTS 空间
-U, --user不共享用户
-V, --version版本查看
--fork执行 unshare 的进程 fork 一个新的子进程,在子进程里执行 unshare 传入的参数
--mount-proc执行子进程前,将 proc 优先挂载过去

案例

# hostname 隔离
$ unshare -u /bin/bash
$ hostname test1
$ exit
$ hostname
139-159-150-152

目录

  1. Namespace
  2. Namespace 参数与说明
  3. 容器环境下的隔离效果
  4. 隔离两个进程的实现思路
  5. 一、dd 命令详解
  6. 常见参数
  7. 示例
  8. 生成1个镜像文件
  9. 将 testfile 文件中的所有英文字母转换为大写,然后转成为 testfile_1 文件
  10. 二、mkfs 命令详解
  11. 常见参数
  12. 实例
  13. 将 sda6 分区格式化为 ext4 格式
  14. 格式化镜像文件为 ext4
  15. 三、df 命令详解
  16. 常见参数
  17. 案例
  18. 查看磁盘使用情况
  19. 查看磁盘的系统类型
  20. 四、mount 命令详解
  21. 常见参数
  22. 案例
  23. 将 /dev/hda1 挂在 /mnt 之下。
  24. 将镜像挂载到 /mnt/testext4 下面,需要确保挂载点也就是目录存在
  25. 五、unshare 命令详解
  26. 常用参数
  27. 案例
  28. hostname 隔离
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端安全核心要点:防止 XSS 攻击与数据泄露
  • ARM64 Linux 服务器离线安装 Nginx 指南
  • 基于 SpringBoot 与 Vue 的酒店客房管理系统
  • LLaMA-Factory YAML 配置详解与参数调优实战
  • OpenClaw 配置本地 Ollama 模型完整指南
  • Docker Desktop 多系统中文界面配置教程
  • GCC 编译器使用与调试基础指南
  • MySQL 错误 1130 解决方案:Host 不被允许连接服务器
  • ToDesk 内置 ToClaw AI:零代码实现科技新闻日报自动化实战
  • 大数据岗位面试英文自我介绍实战指南
  • 算法实战:归并排序与数组逆序对详解
  • C++进阶:从裸指针到智能指针的内存管理进化
  • Stable Diffusion 本地运行硬件配置选择与优化指南
  • 基于 Qwen2.5-7B-Instruct 构建情绪支持机器人
  • Mac 上使用 Git 拉取项目的完整指南
  • 大语言模型 (LLM) 基础:原理、应用与挑战
  • LangSmith 大模型应用开发监控与测试平台详解
  • AI 产品经理必备核心能力与技能指南
  • OpenClaw 部署指南:Linux 环境搭建与模型/飞书集成
  • 实战:利用 AI 助手将自然语言转化为 SQL 查询

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online