docker实现的基本原理

Docker 实现容器的基本原理依赖于 Linux 内核的三大核心机制命名空间(Namespaces)控制组(cgroups)联合文件系统(UnionFS),也是 Docker 能够出现的最重要原因。

1. 命名空间(Namespaces)

作用:实现资源的隔离,使容器内的进程无法感知或干扰宿主机的其他进程或资源。(容器隔离的基础,保证A容器看不到B容器.)

Docker 使用6个命名空间:Pid,Mnt,Network,UTS,IPC,User

  • PID Namespace:隔离进程 ID,容器内进程的 PID 独立于宿主机(容器内 PID=1 的进程在宿主机可能是 PID=1000)。

  • Mount Namespace:隔离文件系统挂载点,容器拥有独立的文件视图(如 / 根目录)。

  • Network Namespace:隔离网络栈,容器拥有独立的 IP、端口和路由表。

  • UTS Namespace:隔离主机名和域名(容器可自定义主机名)。

  • IPC Namespace:隔离进程间通信(如信号量、消息队列)。

  • User Namespace:隔离用户和用户组 ID(容器内 root 用户映射为宿主机非特权用户)。

2. 控制组(cgroups)

作用:限制和监控容器对硬件资源的使用,防止单个容器耗尽宿主机资源。( 容器资源统计和隔离)

  • 资源限制:CPU、内存、磁盘 I/O、网络带宽等。

  • # 示例:限制容器内存为 512MB
    docker run -m 512m my-image
    
  • 优先级分配:为容器分配 CPU 权重或磁盘 I/O 优先级。

  • 统计监控:记录容器的资源使用情况(如 docker stats)。

主要用到的cgroups子系统:cpu,blkio,device,freezer,memory

3. 联合文件系统(UnionFS)

作用:通过分层(Layer)机制实现镜像的轻量化和高效存储。(分层镜像实现的基础)

  • 镜像分层:镜像由多个只读层叠加组成,每层代表一次文件系统变更(如安装软件、修改配置)。
  • 写时复制(Copy-on-Write)
    • 容器启动时,基于镜像创建一个可写层(容器层)。
    • 修改文件时,先从镜像层复制文件到容器层,再修改副本,避免直接修改镜像。
    • 优势:多个容器可共享同一镜像的只读层,节省存储空间。

总结

Docker 通过 Namespaces 实现资源隔离、cgroups 实现资源限制、UnionFS 实现高效镜像管理,最终在宿主机上创建轻量级的沙箱环境。

优势:快速启动、低资源消耗、环境一致性(开发-测试-生产环境统一)。

适用场景:微服务部署、持续集成、云原生应用等。

Docker 是使用了很多 Linux 的隔离功能,让容器看起来像一个轻量级虚拟机在独立运行,容器的本质是被限制了的 Namespaces,cgroup,具有逻辑上独立文件系统,网络的一个进程。

posted @   搁浅~浅浅浅  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示