可用的 LXC 环境
除了一个支持容器的内核外,还需要一些工具才能够简单地启动和管理容器。本文的容器管理工具来自 liblxc(从 参考资料 获取链接。另外,还可以使用 libvirt)。这个小节讨论:
liblxc 工具
iproute2 工具
如何配置网络
如何填充一个容器文件系统(构建定制的 Debian 容器,还是运行 ssh 容器)
如何连接到容器文件系统(SSH、VNC、VT: tty、VT: GUI)
工具:liblxc
下载并解压缩 liblxc (见 参考资料),然后从 liblxc 目录中:
./configure --prefix=/
make
make install
如果您习惯于构建源 RPM,可以从网上下载一个(见 参考资料)。
工具:iproute2
为了在容器中管理网络接口,需要 2.6.26 或更高版本的 iproute2 包(见 参考资料)。如果您的 Linux 发行版没有这个包,请下载并按照说明配置和安装它。
配置网络
很多实用的容器的另一个关键部分是网络访问。目前,桥接(连接多个以太网区段,使它们成为一个单独的以太网区段)是将一个容器连接到网络的最佳方法。为了准备使用 LXC,我们将创建一个桥(见 参考资料),并使用它将我们真正的网络接口与容器的网络接口连接起来。
创建一个名为 br0 的桥:
brctl addbr br0
brctl setfd br0 0
用一个已有网络接口中的 IP(在本例中是 10.0.2.15)连接桥接口:ifconfig br0 10.0.2.15 promisc up。将已有的网络接口(在本例中是 eth0)添加到桥,并取消它与它的 IP 地址的直接关联:
brctl addif br0 eth0
ifconfig eth0 0.0.0.0 up
任何添加到桥 br0 的接口都将对那个 IP 地址作出响应。最后,确保默认的路由用 route add -net default gw 10.0.2.2 br0 将数据包发送到网关。以后,在配置容器时,指定 br0 作为通往外界的链接。
填充容器文件系统
除了网络外,容器常常需要它们自己的文件系统。取决于您的需要,有几种填充容器文件系统的方法。我将讨论其中两种:
构建一个定制的 Debian 容器
运行一个 ssh 容器
使用 debootstrap 命令构建一个定制的 Debian 容器 非常简单:
如果要构建大量的容器,首先将包下载到一个 tarball 中可以节省时间,例如 debootstrap --make-tarball sid.packages.tgz sid 。这将产生一个 .tar 文件,这个文件约 71MB(压缩了 52MB),而一个根目录约 200MB。然后开始在 rootfs 中构建根目录:debootstrap --unpack-tarball sid.packages.tgz sid rootfs。(debootstrap 主页上有更多关于构建更小的或更适合的容器的信息)。
这将生成一个宿主容器高度冗余的环境(见 参考资料)。
运行 ssh 容器 可以大大减少容器文件系统占用的磁盘空间。例如,这种方法仅仅使用数 KB 就能在不同容器的 22 端口上运行多个 ssh 守护进程(参考资料 中提供了一个例子)。容器通过使用关键根目录来实现这一点,例如 /bin、/sbin 和 /lib 等的只读绑定挂载共享来自已有 Linux 系统的 sshd 包内容。这里使用一个网络名称空间,并创建基本的读写内容。
用于生成那些轻量级容器的方法与用于生成 chroot 环境的方法基本一样。不同之处在于只读绑定挂载和使用名称空间增强 chroot 环境的隔离性,使之成为有效的容器。
接下来,需要选择一种连接到容器的方法。
连接到容器
接下来的步骤是连接到容器。根据配置容器的不同方式,有几种方法可供选择:
SSH
VNC(GUI)
VT: tty(文本)
VT: X(GUI)
如果不需要用于容器的 GUI 接口,那么 通过 SSH 连接 就可以了。在此情况下,一个简单的 ssh 连接就足够了(参见上面的 “运行一个 ssh 容器”)。这种方法的优点是依靠 IP 寻址来支持创建任意数量的容器。
如果 ssh 连接花很长的时间才到达密码提示,那么在 DNS 查找期间 Avahi multicast DNS/Service Discovery 守护进程就可能超时。
通过 Virtual Network Computing(VNC)连接,这种方法可以为容器增加一个 GUI 接口。
使用 vnc4server 启动一个 X 服务器,该服务器只为 VNC 客户机服务。需要安装 vnc4server,以便从容器的 /etc/rc.local 文件运行它,如下所示:echo '/usr/bin/vnc4server :0 -geometry 1024x768 -depth 24' >> rootfs/etc/rc.local。当容器启动时,将创建一个分辨率为 1024×768 的 24 位色的 X 屏幕。接下来的连接很简单,如下所示:
vncviewer <ip>:<display>
如果容器与它的宿主共享 tty,那么 通过 VT: tty(文本)连接 就很有用。在这情况下,可以使用 Linux Virtual Terminals(VT)连接到容器。使用 VT 的简单用法是登录 tty 设备之一,然后这个 tty 设备将与 Linux VT 通信。登录进程被称作 getty。使用 VT 8:
echo '8:2345:respawn:/sbin/getty 38400 tty8'
>> rootfs/etc/inittab
一旦容器被启动,它将在 tty8 上运行 getty,以允许用户登录到容器中。可以通过类似的技巧,使用 LXC 工具重新启动容器。
这种方法不支持容器的图形化界面。而且,由于每次只有一个进程可以连接到 tty8,若要启用多个容器,则需要进一步配置。
通过 VT: X 连接 让您可以运行一个 GUI。在 VT 9 上运行 GNOME Display Manager(gdm),然后编辑 rootfs/usr/share/gdm/defaults.conf,将 FirstVT=7 替换为 FirstVT=9,以及将 VTAllocation=true 替换为 VTAllocation=false。
虽然这样便可以使用一个图形化界面,但是仍然只能使用有限的几种 Linux 虚拟终端之一。