前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Docker 容器 namespace 隔离 原理
DoDocker容器运行

Docker 容器通过哪些 Linux namespace 实现隔离,各自隔离了什么资源?

Docker 容器依赖 Linux 内核的 namespace 机制实现进程、网络、挂载等资源的隔离,每种 namespace 隔离一种全局资源。

前端进阶之旅 · 一题精讲更新于 2026.09.05
Docker#容器运行#容器化
先看核心答案
理解线索

理解 namespace 的隔离层次

  1. PID NS进程号独立,看不到宿主其他进程
  2. NET NS网络设备、IP、路由、iptables 独立
  3. MNT NS挂载点隔离,容器有独立文件系统视图

这些 namespace 由 Linux 内核提供,Docker 只是调用 clone 或 unshare 创建。

核心回答

先记住这个答案

Docker 启动容器时,会为容器进程创建一组独立的 namespace,包括 PID、Network、Mount、UTS、IPC 等(User namespace 默认不创建,需配置 userns-remap 才启用)。PID namespace 隔离进程号,使容器内进程看到独立的 PID 空间,且主进程 PID 为 1;Network namespace 提供独立的网络栈,包括网卡、IP、路由等;Mount namespace 隔离挂载点,容器有自己的文件系统视图;UTS namespace 隔离主机名和域名;IPC namespace 隔离 System V IPC 和 POSIX 消息队列;User namespace 启用后可隔离用户和组 ID,使容器内 root 映射为宿主非特权用户。这些 namespace 共同构成了容器运行的基础隔离边界。

  • PID namespace 隔离进程号,容器内 PID 1 是主进程。
  • NET namespace 提供独立网络栈,容器有自己的 IP 和端口。
  • USER namespace 可将容器 root 映射为宿主非特权用户。

namespace 的创建与隔离对象

当 Docker 启动容器时,docker 守护进程通过 clone 系统调用(或 unshare)为新进程创建多个 namespace。每个 namespace 只隔离对应全局资源。例如 PID namespace 使容器内第一个进程 PID 为 1,容器内无法看到宿主机或其他容器的进程,只能看到同一 namespace 内的进程。这对进程管理和信号传递有直接影响。

Network namespace 隔离了整个网络协议栈,每个容器有独立的虚拟网卡、IP 地址、路由表和 netfilter 规则。容器内启动 nginx 监听 80 端口不会与宿主机或其他容器冲突。Mount namespace 隔离挂载点,容器从镜像挂载根文件系统,并拥有独立的 /tmp 等挂载,对宿主机目录的访问需显式挂载,且挂载操作只影响当前 namespace。

一个运行 nginx 容器中的隔离验证

假设宿主运行一个 Ubuntu 容器:docker run -d --name web -p 8080:80 nginx。在容器内执行 ps aux 只能看到 nginx 相关进程,PID 从 1 开始,看不到宿主 sshd 或 docker-proxy。执行 hostname 返回容器 ID,这是 UTS namespace 的效果。执行 ifconfig 看到 eth0 是 172.17.0.x 地址,而非宿主物理网卡。这些现象都是不同 namespace 的作用结果。

若试图在容器内挂载宿主机目录,比如 mount /dev/sda1 /mnt,会得到 Permission denied,因为默认容器没有 CAP_SYS_ADMIN,且 Mount namespace 隔离权限受限制。若要访问外部网络,容器通过 Docker 创建的 bridge 和 NAT 转发,这属于 Network namespace 与宿主网络的桥接逻辑,说明隔离并非完全封闭,而是通过虚拟接口通信。

namespace 隔离的失效条件

namespace 提供的是内核资源隔离,但不是安全边界。若容器以 --privileged 运行或赋予 CAP_SYS_ADMIN,则可能挂载宿主机文件系统或执行敏感操作,破坏隔离。此外,User namespace 默认未启用,容器内 root 仍是宿主 root 用户,除非配置 userns-remap。没有 User namespace 时,若进程通过漏洞逃逸,可能直接以 root 操作宿主资源。

另一个边界是共享 namespace:使用 --pid=host 会共享宿主 PID namespace,容器内能看到并可能影响宿主进程,这通常用于调试但降低隔离。--network=host 同理,共享网络栈,容器端口占用宿主端口,且失去网络隔离。这些选项应仅在可信场景使用,并需评估风险。

回答前,多想一步

容易答错的地方

认为 namespace 等同于安全沙箱
namespace 只隔离资源视图,不限制特权操作。缺少 user namespace 时容器内 root 映射为宿主 uid 0,但默认受 capabilities 限制,并非拥有宿主 root 全部权限;若额外授予 capabilities 则可能获得更多宿主权限,增加逃逸风险。安全隔离需要结合 capabilities、seccomp、selinux 等机制。
以为容器内 PID 1 是独立的 init 系统
容器内 PID 1 是主进程并承担 init 角色,但若进程未实现 wait 回调或信号处理,就不会自动回收孤儿进程,也难以及时响应 SIGTERM;通常需 --init 引入 tini 来接管。若主进程不处理 SIGTERM,容器停止时可能被强杀。
试着用自己的话回答

面试官还会怎么问?

PID namespace 中容器主进程 PID 为什么是 1?

每个 PID namespace 的初始进程 PID 都是 1,承担 init 角色。内核将孤儿进程交给它接管,但若进程未调用 wait,孤儿进程可能变成僵尸;通常需要主进程显式处理 SIGCHLD 或使用 --init 引入 tini。主进程退出时,内核会终止该 namespace 内其余进程并销毁 namespace。

User namespace 如何影响容器内 root 权限?

启用 userns-remap 后,容器内 root 映射为宿主非特权用户,容器内 root 不能直接访问宿主资源,但需要确保挂载卷的权限匹配,否则容器进程可能无权读写。

容器共享宿主 Network namespace 时还能有独立 IP 吗?

不能。--network=host 使容器直接使用宿主网络栈,无独立 IP,监听端口占用宿主端口,可能冲突。该模式适合网络调试或需要直接使用宿主网络接口的场景,但会失去网络隔离。

从一道题,走向一组知识

把知识连起来

容器运行

为什么 Docker 容器内的主进程 PID 是 1,这会带来什么问题?

同属「容器运行」专题,接着看 Docker 容器 PID 1 进程 问题 在具体场景中的处理方式。

容器运行

在什么场景下会让 Docker 容器共享宿主机的 PID 或 IPC 命名空间,代价是什么?

同属「容器运行」专题,接着看 Docker --pid host --ipc host 共享命名空间 在具体场景中的处理方式。

参考资料

  • Docker Engine security

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. namespace 的创建与隔离对象
  3. 一个运行 nginx 容器中的隔离验证
  4. namespace 隔离的失效条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