跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 使用 LXC 管理虚拟机 / Linux 容器
适用范围 SUSE Linux Enterprise Server 15 SP2

34 Linux 容器

34.1 设置 LXC 发行套件容器

容器是包含应用程序的代码及其所有依赖项的自包含软件。容器化应用程序可以快速完成部署,并可在计算环境中可靠运行。

要设置 LXC 容器,需要创建一个包含 Guest 发行套件的根文件系统。

过程 34.1︰ 创建根文件系统

目前没有任何 GUI 可用于创建根文件系统。请以 root 身份运行 virt-create-rootfs 命令,以设置新的根文件系统。执行以下步骤在 /path/to/rootfs 中创建新的文件系统。

重要
重要:需要注册代码

virt-create-rootfs 需要使用注册代码来设置 SUSE Linux Enterprise Server 根文件系统。

  1. 运行 virt-create-rootfs 命令:

    tux > virt-create-rootfs --root /PATH/TO/ROOTFS --distro SLES-12.0 -c REGISTRATION_CODE
  2. 使用 chroot 命令更改根文件系统的根路径:

    tux > chroot /path/to/rootfs
  3. 使用 passwd 更改 root 用户的口令。

  4. 创建一个不具有 root 特权的操作员用户:

    useradd -m operator
  5. 更改操作员的口令:

    passwd operator
  6. 使用 exit 退出 chroot 环境。

过程 34.2︰ 定义容器
  1. 启动虚拟机管理器。

  2. (可选) 单击文件 › 添加连接以添加一个本地 LXC 连接(如果尚不存在)。

    选择 LXC(Linux 容器)作为超级管理程序,然后单击连接

  3. 选择 localhost (LXC) 连接并单击文件 新建虚拟机菜单。

  4. 激活操作系统容器并单击前进

  5. 键入过程 34.1 “创建根文件系统”中所述的根文件系统路径,然后单击前进按钮。

  6. 选择要分配给该容器的最大内存量和最大 CPU 数量。然后单击前进按钮。

  7. 键入容器的名称。对容器运行的所有 virsh 命令都将使用此名称。

    单击高级选项。选择要将容器连接到的网络,然后单击完成按钮:系统随即会创建并启动该容器。此外一个控制台会自动打开。

过程 34.3︰ 配置网络接口的 IP 地址

对于网络设备以及具有网络功能的 hostdev 设备,系统可能会为其提供要在 Guest 中的网络设备上设置的一个或多个 IP 地址。但某些超级管理程序或网络设备会直接忽略这些 IP 地址,或者只使用第一个 IP 地址。

  1. 使用 virsh 编辑容器 XML 配置:

    tux > virsh -c lxc:/// edit MYCONTAINER
  2. 下面的示例说明如何设置一个或多个 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>
    [...]

    1

    可选属性。包含点对点网络设备另一端的 IP 地址。

    2

    可设置为 ipv4ipv6

    3

    包含 IP 地址。

    4

    可选参数(如果不指定,则会自动设置)。定义网络掩码中的 1 位的数量。对于 IPv4,将根据网络类别ABC)确定默认前缀。对于 IPv6,默认前缀为 64

    5

    如果您未在 XML 文件中指定默认网关,将不会设置网关。

  3. 您还可以添加 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>
    [...]

    1

    对于以太网类型的网络设备,可以选择性地为其提供要在网络设备主机端设置的一个或多个 IP 地址(34),以及一个或多个路由 (5)。

    这些 IP 地址和路由将配置为接口的 source 元素 (2) 的子元素。它们的属性与用于配置接口 Guest 端的名称类似的元素的属性相同(请参见上一步)。

    3

    以太网类型的网络设备的第一个 IP 地址。

    4

    以太网类型的网络设备的第二个 IP 地址。

    5

    要在网络设备主机端设置的路由。

    http://libvirt.org/formatnetwork.html#elementsStaticroute 上提供了有关此元素的属性的更多细节。

  4. 保存更改并退出编辑器。

注意
注意:容器网络

要配置容器网络,请编辑 /etc/sysconfig/network/ifcfg-* 文件。

34.2 设置 LXC 应用程序容器

Libvirt 还允许在容器中仅运行应用程序,而无需运行庞大的 Linux 发行套件。在此示例中,bash 将在自己的容器中启动。

过程 34.4︰ 使用 YaST 定义应用程序容器
  1. 启动虚拟机管理器。

  2. (可选) 单击文件 › 添加连接以添加一个本地 LXC 连接(如果尚不存在)。

    选择 LXC(Linux 容器)作为超级管理程序,然后单击连接

  3. 选择 localhost (LXC) 连接并单击文件 新建虚拟机菜单。

  4. 激活应用程序容器并单击前进

    设置要启动的应用程序的路径。例如,在字段中填充 /bin/sh,这样就可以创建第一个容器。单击前进

  5. 选择要分配给该容器的最大内存量和最大 CPU 数量。单击前进

  6. 键入容器的名称。对容器运行的所有 virsh 命令都将使用此名称。

    单击高级选项。选择要将容器连接到的网络,然后单击完成。系统即会创建并启动该容器。一个控制台将会自动打开。

    请注意,当应用程序运行完后,系统会销毁该容器。

34.3 使用 AppArmor 保护容器

默认未使用 AppArmor 或 SELinux 来保护容器。没有任何图形用户界面可用来更改 libvirt 域的安全模型,但 virsh 可提供帮助。

  1. 使用 virsh 编辑容器 XML 配置:

    tux > virsh -c lxc:/// edit MYCONTAINER
  2. 将以下内容添加到 XML 配置中,然后保存配置并退出编辑器。

    <domain>
        ...
        <seclabel type="dynamic" model="apparmor"/>
        ...
    </domain>
  3. 设置此配置,系统将会在 /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 容器驱动程序

http://libvirt.org/drvlxc.html