Docker 容器如何实现隔离

Docker 容器通过 Linux 内核的多种技术实现隔离,主要包括 ​​Namespace(命名空间)​ ​、​​Cgroups(控制组)​ ​ 和 ​​联合文件系统​​。以下是详细原理:


​​1. Linux Namespace(命名空间) - 核心隔离机制​​

Namespace 是 Linux 内核提供的资源隔离技术,Docker 使用 6 种命名空间实现不同维度的隔离:

​​(1) PID Namespace(进程隔离)​​

复制代码
# 宿主机查看所有进程
ps aux

# 容器内只能看到容器自己的进程
docker run -it alpine ps aux

​​原理​​:

  • 每个容器有独立的进程 ID 编号体系

  • 容器内的 PID 1 进程在宿主机上可能是 PID 1000

  • 容器无法看到或影响宿主机和其他容器的进程

​​(2) Network Namespace(网络隔离)​​

复制代码
# 宿主机网络接口
ip addr show

# 容器内网络接口(完全独立)
docker run -it alpine ip addr show

​​原理​​:

  • 每个容器有独立的网络栈(网卡、IP、路由表、端口)

  • 容器间网络通过虚拟网桥(docker0)通信

  • 支持端口映射:容器端口 ↔ 宿主机端口

​​(3) Mount Namespace(文件系统隔离)​​

复制代码
# 容器有独立的文件系统视图
docker run -it alpine ls /
# 输出:bin dev etc home lib ...(容器内文件系统)

# 宿主机文件系统不受影响
ls /  # 宿主机自己的文件系统

​​原理​​:

  • 每个容器有独立的文件系统挂载点

  • 基于联合文件系统(OverlayFS)实现分层存储

​​(4) UTS Namespace(主机名隔离)​​

复制代码
# 容器可以有自己的主机名
docker run -it --hostname mycontainer alpine hostname
# 输出:mycontainer(不影响宿主机主机名)

​​原理​​:

  • 每个容器可以设置独立的主机名和域名

​​(5) IPC Namespace(进程间通信隔离)​​

复制代码
# 容器间共享内存、信号量、消息队列隔离
docker run -it alpine ipcs  # 只能看到容器内的 IPC 资源

​​原理​​:

  • 隔离 System V IPC 和 POSIX 消息队列

​​(6) User Namespace(用户隔离)​​

复制代码
# 容器内用户映射到宿主机非特权用户
docker run -it alpine whoami  # 显示 root
# 实际在宿主机上以普通用户运行

​​原理​​:

  • 容器内 root 用户映射到宿主机非 root 用户

  • 增强安全性,防止容器逃逸


​​2. Cgroups(控制组) - 资源限制​​

Cgroups 限制容器对硬件资源的使用:

​​(1) CPU 限制​​

复制代码
# 限制容器最多使用 50% 的 CPU
docker run -it --cpus="0.5" ubuntu

# 或使用 CPU 份额(相对权重)
docker run -it --cpu-shares=512 ubuntu

​​(2) 内存限制​​

复制代码
# 限制容器内存使用为 100MB
docker run -it --memory=100m ubuntu

# 限制内存 + 交换分区
docker run -it --memory=100m --memory-swap=200m ubuntu

​​(3) 磁盘 I/O 限制​​

复制代码
# 限制磁盘读写速率
docker run -it \
  --device-read-bps /dev/sda:1mb \
  --device-write-bps /dev/sda:1mb \
  ubuntu

​​(4) Cgroups 子系统​​

子系统 功能 Docker 参数示例
​​cpu​​ CPU 时间分配 --cpus, --cpu-shares
​​memory​​ 内存使用限制 --memory, --memory-swap
​​blkio​​ 块设备 I/O 限制 --device-read-bps
​​devices​​ 设备访问控制 --device
​​pids​​ 进程数限制 --pids-limit

​​3. 联合文件系统(UnionFS) - 存储隔离​​

Docker 使用联合文件系统实现镜像分层和容器可写层:

​​(1) OverlayFS 工作原理​​

复制代码
容器层(可写)
    ↓
联合视图(容器看到的文件系统)
    ↓
