容器的本质
容器 = 一个被隔离起来的小型 Linux 运行环境,容器 = 软件世界的集装箱。
容器确实就像一个集装箱,拥有统一的尺寸和接口标准,使得不同来源的货物可以在全球范围内的各种运输工具。
集装箱能装各种商品:电子产品、服装、汽车零件,只要进了箱子,大小和接口都统一。
容器可以运行各种应用:Java 服务、Python 脚本、Nginx、MySQL,封装进容器后对外统一接口(镜像+API)。
它们都解决了“异构内容统一封装”的问题。
Docker 背后的核心技术
Docker 是一个现代化的容器引擎,但它的基础全部来自 Linux 内核,尤其是以下两大核心模块。
容器之间逻辑隔离(Namespace + Cgroups),即便一个崩溃,其他也能独立运行。
Namespace 实现“资源视图隔离”
Linux Namespace :是 Linux 内核提供的一种资源隔离机制。
Docker 利用 Namespace 技术为容器内的进程构建独立的运行环境,使得每个容器中的进程只能“看到”自己所在的命名空间中的资源。
从而实现进程、网络、文件系统…等多方面的隔离,彼此互不可见。
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内核提供的资源管理机制,用于限制、监控和隔离进程组的资源使用。
如下图所示:
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面试题总结》