Docker使用了哪些底层技术?
Docker 的底层技术栈是一系列 Linux 内核功能和开源技术的组合,以下是其核心底层技术的详细解析:
1. Linux 命名空间(Namespaces)
- 功能:实现资源隔离(每个容器看到独立的系统视图)
- 关键命名空间:
- PID:隔离进程树(容器内 PID 1 独立于宿主机)
- Network:独立网络栈(容器拥有自己的 IP、端口、路由表)
- Mount:文件系统挂载隔离(容器内
/
独立于宿主机)
- UTS:隔离主机名和域名
- IPC:隔离进程间通信(如 System V IPC)
- User:隔离用户和用户组(容器内 root ≠ 宿主机 root)
2. 控制组(cgroups)
- 功能:限制和监控资源使用
- 管控维度:
- CPU:通过
cpu.shares
分配权重,cpuset
绑定核心
- 内存:硬限制(
memory.limit_in_bytes
)和 OOM 控制
- 磁盘 I/O:通过
blkio
子系统限制读写带宽
- 设备访问:白名单机制控制设备访问权限
3. 联合文件系统(UnionFS)
- 功能:实现分层镜像和高效存储
- 常见实现:
- OverlayFS(现代 Docker 默认):
lowerdir
(只读层)+ upperdir
(可写层)+ merged
(统一视图)
- AUFS(早期版本):通过分支堆叠实现分层
- devicemapper:RHEL/CentOS 的默认驱动(基于块设备)
- 写时复制(CoW):修改文件时复制到可写层,减少磁盘占用
4. 容器运行时(Container Runtime)
- 早期:直接依赖
libcontainer
(Docker 自研)
- 现代架构:
- containerd(核心运行时):管理容器生命周期(创建/启动/停止)
- runc(OCI 标准实现):实际调用底层 Namespaces/cgroups
5. 网络虚拟化
- 基础模型:
- Bridge 模式:
docker0
网桥 + veth pair
连接容器
- Host 模式:直接共享宿主机网络栈
- None 模式:无网络(需手动配置)
- 高级组件:
- iptables/nftables:实现 NAT 和端口映射
- CNI(Container Network Interface):支持 Calico/Flannel 等插件
6. 安全增强
- Capabilities:精细化控制容器进程权限(如移除
CAP_NET_ADMIN
)
- Seccomp:限制系统调用(默认阻止
reboot
等危险调用)
- SELinux/AppArmor:强制访问控制(MAC)
- Rootless 模式:非 root 用户运行 Docker(依赖 User Namespaces)
7. 其他关键技术
- 镜像分发:基于 OCI 镜像标准,使用 Registry V2 API(支持分片上传/拉取)
- 存储驱动:根据不同场景选择
overlay2
(推荐)、btrfs
、zfs
等
- 日志处理:通过
json-file
驱动或 Fluentd 等插件收集日志
技术演进趋势
- Kubernetes 集成:Docker 逐渐转向作为 Kubernetes 的容器运行时之一(通过 CRI 接口)
- Wasm 支持:实验性支持 WebAssembly 作为轻量级容器(区别于 Linux 容器)
- 非 Linux 平台:
- Windows:基于 Windows Containers(使用 NT 内核隔离)
- macOS:依赖 Linux 虚拟机(如旧版 Docker Desktop 使用 HyperKit)
通过组合这些技术,Docker 实现了轻量级、高性能的容器化解决方案,相比传统虚拟机(VM)减少了资源开销(无需模拟硬件),同时保证了足够的隔离性。