镜像层(只读)← 镜像层(只读)← 基础镜像

​​(2) 写时复制(Copy-on-Write)​​

复制代码
# 多个容器共享同一个镜像,只有修改时才复制
docker run -it ubuntu  # 容器1
docker run -it ubuntu  # 容器2 - 共享基础镜像层

​​4. 安全隔离机制​​

​​(1) Capabilities(能力机制)​​

复制代码
# 默认删除危险的能力,如 CAP_SYS_ADMIN
docker run -it --cap-drop=ALL --cap-add=NET_BIND_SERVICE ubuntu

​​(2) Seccomp(系统调用过滤)​​

复制代码
# 使用自定义 seccomp 配置文件
docker run -it --security-opt seccomp=profile.json ubuntu

​​(3) AppArmor/SELinux​​

复制代码
# 使用 AppArmor 配置文件
docker run -it --security-opt apparmor=docker-default ubuntu

​​5. 实际隔离效果演示​​

​​进程树视图​​

复制代码
宿主机进程树:
systemd(1)─┬─dockerd(1000)─┬─docker-containerd(1001)─┬─nginx(1002)  # 容器1
           │               │                          └─redis(1003)   # 容器2
           └─bash(500)                                           # 宿主机shell

容器1内进程树:
nginx(1)─┬─nginx(10)
         └─nginx(11)

容器2内进程树:  
redis(1)

​​网络隔离示例​​

复制代码
# 宿主机
ip addr show docker0  # 显示 docker0 网桥

# 容器1
docker run -d --name web nginx
docker exec web ip addr show  # 显示容器的 veth 接口

# 容器2  
docker run -d --name db redis
docker exec db ip addr show  # 不同的网络命名空间

​​6. 与虚拟机的对比​​

特性 Docker 容器 虚拟机
​​隔离级别​​ 进程级别 硬件级别
​​启动速度​​ 秒级 分钟级
​​性能损耗​​ 1-5% 15-30%
​​镜像大小​​ MB 级 GB 级
​​隔离性​​ 较弱(共享内核) 强(完全隔离)
​​适用场景​​ 应用隔离、微服务 完整操作系统隔离

​​7. 总结​​

Docker 通过 ​​Namespace + Cgroups + UnionFS​​ 三大核心技术实现隔离:

  1. ​​Namespace​​:提供环境隔离(进程、网络、文件系统等)

  2. ​​Cgroups​​:提供资源限制(CPU、内存、磁盘 I/O 等)

  3. ​​UnionFS​​:提供存储隔离(镜像分层、写时复制)

这种设计使得容器既​​轻量快速​ ​(共享主机内核),又具备​​足够的隔离性​​(满足多应用部署需求),成为现代云原生应用的事实标准。

相关推荐
水饺编程2 分钟前
第2章:Linux 基础,重启命令
linux·c语言·汇编
金色熊族16 分钟前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
xixiaoyunya23 分钟前
Docker 常用命令与实战:从入门到部署一个简单应用
docker·容器·eureka
第404号工位24 分钟前
“已彻底删除”的照片与文件到底去哪了?我用底层扇区扫描,扒出手机和电脑的幽灵数据
linux·python·架构
吴声子夜歌39 分钟前
Docker入门与实战——Docker Swarm模式(跨主机容器集群管理)
docker
硅基手札1 小时前
SPI技术系列 12 · SPI 设备驱动实战
linux·驱动开发·单片机·嵌入式硬件·mcu·性能优化·系统架构
不悔哥2 小时前
ESP32上跑 Linux: 乐鑫给 ESP32-S31开放了官方 BSP
linux·嵌入式硬件·开源
syagain_zsx2 小时前
WebSocket 教程:websocketpp 写 echo 服务端
linux·网络·c++·websocket·网络协议·工具库
无足鸟ICT2 小时前
【RHCA+】_etc_yum.repos.d_文件名.repo
linux·运维·centos
骑着蜗牛撵大象3272 小时前
字节序、TLV 到 netlink:Linux 网络消息的编解码全链路
linux·网络·php·etl·序列化·字节序·tlv