到目前为止,我认为容器技术(例如:docker)提供了所需的隔离和操作系统级别的虚拟化。并且在容器中运行的应用程序受到命名空间、cgroups、apparmour/selinux、功能的限制,它们无法确定它们所在的主机环境。但似乎这种理解并不是 100% 正确的。
正如 wiki -操作系统级虚拟化
操作系统级虚拟化是一种操作系统范式,其中内核允许存在多个隔离的用户空间实例。此类实例,称为容器(LXC、Solaris 容器、Docker)、区域(Solaris 容器)、虚拟专用服务器 (OpenVZ)、分区、虚拟环境 (VE)、虚拟内核 (DragonFly BSD) 或监狱(FreeBSD 监狱或 chroot 监狱),从运行在其中的程序的角度来看, 1可能看起来像真正的计算机。在普通操作系统上运行的计算机程序可以看到该计算机的所有资源(连接的设备、文件和文件夹、网络共享、CPU 能力、可量化的硬件能力)。但是,在容器内运行的程序只能看到容器的内容和分配给容器的设备。
从上面的引用来看,它似乎只增加了隔离和抽象,而没有像虚拟化那样。
由于 Java 团队必须向 JVM 添加容器支持,因此它不会直接查看主机环境,而是将 ITSELF 限制为 docker 提供的隔离/抽象。
参考:
- 在 docker 容器中运行的 Java(JDK8 更新 131 之前)应用程序 CPU/内存问题? 很好的答案解释了 JVM 对 linux 容器的支持。
Linux 容器支持最早出现在 JDK 10,然后移植到 8u191,
这是否意味着在容器环境中运行的 C 程序可以绕过限制并访问/读取主机环境详细信息。当然,当它尝试(即使用此信息)做任何超出容器允许做的事情时,容器引擎可能会终止容器本身的进程。
因此,如果我正在开发一个 C/C++ 应用程序来请求/查询主机资源(如 CPU/MEM/Devices 等),那么我是否有责任通过添加容器支持使应用程序在容器环境中按预期运行。