我想在 Linux 主机上设置一个 docker 服务(docker-compose),其中一个容器将整个 [可移动] 物理硬盘驱动器安装为 docker 卷。
我知道在 docker-compose 中设置绑定挂载很简单,我可以在主机上手动挂载驱动器。这种方法确实有效,但它涉及手动步骤,并有可能出现人为错误。当此服务以主机驱动器根分区上的空白目录启动时,会发生不好的事情。如果驱动器在仍然安装的情况下被拔掉,会发生更糟糕的事情。
我想做的是让 docker 将设备直接安装为卷。这将具有更少/更简单的手动步骤和故障保护的优点,如果驱动器丢失,服务将无法启动。这也将确保我们在服务停止时卸载驱动器。
鉴于卷基本上只是操作系统挂载,感觉这应该很简单,但是通过文档进行了大量搜索,我仍然没有进一步前进。
在 linux docker 主机上,这可以通过首先使用
local
驱动程序创建命名卷来实现。命名卷只是容器启动时挂载内容的规范,因此在创建卷时不需要插入设备。
您首先从 docker 创建一个命名卷。假设我要挂载的设备是 ext4 驱动器,并且将始终显示为
/dev/disk/by-uuid/d28c6d3a-461e-4d7d-8737-40e56e8f384a
:注意:在 linux 下设备名称可以经常改变。所以使用类似的东西不是一个好主意,
/dev/sdb1
因为你不能保证它总是被命名sdb1
。在上面的示例中,我使用 uuid 来确保始终安装正确的设备。对于docker
/仅docker-compose
将设备安装到容器中不是受支持的用例,因此没有直接的方法可以做到这一点(至少据我所知)。更新:实际上这由
local
音量驱动程序支持,请参阅接受的答案。这个答案只是一个可能的解决方法。但是您可以将块设备传递给带有
--device
标志docker run
(或相应的devices
属性)的docker-compose
容器,并手动将设备安装到您的容器中 - 例如使用适当的入口点脚本。请注意,挂载块设备需要增强功能,这些功能通常会为新容器删除,因此您还需要添加该
CAP_SYS_ADMIN
功能,如下所示:(
docker-compose
查看cap_add
属性)然后,您可以手动或在脚本/自定义入口点中将磁盘挂载到容器中:
这种方法只需要您将设备的安装添加到您的容器中,然后就可以满足您的所有其他要求:
mount
!)docker-compose
为避免在拔出/插入设备时更改设备名称出现问题,您可以使用在
/dev/disk/by-label/
或中为其创建的符号链接之一/dev/disk/by-uuid/
。