我正在尝试在 redhat 中设置一个容器。容器也应该运行与主机相同的 redhat 版本。在探索这些时,我遇到了 virsh 和 docker。Virsh 支持基于主机的容器并与主机共享用户空间。在这里,我对用户空间感到困惑。它是否意味着文件系统空间或其他东西。有人可以澄清一下吗?此外,在哪些场景/情况下可以使用 virsh(基于主机的容器),以便我可以断定使用 virsh 或 docker 是否更好。在我的情况下,我需要在 redhat 主机中设置一个 redhat 容器,并在每个容器中运行同一进程的多个实例。容器应该在不使用网络接口的情况下相互交换数据。
2 回答
这应该有助于澄清:http ://rhelblog.redhat.com/2015/07/29/architecting-containers-part-1-user-space-vs-kernel-space/
听起来您真的想使用带有 -v 绑定挂载的 Docker 来共享数据。那是未来一天的文章:-)
当前内核还不支持用户命名空间。这是当前容器化解决方案的一个已知限制。不幸的是,用户名空间是在最新的内核版本(从内核 3.8 开始)http://kernelnewbies.org/Linux_3.8中实现的,尽管它尚未在许多主流发行版中启用。
这是目前容器的最大限制之一,如果您是容器中的 root (ID 1),那么您是操作容器的机器上的 root。
这是一个影响任何基于 LXC 的产品的问题,尽管有强烈的推动力来解决这个问题。它实际上是一个需要的东西!
替代方案是使用硬 Selinux 监禁或使用弱势用户帐户并为每个容器分配不同的用户。
从 Libvirt 文档https://libvirt.org/drvlxc.html:
用户和组隔离 如果来宾配置没有列出任何 ID 映射,那么容器内使用的用户和组 ID 将与容器外使用的匹配。此外,与容器中的进程关联的功能将推断出与主机中的进程相同的特权。这对安全性有明显的影响,因为容器内的 root 用户将能够访问容器可见的 root 拥有的任何文件,并或多或少地执行任何特权内核操作。在没有来自 sVirt 的额外保护的情况下,这意味着容器内的 root 用户实际上与主机中的 root 用户一样强大。root 用户没有安全隔离。
引入了 ID 映射工具以允许对容器内用户的权限进行更严格的控制。它允许应用程序定义规则,例如“容器中的用户 ID 0 映射到主机中的用户 ID 1000”。此外,与能力相关的特权有所减少,因此它们不能用于逃离容器环境。用户命名空间的完整描述超出了本文档的范围,但是 LWN 对此主题有很好的描述。从 libvirt 的角度来看,要记住的关键是在容器 XML 配置中为用户和组定义 ID 映射会导致 libvirt 激活用户命名空间功能。