📜  Linux 虚拟化:Linux 容器 (lxc)

📅  最后修改于: 2022-05-13 01:57:27.635000             🧑  作者: Mango

Linux 虚拟化:Linux 容器 (lxc)

先决条件:

  • 早些时候我谈到了 chroot jails 和使用 cgroups 的资源限制。
    如果您还没有阅读它们,那么我强烈建议您在继续之前先阅读它们。
  • https://www.youtube.com/watch?v=sK5i-N34im8
    docker 团队的精彩演讲。
    这将刷新上面学到的一些概念。该视频充当了本文与上述早期文章中讨论的主题之间的桥梁。这解释了容器如何有用以及如何在内部使用 chroot 和 cgroup。

虚拟化简介
操作系统级虚拟化是一种服务器虚拟化方法,其中操作系统的内核允许存在多个隔离的用户空间实例,而不仅仅是一个。这些实例有时被称为容器、软件容器、虚拟化引擎 (VE) 或监狱(FreeBSD jail 或 chroot jail),从其所有者和用户的角度来看,它们看起来和感觉起来就像一个真实的服务器。

上面的定义总结了关于容器的广泛概念,但更准确地说,传统的虚拟机使用了一种叫做管理程序的东西,它运行在内核之上。该管理程序通过监控资源使用情况和访问模式,为在其上运行的应用程序提供虚拟化。这会导致大量开销,从而导致不必要的性能损失。另一方面,操作系统级虚拟化的工作方式不同。它使用命名空间和 cgroup 来限制应用程序的功能,包括资源的使用。这是linux内核提供的一个特性。这几乎没有开销。

这种方法非常有效,以至于 Docker 在内部使用这些容器来提供隔离环境,这对于部署多个集成系统非常有用。他们甚至注定要创建自己的容器库。 Google 在共享硬件上的容器上运行自己的服务。

安装:

要在 Ubuntu 中安装 lxc,



$ sudo apt-get install lxc lxctl lxc-templates

这个包安装了 LXC 的要求、一些模板,并为容器设置了网络结构。
运行 lxc-checkconfig 检查内核配置是否就绪。

$ sudo lxc-checkconfig
    Kernel configuration not found at /proc/config.gz; searching...
    Kernel configuration found at /boot/config-4.4.0-24-generic
    --- Namespaces ---
    Namespaces: enabled
    Utsname namespace: enabled
    Ipc namespace: enabled
    Pid namespace: enabled
    User namespace: enabled
    Network namespace: enabled
    Multiple /dev/pts instances: enabled

    --- Control groups ---
    Cgroup: enabled
    Cgroup clone_children flag: enabled
    Cgroup device: enabled
    Cgroup sched: enabled
    Cgroup cpu account: enabled
    Cgroup memory controller: enabled
    Cgroup cpuset: enabled

    --- Misc ---
    Veth pair device: enabled
    Macvlan: enabled
    Vlan: enabled
    Bridges: enabled
    Advanced netfilter: enabled
    CONFIG_NF_NAT_IPV4: enabled
    CONFIG_NF_NAT_IPV6: enabled
    CONFIG_IP_NF_TARGET_MASQUERADE: enabled
    CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
    CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
    FUSE (for use with lxcfs): enabled

    --- Checkpoint/Restore ---
    checkpoint restore: enabled
    CONFIG_FHANDLE: enabled
    CONFIG_EVENTFD: enabled
    CONFIG_EPOLL: enabled
    CONFIG_UNIX_DIAG: enabled
    CONFIG_INET_DIAG: enabled
    CONFIG_PACKET_DIAG: enabled
    CONFIG_NETLINK_DIAG: enabled
    File capabilities: enabled

注意:在启动新内核之前,您可以检查其配置用法:CONFIG=/path/to/config /usr/bin/lxc-checkconfig

您还应该看到与上述类似的输出。
lxc 提供了很多现成的模板,对于快速部署真的很有帮助。

