我可以在 docker 容器中操作 Linux 内核模块/设备吗?
Can I operate on Linux kernel modules / devices from within a docker container?
这方面的信息非常少。
关于我是否可以在 docker 容器中执行 depmod
、insmod
、rmmod
和 modprobe
等操作的权威来源是什么?
这假设容器 运行 完全相同 Linux(当然在内核方面是这样,而且在构建模块时,内核头文件与加载内核的头文件完全相同)。
我的容器需要可访问的设备,我已经在容器中使用了 docker run --privileged
和 --device
、mknod
并且很少有其他操作不会抱怨,我可以在 journalctl 中看到事情正在发生,但我想确保这不是错误的方法。
你不能 (*)。
Docker 这里有两个主要的设计目标妨碍了您:
容器可以 运行 在很大程度上独立于其主机系统;您可以 运行 在带有 GNU libc 的 Fedora 主机上使用带有 musl libc 的 Alpine 容器。但是内核模块非常特定于它们所针对的确切内核。如果例行的主机系统更新向内核添加供应商补丁,它会破坏您的形象。
容器不应该在没有被明确授予权限的情况下访问自己容器之外的东西。内核模块可以绕过一切——文件系统权限、容器边界、用户ID——因此容器通常不允许运行insmod
和类似的命令,即使容器进程运行宁作为根。
如果您的进程需要访问主机设备并加载自定义内核模块,并且通常与 Docker 的隔离系统不兼容,那么最好直接 运行主机而不是在容器中。
(*) ...好吧,你 可以 ,如果在启动时你从主机绑定挂载内核头文件并为当前 -运行ning 内核,如果容器是 运行ning --privileged
。 (您可能只需要 --cap-add SYS_MODULE
。)但是这条路径比 运行 一个主机根进程要复杂得多,而且并不安全。
这方面的信息非常少。
关于我是否可以在 docker 容器中执行 depmod
、insmod
、rmmod
和 modprobe
等操作的权威来源是什么?
这假设容器 运行 完全相同 Linux(当然在内核方面是这样,而且在构建模块时,内核头文件与加载内核的头文件完全相同)。
我的容器需要可访问的设备,我已经在容器中使用了 docker run --privileged
和 --device
、mknod
并且很少有其他操作不会抱怨,我可以在 journalctl 中看到事情正在发生,但我想确保这不是错误的方法。
你不能 (*)。
Docker 这里有两个主要的设计目标妨碍了您:
容器可以 运行 在很大程度上独立于其主机系统;您可以 运行 在带有 GNU libc 的 Fedora 主机上使用带有 musl libc 的 Alpine 容器。但是内核模块非常特定于它们所针对的确切内核。如果例行的主机系统更新向内核添加供应商补丁,它会破坏您的形象。
容器不应该在没有被明确授予权限的情况下访问自己容器之外的东西。内核模块可以绕过一切——文件系统权限、容器边界、用户ID——因此容器通常不允许运行
insmod
和类似的命令,即使容器进程运行宁作为根。
如果您的进程需要访问主机设备并加载自定义内核模块,并且通常与 Docker 的隔离系统不兼容,那么最好直接 运行主机而不是在容器中。
(*) ...好吧,你 可以 ,如果在启动时你从主机绑定挂载内核头文件并为当前 -运行ning 内核,如果容器是 运行ning --privileged
。 (您可能只需要 --cap-add SYS_MODULE
。)但是这条路径比 运行 一个主机根进程要复杂得多,而且并不安全。