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