开发-- docker常识

Docker 容器通过 Linux 的 NamespaceCgroups 技术实现资源隔离与限制,部分资源与宿主机共享,部分则完全独立。以下是具体分类:


一、继承自宿主机的资源

  1. 内核(Kernel)

    • 容器共享宿主机的 Linux 内核,无法独立修改内核版本或模块。若容器内程序依赖特定内核特性,需宿主机内核支持。
  2. 硬件设备

    • 物理设备(如 CPU、GPU、磁盘)由宿主机统一管理。容器可通过 --privileged--device 参数访问特定设备,但本质上仍是共享宿主机硬件。
  3. 系统时间(Time)

    • 容器无法独立修改系统时间,settimeofday 等调用会直接影响宿主机及其他容器。
  4. 部分内核参数

    • /proc/sys/sys 中的内核参数(如 net.ipv4.ip_forward)通常继承自宿主机,除非显式通过 --sysctl 修改。

二、独立于宿主机的资源

  1. 进程树(PID Namespace)

    • 容器内进程拥有独立的 PID 空间,ps 命令仅显示容器内进程,且 Init 进程的 PID 为 1。
  2. 文件系统(Mount Namespace)

    • 通过 rootfsMount Namespace 提供独立的文件视图。容器内挂载操作(如 mount /tmpfs)不影响宿主机。
  3. 网络栈(Network Namespace)

    • 默认情况下,容器拥有独立的网络设备、IP 地址、端口和路由表。例如 bridge 模式下,容器通过 veth pair 连接虚拟网桥 docker0
  4. 用户与权限(User Namespace)

    • 可配置独立的用户和组映射,容器内 root 用户权限可被限制(需启用 User Namespace)。
  5. 主机名与域名(UTS Namespace)

    • 容器可设置独立的 hostnamedomainname,与宿主机隔离。
  6. 进程间通信(IPC Namespace)

    • 信号量、消息队列等 IPC 资源仅在容器内可见。
  7. 资源限制(Cgroups)

    • 通过 Cgroups 独立限制 CPU、内存、磁盘 I/O 等资源使用量。例如 --memory=500m 限制内存为 500MB。

三、特殊场景的共享与隔离

  • 存储卷(Volume)
    • 通过 -v 挂载的宿主机目录或文件是显式共享的,但容器内其他文件仍独立。
  • 网络模式
    • host 模式下容器共享宿主机 Network Namespace,直接使用宿主机 IP 和端口。

总结

资源类型 是否独立 依赖技术
内核 共享
进程树 独立 PID Namespace
文件系统 独立 Mount Namespace + rootfs
网络栈 独立 Network Namespace
CPU/内存限制 独立 Cgroups
硬件设备 共享/可控 --device 参数

通过合理配置 Namespace 和 Cgroups,Docker 在轻量级虚拟化中平衡了隔离性与性能。如需完全隔离内核,需使用 Kata Containers 等沙箱技术。

posted @ 2025-06-01 17:41  静水深耕,云停风驻  阅读(58)  评论(0)    收藏  举报