必须用卷驱动(Volume Driver)而非存储驱动对接第三方块存储,因存储驱动仅管理镜像和容器层,不处理卷挂载;卷驱动作为独立插件,通过Create/Mount等接口将操作转为rbd map、iscsiadm等实际调用。

不能直接通过 Docker 存储驱动(如 overlay2、aufs)对接第三方块存储。存储驱动只负责镜像和容器层的读写管理,不处理卷挂载逻辑,也不支持网络块设备接入。
必须用卷驱动(Volume Driver)而非存储驱动
Docker 将“镜像/容器层管理”和“数据卷管理”完全分离:
- 存储驱动(Storage Driver):仅控制 镜像分层加载与容器运行时文件修改,例如 overlay2、btrfs,它们工作在
/var/lib/docker/内部,无法感知或挂载远端 LUN、iSCSI target 或 Ceph RBD 镜像。 - 卷驱动(Volume Driver):是独立插件进程,实现 Create/Mount/Unmount/Delete 接口,Docker Daemon 通过 Unix socket 调用它,把卷操作转为对后端存储的实际调用(如 rbd map、iscsiadm login、aws ec2 attach-volume)。
对接第三方块存储的典型路径
以 Ceph RBD 为例,需三步落地:
-
部署 CSI 或专用卷插件:如 Rook 提供的
rook-ceph-blockStorageClass,或使用社区cephcsi插件;单机 Docker 可部署docker volume plugin install --alias ceph ceph/ceph-volume-plugin(需提前配置好 Ceph 客户端密钥和 monitor 地址)。 -
创建带参数的命名卷:
docker volume create --driver ceph --opt pool=ssd-pool --opt image=vol-001 --opt size=50G app-db-vol。插件收到请求后自动调用rbd create和rbd map,生成并映射块设备到宿主机。 -
容器挂载该卷:
docker run -v app-db-vol:/var/lib/mysql mysql:8.0。Docker 不关心底层是本地文件还是 RBD 设备,只按标准 mount 流程绑定已准备好的设备路径(如/dev/rbd0)到容器内。
关键配置项与注意事项
不同块存储后端需提供明确的认证与拓扑参数:
- Ceph:需
monitors列表、pool名、user、keyring路径或 base64 密钥;启用krbd内核模块确保 RBD 设备可被识别。 - iSCSI:需
target_iqn、portal(IP:port)、lun编号;宿主机须安装open-iscsi并能执行iscsiadm。 - AWS EBS:需
region、availabilityZone、volumeType(gp3/io2);通常搭配rexray/ebs插件,依赖 AWS IAM 权限策略。 - 所有插件必须运行在宿主机上,且 Docker Daemon 需启用插件支持(默认开启),不可在容器内运行插件进程。
为什么不用 Bind Mount 或 local 驱动硬连?
绑定挂载(Bind Mount)要求宿主机先手动挂载好块设备(如 mount /dev/sdb1 /mnt/ceph-data),再映射进容器——这绕过了卷生命周期管理,无法自动创建/扩容/清理,也做不到跨节点调度。local 驱动虽支持 device 参数,但仅限于已存在的本地块设备路径,不具备发现、认证、映射、多路复用等企业级能力,不满足动态挂载需求。



















