插件窝 干货文章 Docker使用了哪些底层技术?

Docker使用了哪些底层技术?

容器 隔离 宿主机 Docker 256    来源:    2025-04-04

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(推荐)、btrfszfs
  • 日志处理:通过 json-file 驱动或 Fluentd 等插件收集日志

技术演进趋势

  • Kubernetes 集成:Docker 逐渐转向作为 Kubernetes 的容器运行时之一(通过 CRI 接口)
  • Wasm 支持:实验性支持 WebAssembly 作为轻量级容器(区别于 Linux 容器)
  • 非 Linux 平台
    • Windows:基于 Windows Containers(使用 NT 内核隔离)
    • macOS:依赖 Linux 虚拟机(如旧版 Docker Desktop 使用 HyperKit)

通过组合这些技术,Docker 实现了轻量级、高性能的容器化解决方案,相比传统虚拟机(VM)减少了资源开销(无需模拟硬件),同时保证了足够的隔离性。