如果在 linux 中一切都“只是”一个文件,那么 /dev
中的文件/节点与其他文件有何不同,使得 docker 必须以不同的方式处理它们?
docker 对设备文件有什么不同?我希望它是更详细的绑定命令的简写?
事实上,在对设备文件(例如 --volume /dev/spidev0.0:/dev/spidev0.0
)进行常规绑定挂载后,用户在尝试访问设备时会在 docker 容器中获得“权限被拒绝”。通过 --device /dev/spidev0.0:/dev/spidev0.0
绑定时,它按预期工作。
答案 0 :(得分:1)
Docker run reference 页面包含指向 cgroup device whitelist controller 上的 Linux 内核文档的链接。在多个方面,在容器中以 root 身份运行的进程比在主机上以 root 身份运行的同一进程受到的限制要多一些:如果没有特殊的额外权限(功能),您无法重新启动主机、挂载文件系统、创建虚拟 NIC 或任何其他各种系统管理任务。设备系统与能力系统是分开的,但本质上是相同的。
另一种思考方式是将其视为安全功能。容器通常不应该能够访问主机的文件系统或其他进程,即使它以 root 身份运行。但是如果容器进程可以mknod kmem c 1 2
访问内核内存,或者mknod sda b 8 0
猜测主机的硬盘看起来像一个SCSI磁盘,理论上它可以通过直接访问低级资源来摆脱这些限制。 cgroup 设备限制可以防止这种情况发生。
由于 Docker 旨在作为隔离系统,其中容器是无法访问主机资源的受限环境,因此运行需要物理设备或主机文件的任务充其量是不方便的。如果 Docker 的隔离特性没有意义,那么该进程可能会直接在主机上运行得更好,而不涉及 Docker。