数据卷挂载是docker借助linux内核命名空间与挂载传播机制,在宿主机与容器间建立受控双向文件系统视图映射,绕过unionfs分层、直连vfs调度,由卷驱动统一管理绑定挂载、命名卷及tmpfs,并依赖linux dac保障权限一致性。

数据卷挂载不是简单地“复制文件”或“链接路径”,而是 Docker 借助 Linux 内核能力,在宿主机与容器之间建立一种受控的、双向可见的文件系统视图映射。
核心依赖:命名空间与挂载传播
容器启动时,Docker 利用 mount namespace 为容器创建独立的挂载点视图。宿主机上的某个目录(如 /data/mysql)被实际挂载进该 namespace 的指定路径(如 /var/lib/mysql),容器内进程看到的就是这个路径下的内容,且所有读写操作直接作用于宿主机对应位置。
关键在于挂载传播类型(shared/slave/private)——Docker 默认使用 private,确保容器内挂载行为不会反向影响宿主机或其他容器,但宿主机对该目录的修改仍会实时反映到容器中。
绕过联合文件系统(UnionFS)
镜像层和容器可写层基于 overlay2 或 aufs 等联合文件系统,特点是分层只读 + 顶层可写,但数据卷完全独立于此体系。它不经过 copy-on-write 流程,不占用镜像层空间,也不随容器删除而清除。Docker 将卷视为“外部存储”,直接通过内核的 VFS(虚拟文件系统)接口进行 I/O 调度,性能更接近原生磁盘访问。
卷驱动与存储抽象
无论是匿名卷、命名卷还是绑定挂载(bind mount),Docker 都通过 卷驱动(Volume Driver) 统一管理:
-
绑定挂载:由 kernel 直接处理,本质是
mount --bind,路径必须存在,权限需手动对齐; -
命名卷:由 Docker daemon 管理,自动在
/var/lib/docker/volumes/下创建目录,支持插件扩展(如 NFS、S3); - tmpfs:纯内存挂载,走 kernel 的 tmpfs 文件系统,无持久化能力。
权限与一致性保障
挂载生效后,容器内进程的 UID/GID 必须能访问宿主机路径的权限。例如容器以用户 1001 运行,而宿主机目录属主是 root:root 且权限为 755,则可能因无写权限失败。这不是 Docker 的限制,而是 Linux DAC(自主访问控制)机制在起作用——Docker 不做权限转换,只负责挂载动作本身。