$ ls -l /usr/share/lxc/templates/
    total 404
    -rwxr-xr-x 1 root root 12973 May 18 14:48 lxc-alpine
    -rwxr-xr-x 1 root root 13713 May 18 14:48 lxc-altlinux
    -rwxr-xr-x 1 root root 11090 May 18 14:48 lxc-archlinux
    -rwxr-xr-x 1 root root 12159 May 18 14:48 lxc-busybox
    -rwxr-xr-x 1 root root 29503 May 18 14:48 lxc-centos
    -rwxr-xr-x 1 root root 10374 May 18 14:48 lxc-cirros
    -rwxr-xr-x 1 root root 19732 May 18 14:48 lxc-debian
    -rwxr-xr-x 1 root root 17890 May 18 14:48 lxc-download
    -rwxr-xr-x 1 root root 49600 May 18 14:48 lxc-fedora
    -rwxr-xr-x 1 root root 28384 May 18 14:48 lxc-gentoo
    -rwxr-xr-x 1 root root 13868 May 18 14:48 lxc-openmandriva
    -rwxr-xr-x 1 root root 15932 May 18 14:48 lxc-opensuse
    -rwxr-xr-x 1 root root 41720 May 18 14:48 lxc-oracle
    -rwxr-xr-x 1 root root 11205 May 18 14:48 lxc-plamo
    -rwxr-xr-x 1 root root 19250 May 18 14:48 lxc-slackware
    -rwxr-xr-x 1 root root 26862 May 18 14:48 lxc-sparclinux
    -rwxr-xr-x 1 root root  6862 May 18 14:48 lxc-sshd
    -rwxr-xr-x 1 root root 25602 May 18 14:48 lxc-ubuntu
    -rwxr-xr-x 1 root root 11439 May 18 14:48 lxc-ubuntu-cloud

我们将首先创建一个名为“ my_container ”和“ ubuntu ”模板的新容器。
这将需要一些时间并完成为您创建容器。是的!就这么简单。
完成后,最后几行显示容器的 root 用户的密码。它看起来与此类似,

$ sudo lxc-create -n my_container -t ubuntu
    .....
    .....
    ##
    # The default user is 'ubuntu' with password 'ubuntu'!
    # Use the 'sudo' command to run tasks as root in the container.
    ##

我们可以使用 lxc-ls 检查容器的状态。这将显示容器处于停止状态。

$ sudo lxc-ls --fancy
    NAME            STATE    IPV4  IPV6  AUTOSTART
    ----------------------------------------------
    my_container    STOPPED  -     -     NO

现在启动容器运行 lxc-start。 -d 参数将其创建为守护进程。

$ sudo lxc-start -n my_container -d

使用 lxc-ls 检查容器的状态以验证其运行。我们可以使用 lxc-console 访问控制台。使用我们在上面收到的凭据获取控制台访问权限。

$ sudo lxc-console -n my_container

登录后,在容器上运行以下命令,



$ top

并在主机上运行以下命令以查看正在运行的进程列表。

$ ps auxf

在某处你会发现一个看起来与此相似的流程树,
容器的进程树

这将是令人惊讶的,但是,容器上的所有进程都只是主机 pc 上的简单进程。重要的部分是所有的都被内核隔离和监控。因此,您可以将这些视为主机 PC 上的简单进程,您甚至可以杀死它们(仅当您有足够的权限时)

您可以通过键入Ctrl-A后跟Q退出控制台并返回到主机。

要获取有关正在运行的容器使用的更多信息,

$ sudo lxc-info -n my_container

您可以通过访问直接从主机访问此容器的根文件系统。您将需要 root 权限才能这样做。

$ sudo su
    $ cd /var/lib/lxc/my_container/rootfs

就是这样。现在这就像一个全新的操作系统。您可以在此容器上运行任何服务。
将容器视为独立的操作系统,您可以在其中运行任何您想要的东西。唯一的特别之处在于所有容器都运行在相同的硬件上。因此,实际上,公司/机构购买重型共享机器,然后根据他们想要的多种服务部署具有资源限制的容器。这使得可扩展且更易于管理。

要停止容器运行,

$ sudo lxc-stop -n my_container

要删除容器使用,

$ sudo lxc-destroy -n my_container

注意: lxc 提供了一个包装器和易于使用的 API 来使用内核功能。它在任何意义上都不等同于容器。
阅读文档以获取有关容器工作的更多详细信息。有很多命令非常有用,可以更轻松地设置容器。

参考:

https://www.youtube.com/watch?v=sK5i-N34im8
https://wiki.archlinux.org/index.html PHP/Linux_Containers
https://linuxcontainers.org/lxc/introduction/
http://www.ubuntu.com/cloud/lxd