34 Linux 容器 #
34.1 设置 LXC 发行套件容器 #
容器是包含应用程序的代码及其所有依赖项的自包含软件。容器化应用程序可以快速完成部署,并可在计算环境中可靠运行。
要设置 LXC 容器,需要创建一个包含 Guest 发行套件的根文件系统。
目前没有任何 GUI 可用于创建根文件系统。请以 root 身份运行 virt-create-rootfs
命令,以设置新的根文件系统。执行以下步骤在 /path/to/rootfs 中创建新的根
文件系统。
virt-create-rootfs
需要使用注册代码来设置 SUSE Linux Enterprise Server 根文件系统。
运行
virt-create-rootfs
命令:tux >
virt-create-rootfs --root /PATH/TO/ROOTFS --distro SLES-12.0 -c REGISTRATION_CODE使用
chroot
命令更改根文件系统的根路径:tux >
chroot /path/to/rootfs使用
passwd
更改root
用户的口令。创建一个不具有
root
特权的操作员
用户:useradd -m operator
更改操作员的口令:
passwd operator
使用
exit
退出 chroot 环境。
启动虚拟机管理器。
(可选) 单击 › 以添加一个本地 LXC 连接(如果尚不存在)。
选择
作为超级管理程序,然后单击 。选择
连接并单击 菜单。激活
并单击 。键入过程 34.1 “创建根文件系统”中所述的根文件系统路径,然后单击 按钮。
选择要分配给该容器的最大内存量和最大 CPU 数量。然后单击
按钮。键入容器的名称。对容器运行的所有
virsh
命令都将使用此名称。单击
。选择要将容器连接到的网络,然后单击 按钮:系统随即会创建并启动该容器。此外一个控制台会自动打开。
对于网络设备以及具有网络功能的 hostdev 设备,系统可能会为其提供要在 Guest 中的网络设备上设置的一个或多个 IP 地址。但某些超级管理程序或网络设备会直接忽略这些 IP 地址,或者只使用第一个 IP 地址。
使用 virsh 编辑容器 XML 配置:
tux >
virsh -c lxc:/// edit MYCONTAINER下面的示例说明如何设置一个或多个 IP 地址:
[...] <devices> <interface type='network'> <source network='default'/> <target dev='vnet0'/> <ip address='192.168.122.5' prefix='24'/> <ip address='192.168.122.5' prefix='24' peer1='10.0.0.10'/> <route family2='ipv4' address3='192.168.122.0' prefix4='24' gateway5='192.168.122.1'/> <route family2='ipv4' address3='192.168.122.8' gateway5='192.168.122.1'/> </interface> [...] <hostdev mode='capabilities' type='net'> <source> <interface>eth0</interface> </source> <ip address='192.168.122.6' prefix='24'/> <route family='ipv4' address='192.168.122.0' prefix='24' gateway='192.168.122.1'/> <route family='ipv4' address='192.168.122.8' gateway='192.168.122.1'/> </hostdev> </devices> [...]
您还可以添加 route 元素来定义要在 Guest 中添加的 IP 路由。这些路由将由 LXC 驱动程序使用。
[...] <devices> <interface type1='ethernet'> <source>2 <ip address3='192.168.123.1' prefix='24'/> <ip address4='10.0.0.10' prefix='24' peer='192.168.122.5'/> <route5 family='ipv4' address='192.168.42.0' prefix='24' gateway='192.168.123.4'/> </source> [...] </interface> [...] </devices> [...]
对于
以太网
类型的网络设备,可以选择性地为其提供要在网络设备主机端设置的一个或多个 IP 地址(3、4),以及一个或多个路由 (5)。这些 IP 地址和路由将配置为接口的
source
元素 (2) 的子元素。它们的属性与用于配置接口 Guest 端的名称类似的元素的属性相同(请参见上一步)。以太网
类型的网络设备的第一个 IP 地址。以太网
类型的网络设备的第二个 IP 地址。要在网络设备主机端设置的路由。
http://libvirt.org/formatnetwork.html#elementsStaticroute 上提供了有关此元素的属性的更多细节。
保存更改并退出编辑器。
要配置容器网络,请编辑 /etc/sysconfig/network/ifcfg-*
文件。
34.2 设置 LXC 应用程序容器 #
Libvirt 还允许在容器中仅运行应用程序,而无需运行庞大的 Linux 发行套件。在此示例中,bash
将在自己的容器中启动。
启动虚拟机管理器。
(可选) 单击 › 以添加一个本地 LXC 连接(如果尚不存在)。
选择
作为超级管理程序,然后单击 。选择
连接并单击 菜单。激活
并单击 。设置要启动的应用程序的路径。例如,在字段中填充
/bin/sh
,这样就可以创建第一个容器。单击 。选择要分配给该容器的最大内存量和最大 CPU 数量。单击
。键入容器的名称。对容器运行的所有
virsh
命令都将使用此名称。单击
。选择要将容器连接到的网络,然后单击 。系统即会创建并启动该容器。一个控制台将会自动打开。请注意,当应用程序运行完后,系统会销毁该容器。
34.3 使用 AppArmor 保护容器 #
默认未使用 AppArmor 或 SELinux 来保护容器。没有任何图形用户界面可用来更改 libvirt 域的安全模型,但 virsh
可提供帮助。
使用 virsh 编辑容器 XML 配置:
tux >
virsh -c lxc:/// edit MYCONTAINER将以下内容添加到 XML 配置中,然后保存配置并退出编辑器。
<domain> ... <seclabel type="dynamic" model="apparmor"/> ... </domain>
设置此配置,系统将会在
/etc/apparmor.d/libvirt
目录中为容器创建 AppArmor 配置文件。默认配置文件仅允许最少量的应用程序在容器中运行。可以通过修改libvirt-CONTAINER-uuid
文件来更改此设置:libvirt 不会重写此文件。
34.4 libvirt LXC 驱动程序与 LXC 之间的差异 #
SUSE Linux Enterprise Server 11 SP3 随附的是 LXC,而 SUSE Linux Enterprise Server 12 随附的是 libvirt LXC 驱动程序(为避免混淆,有时称为 libvirt-lxc)。容器在这些工具中的管理或配置方式是不同的。下面列出了部分差异。
主要差异在于,libvirt 中的域配置是一个 XML 文件,而 LXC 配置是一个属性文件。大多数 LXC 属性都可映射到域 XML。无法迁移的属性如下:
lxc.network.script.up:可以使用
/etc/libvirt/hooks/network
libvirt 钩子实现此脚本,不过需要调整该脚本。lxc.network.ipv*:libvirt 无法基于域配置设置容器网络配置。
lxc.network.name:libvirt 无法设置容器网卡名称。
lxc.devttydir:libvirt 不允许更改控制台设备的位置。
lxc.console:目前无法将控制台输出记录到 libvirt LXC 容器主机上的文件中。
lxc.pivotdir:libvirt 不允许微调用于
pivot_root
的目录。将使用/.olroot
。lxc.rootfs.mount:libvirt 不允许微调此项。
LXC VLAN 网络会自动在主机上创建 VLAN 接口,然后将其移入 Guest 名称空间。libvirt-lxc 配置只能为 Open vSwitch tap 设备或 SR-IOV VF 的 PCI 直通指出 VLAN 标记 ID。转换工具实际上需要用户手动在主机端创建 VLAN 接口。
LXC rootfs 也可以是映像文件,但 LXC 会强行突破装入点,以尝试检测适当的文件系统格式。libvirt-lxc 可以装入多种格式的映像文件,但不显式支持格式参数的“auto”值。这意味着,在此情况下,用户需要优化生成的配置才能获得适当的匹配项。
LXC 支持任何 cgroup 配置(即使是将来的配置),而 libvirt 域配置需要映射每个 cgroup 配置。
LXC 可以在 rootfs 中装入块设备,但无法装入原始分区文件:需要手动将文件挂接到循环设备。相比之下,libvirt-lxc 既可以装入块设备,也可以装入任何格式的分区文件。
34.5 跨容器共享名称空间 #
与 Docker 开源引擎一样,libvirt 可让您从容器或进程继承名称空间,以共享网络名称空间。下面的示例说明如何共享所需的名称空间。
<domain type='lxc' xmlns:lxc='http://libvirt.org/schemas/domain/lxc/1.0'> [...] <lxc:namespace> <lxc:sharenet type='netns' value='red'/> <lxc:shareuts type='name' value='CONTAINER_1'/> <lxc:shareipc type='pid' value='12345'/> </lxc:namespace> </domain>
netns
选项特定于 sharenet
。可通过此选项使用现有的网络名称空间(无需为容器创建新的网络名称空间)。在这种情况下,将忽略 privnet
选项。
34.6 更多信息 #
- LXC 容器驱动程序