是否可以在另一个 LXC 容器内启动 LXC 容器?
答案1
我要在这里消除一些误解。
这真是个坏主意。我很抱歉。 – Jacob 3 月 5 日 20:30
我不认为这是个坏主意。它实际上只是 chroot 中的 chroot。一方面,它可能会以某种可忽略不计的方式降低性能(与在 VM 中运行 VM 相比,这算不了什么)。另一方面,它可能会更安全(例如,与根主机系统及其组成部分更加隔离)。
你真的有这样做的真正理由吗?请记住,这里的问题应该是你面临的实际问题。– Zoredache 3 月 5 日 21:52
我完全同意发帖人的以下评论。此外,我认为可以肯定的是,在这里发帖的每个人都可能认为他们有真正的理由这样做。
我认为 lxc 应该能够简化虚拟机迁移(以及备份和恢复)。但我不确定在无法访问主机操作系统的情况下(例如廉价 vps)。– Mikhail 3 月 6 日 11:17
事实上,早在 6 月份我第一次深入研究 PaaS/IaaS 项目的 LXC 时就遇到过这个问题,当时我对允许用户模拟云环境以用于开发目的的能力特别感兴趣。
LXCeption。我们太深了。 – Tom O'Connor 3 月 6 日 22:46
当我读到这篇文章时,我笑了,但事实并非如此:)
无论如何,在阅读完所有这些内容后,我最终设置了一个 VirtualBox 环境,其中安装了 Ubuntu 12.04 LTS 服务器版,认为这 100% 是可行的。安装 LXC 后,我创建了一个新容器,并使用 apt-get 在容器内安装了 LXC。大部分安装进展顺利,但最终由于 cgroup-lite 软件包的问题导致错误,该软件包安装后,其 upstart 作业无法启动。
经过一番搜索,我发现了这个stgraber.org 上的精彩文章(好东西隐藏在“容器嵌套”部分下):
sudo apt-get install lxc
sudo lxc-create -t ubuntu -n my-host-container -t ubuntu
sudo wget https://www.stgraber.org/download/lxc-with-nesting -O /etc/apparmor.d/lxc/lxc-with-nesting
sudo /etc/init.d/apparmor reload
sudo sed -i "s/#lxc.aa_profile = unconfined/lxc.aa_profile = lxc-container-with-nesting/" /var/lib/lxc/my-host-container/config
sudo lxc-start -n my-host-container
(in my-host-container) sudo apt-get install lxc
(in my-host-container) sudo stop lxc
(in my-host-container) sudo sed -i "s/10.0.3/10.0.4/g" /etc/default/lxc
(in my-host-container) sudo start lxc
(in my-host-container) sudo lxc-create -n my-sub-container -t ubuntu
(in my-host-container) sudo lxc-start -n my-sub-container
安装该 AppArmor 策略并重新启动守护程序即可解决问题(但不要忘记更改网络范围!)。事实上,我认为该特定代码片段非常重要,所以我将其镜像到 @http://pastebin.com/JDFp6cTB以防文章离线。
之后就sudo /etc/init.d/cgroup-lite start
成功了,一切顺利。
因此,是的,可以在另一个 LXC 容器内启动一个 LXC 容器:)
答案2
使用 Ubuntu 14.04(可信赖),您只需在父容器配置中添加以下内容:
lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting
参考:https://ubuntu.com/server/docs/containers-lxc (搜索“嵌套”)
确保在启动之前已预先配置好网络,以避免在登录屏幕出现之前长时间暂停!
高血压
答案3
是的,你可以使用嵌套的 LXC 容器,尽管第一条评论是这样的,但在某些时候和用例中,嵌套容器确实很有用。请参阅 Stephane Graber 的 10 部分 LXC 博客,特别是“容器嵌套”部分 -
Stephane Graber 关于 LXC 的 10 部分系列文章
用例:假设您想要一个多租户 LXC 环境。为每个人或组织创建 1 个主容器,确保通过将 2 个命令添加到 LXC 容器配置文件来启用嵌套。接下来在每个主容器中创建嵌套子容器,在其中安装每个组所需的应用程序、桌面等。请注意,主容器的默认网络为 10.0.3.x,而嵌套容器默认为 10.0.4.x(您可以根据需要更改)。
最大的优势是什么我曾经使用过嵌套 LXC?如果您使用 lxc-stop 停止主容器,然后使用 lxc-clone 克隆它,那么您不仅可以克隆主容器,还可以克隆所有子容器……这对于快速备份非常方便。如果您想使用 CRIU 进行 LXC 实时迁移,这种方法也很方便。当您将其中一个主容器迁移到另一台机器时……您实际上也在迁移它以及所有嵌套容器。
最后,作为 LXC 嵌套的一个很酷的例子,Stephane Graber 和其他人使用 LXC、BPG 和 OSPF 构建了一个“互联网”模拟器,所有这些都包含在 1 个 LXC 容器中。在 1 个 LXC“主或父”LXC 容器内,有 512 个嵌套的 LXC 容器,每个容器都运行 Quagga 进行 BGP/OSPF 路由。这 512 个互联网“节点”一起模拟互联网。此实现在 2014 年 NSEC 安全会议上用于所有与会者试验互联网安全性。
源代码位于 Githug 上: 2014 NSEC LXC 互联网模拟器 github 代码
答案4
另外...你知道吗,现在可以将所有 Openstack 安装到单个 LXC 容器中。每个 Openstack“服务”(nova、swift 等)都安装到“主/父”容器内的“嵌套”lxc 容器中。
安装所有内容需要一段时间,但完成后,您可以在笔记本电脑或台式机上拥有一个良好的测试 OpenStack 环境来进行实验。
如果您想停止 OpenStack,只需使用 lxc-stop 主/父容器即可重新启动 Openstack。