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