Docker容器技术原理
Docker容器技术原理
一、容器技术本质
容器底层原理:容器不是虚拟机,本质是受 Namespace 隔离、CGroup 资源限制、UnionFS(Overlay2)做分层文件系统,拥有独立文件系统的普通进程,直接复用宿主机 Linux 内核。镜像提供只读 rootfs 模板,实例化后生成容器,容器新增可写层运行业务进程。
- 三大核心支撑技术
- Namespace(命名空间):实现隔离,把进程的 PID、网络、挂载、用户、主机名等系统资源隔开,容器内部看不到宿主机其他进程资源。
- CGroup:实现资源限制,对 CPU、内存等硬件资源做配额管控,限制容器能使用多少宿主机资源。
- UnionFS(联合文件系统,Docker 默认 Overlay2):实现镜像分层存储,多层镜像叠加形成容器统一文件视图。
- 容器 vs 传统虚拟机对比
- 容器:共享宿主机内核,启动秒级,资源损耗极小;隔离基于内核,隔离强度弱于虚拟机。
- 虚拟机:Hypervisor 之上运行完整 Guest OS,启动慢,资源开销大,硬件级强隔离。
- 运行时分层
- 低层运行时(runc):负责调用内核,做 Namespace、CGroup 配置,启动容器进程。
- 高层运行时(containerd):封装低层,提供镜像管理、容器生命周期管理、API 能力。
二、Docker 存储原理(Overlay2)
- Docker 默认存储驱动为 overlay2,属于 UnionFS 实现。将镜像拆分为多层只读层,容器启动时新增一层可写层。
- 目录位置:宿主机/var/lib/docker/overlay2存放各层文件;merged目录是多层叠加后给容器看到的完整文件视图。
- 写时复制 CoW:修改文件时,把只读层文件拷贝到上层可写层再修改,只读镜像层不会改动。
- 查看命令:docker info | grep "Storage Driver"查看存储驱动;mount可以看到 overlay2 挂载信息。
三、Namespace 命名空间详解
- 作用:内核级隔离手段,把系统资源划分到不同命名空间,不同命名空间进程互相看不见。
- 主要隔离类型:PID、NET 网络、MNT 挂载、UTS 主机名、USER 用户、IPC 进程通信。
- 查看:宿主机ls -l /proc/<pid>/ns可以查看一个进程的各个命名空间;容器拥有独立的 ns。
- 注意:Namespace 只做隔离,不限制资源用量,资源限制交给 CGroup 完成。
四、Docker Bridge 网络模式(默认网络)
- 组件:虚拟网桥docker0;每一个容器一对veth‑pair虚拟网卡,一端在容器 netns,一端挂接 docker0 网桥。
- 三种流量转发流程
- 容器之间互通(同一网桥):数据包直接走 docker0 网桥转发,不经过宿主机物理网卡;宿主机也可以直接访问容器内网 IP。
- 容器访问外网:iptables POSTROUTING 链执行MASQUERADE源地址伪装 SNAT,将容器内网 IP 替换成宿主机网卡 IP 向外发包。
- 外部访问容器(端口映射‑p):外部流量到宿主机,iptables PREROUTING 链执行DNAT,把宿主机端口转换为容器内部 IP + 端口,经由 docker0 网桥交给目标容器。
- 底层依靠 iptables NAT 规则完成地址转换。
五、镜像与容器简单补充
- 镜像:多层只读文件,静态模板;容器:镜像运行起来的实例,拥有一层可写层。
- Dockerfile 可以构建自定义镜像,每一条指令生成镜像一层。
六、易考简答浓缩
- 容器本质:隔离 + 资源限制的进程,复用宿主机内核。
- 三大技术:Namespace 做隔离;CGroup 做资源限制;UnionFS (overlay2) 做分层文件系统。
- Bridge 网络三场景:容器间互通走网桥;容器出网 MASQUERADE;外部访问容器 DNAT 端口映射。
- 容器和虚拟机最大区别:容器共享内核,轻量;虚拟机有独立完整操作系统,重、隔离更强。
- runc 底层干活,containerd 做高层管理;dockerd 是 docker 守护进程。
