容器技术的本质:从 Linux 底层看 Docker 的诞生!

容器的本质

容器 = 一个被隔离起来的小型 Linux 运行环境,容器 = 软件世界的集装箱。

容器确实就像一个集装箱,拥有统一的尺寸和接口标准,使得不同来源的货物可以在全球范围内的各种运输工具。

容器技术的本质:从 Linux 底层看 Docker 的诞生!-mikechen

集装箱能装各种商品:电子产品、服装、汽车零件,只要进了箱子,大小和接口都统一。

容器可以运行各种应用:Java 服务、Python 脚本、Nginx、MySQL,封装进容器后对外统一接口(镜像+API)。

它们都解决了“异构内容统一封装”的问题。

 

Docker 背后的核心技术

Docker 是一个现代化的容器引擎,但它的基础全部来自 Linux 内核,尤其是以下两大核心模块。

容器之间逻辑隔离(Namespace + Cgroups),即便一个崩溃,其他也能独立运行。

Namespace 实现“资源视图隔离”

Linux Namespace :是 Linux 内核提供的一种资源隔离机制。

Docker 利用 Namespace 技术为容器内的进程构建独立的运行环境,使得每个容器中的进程只能“看到”自己所在的命名空间中的资源。

从而实现进程、网络、文件系统…等多方面的隔离,彼此互不可见。

容器技术的本质:从 Linux 底层看 Docker 的诞生!-mikechen

Namespace通过为每个进程分配独立的资源视图,使得进程只能访问自己命名空间内的资源,而看不到宿主机或其他命名空间中的资源。

Docker使用多种Namespace类型,来实现不同资源的隔离:

Namespace 类型 作用
pid 进程隔离,容器内 PID 从1开始
net 网络隔离,容器有独立 IP
mnt 文件系统隔离,私有的 / 根目录
uts 主机名隔离,容器有独立 hostname
user UID/GID 映射,增强安全性

工作流程,如下:

1.容器启动时创建Namespace

Docker在创建容器进程时,调用clone()系统调用,传入相应的CLONE_NEW*标志。

clone(CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWUTS, ...);

创建新的Namespace,进程在这些新的Namespace中运行,形成独立的资源视图。

2.进程资源视图隔离

容器内进程只能看到自己Namespace中的资源,例如:只能看到容器内的进程列表、网络接口和挂载点,无法访问宿主机或其他容器的对应资源。

3.Namespace的嵌套与层次结构

Namespace具有层次结构,宿主机处于最外层Namespace。

可以访问和管理所有Namespace中的资源,而容器内Namespace相互隔离,彼此不可见。

4.Namespace生命周期与进程绑定

Namespace的生命周期与其关联的进程绑定,当容器进程退出时,相关Namespace随之销毁,保证资源隔离的动态管理。

 

 Cgroups 实现“资源使用限制”

Cgroups(Control Groups)是Linux内核提供的资源管理机制,用于限制、监控和隔离进程组的资源使用。

如下图所示:

容器技术的本质:从 Linux 底层看 Docker 的诞生!-mikechen

Cgroups(Control Groups)允许限制某个进程组的资源占用:

  • 限制 CPU 占用率;
  • 限制最大内存;
  • 限制磁盘 I/O、网络带宽;
  • 控制最大子进程数;

每个容器会被分配一个独立的 Cgroup,防止“容器打爆系统”。

Docker 引擎在创建和运行容器时,会在 cgroup 子系统中为每个容器创建一个独立的控制组。

通过配置 Docker 运行命令的参数(如 -m--cpus 等)。

比如:限制内存:最多只能用 100MB。

echo 104857600 > /sys/fs/cgroup/memory/mytest/memory.limit_in_bytes

再比如:限制 CPU 占用:最多 20% CPU

# 设置总周期为 100000 微秒,每个周期允许最多使用 20000 微秒(即 20%)
echo 100000 > /sys/fs/cgroup/cpu/mytest/cpu.cfs_period_us
echo 20000  > /sys/fs/cgroup/cpu/mytest/cpu.cfs_quota_us

Docker 设置相应 cgroup 控制文件的值,从而限制容器的资源使用。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法