lxc
节区: (7)更新: 2021-06-03
索引 返回主要内容
名称
lxc - linux 容器概述
容器技术正在积极地被推向主流 Linux 内核。它通过控制组提供资源管理,并通过命名空间提供资源隔离。lxc 旨在利用这些新功能来提供一个用户空间容器对象,该对象为应用程序或完整系统提供完整的资源隔离和资源控制。
lxc 足够小,可以轻松地用简单的命令行管理容器,并且功能完备,可以用于其他目的。
要求
与发行版一起提供的内核版本 >= 3.10 可以与 lxc 一起使用,此版本的功能较少,但足以引起兴趣。lxc 依赖于内核提供的某些功能。辅助脚本 lxc-checkconfig 将向您提供有关内核配置的信息,包括必需的功能和缺少的功能。
功能规范
容器是一个对象,它隔离了主机的一些资源,供在其中运行的应用程序或系统使用。应用程序/系统将在由配置指定的容器中启动,该配置是在最初创建时或作为命令参数传递的。
如何在容器中运行应用程序
在运行应用程序之前,您应该了解要隔离哪些资源。默认配置是隔离 PID、sysv IPC 和挂载点。如果您想在容器中运行一个简单的 shell,则需要一个基本配置,尤其是在您想要共享 rootfs 的情况下。如果您想要运行一个像 sshd 这样的应用程序,您应该提供一个新的网络栈和一个新的主机名。如果您想避免与某些文件(例如 /var/run/httpd.pid)发生冲突,您应该使用一个空目录重新挂载 /var/run。如果您想在所有情况下避免冲突,您可以为容器指定一个 rootfs。rootfs 可以是一个目录树,之前与初始 rootfs 绑定挂载,这样您仍然可以使用您的发行版,但使用您自己的 /etc 和 /home
以下是一个针对 sshd 的目录树示例
[root@lxc sshd]$ tree -d rootfs rootfs |-- bin |-- dev | |-- pts | `-- shm | `-- network |-- etc | `-- ssh |-- lib |-- proc |-- root |-- sbin |-- sys |-- usr `-- var |-- empty | `-- sshd |-- lib | `-- empty | `-- sshd `-- run `-- sshd
以及与之关联的挂载点文件
[root@lxc sshd]$ cat fstab /lib /home/root/sshd/rootfs/lib none ro,bind 0 0 /bin /home/root/sshd/rootfs/bin none ro,bind 0 0 /usr /home/root/sshd/rootfs/usr none ro,bind 0 0 /sbin /home/root/sshd/rootfs/sbin none ro,bind 0 0
如何在容器中运行系统
在容器中运行系统比运行应用程序更容易。为什么?因为您不必关心要隔离的资源,所有资源都需要被隔离,其他资源被指定为被隔离,但没有配置,因为容器将设置它们。例如,ipv4 地址将由系统容器初始化脚本设置。以下是一个挂载点文件的示例
[root@lxc debian]$ cat fstab /dev /home/root/debian/rootfs/dev none bind 0 0 /dev/pts /home/root/debian/rootfs/dev/pts none bind 0 0
容器生命周期
当容器创建时,它包含配置信息。当进程启动时,容器将启动并运行。当容器中运行的最后一个进程退出时,容器将停止。如果在初始化容器时发生故障,它将经过中止状态。
--------- | STOPPED |<--------------- --------- | | | start | | | V | ---------- | | STARTING |--error- | ---------- | | | | | V V | --------- ---------- | | RUNNING | | ABORTING | | --------- ---------- | | | | no process | | | | | V | | ---------- | | | STOPPING |<------- | ---------- | | | ---------------------
配置
容器通过配置文件进行配置,配置文件的格式在 lxc.conf(5) 中描述创建/销毁容器
可以使用 lxc-create 命令创建持久性容器对象。它将容器名称作为参数,以及可选的配置文件和模板。该名称由不同的命令用来引用此容器。lxc-destroy 命令将销毁容器对象。
lxc-create -n foo lxc-destroy -n foo
易失性容器
在启动容器之前,创建容器对象不是必需的。容器可以直接用配置文件作为参数启动。启动/停止容器
当容器创建完毕后,它就可以运行应用程序/系统了。这就是 lxc-execute 和 lxc-start 命令的用途。如果容器在启动应用程序之前没有创建,容器将使用作为命令参数传递的配置文件,如果没有这样的参数,则它将使用默认隔离。如果应用程序结束,容器将停止,但如果需要,可以使用 lxc-stop 命令来停止容器。在容器中运行应用程序与运行系统并不完全相同。因此,有两个不同的命令可以将应用程序运行到容器中。
lxc-execute -n foo [-f config] /bin/bash lxc-start -n foo [-f config] [/bin/bash]
lxc-execute 命令将通过一个中间进程 lxc-init 在容器中运行指定的命令。这个 lxc-init 在启动指定的命令后,将等待其结束以及所有其他重新父进程的进程。(支持容器中的守护进程)。换句话说,在容器中,lxc-init 的 PID 为 1,应用程序的第一个进程的 PID 为 2。
lxc-start 命令将直接在容器中运行指定的命令。第一个进程的 PID 为 1。如果没有指定命令,lxc-start 将运行在 lxc.init.cmd 中定义的命令,如果未设置,则运行 /sbin/init 。
总而言之,lxc-execute 用于运行应用程序,而 lxc-start 更适合运行系统。
如果应用程序不再响应,不可访问或无法自行完成,一个非法的 lxc-stop 命令将毫不留情地杀死容器中的所有进程。
lxc-stop -n foo -k
连接到可用的 TTY
如果容器配置了 tty,则可以通过它们访问它。容器提供了一组可用的 tty,供以下命令使用。当 tty 丢失时,可以重新连接到它,而无需再次登录。
lxc-console -n foo -t 3
冻结/解冻容器
有时,停止属于容器的所有进程很有用,例如用于作业调度。命令
lxc-freeze -n foo
将把所有进程置于不可中断状态,并且
lxc-unfreeze -n foo
将恢复它们。
如果内核中启用了 freezer cgroup v1 控制器,则此功能将启用。
获取有关容器的信息
当有很多容器时,很难跟踪哪些容器已经创建或销毁,哪些容器正在运行,或者哪些 PID 在特定容器中运行。因此,以下命令可能很有用
lxc-ls -f lxc-info -n foo
lxc-ls 列出容器。
lxc-info 为特定容器提供信息。
以下示例说明了如何组合使用这些命令来列出所有容器并检索其状态。
for i in $(lxc-ls -1); do lxc-info -n $i done
监控容器
有时,跟踪容器的状态很有用,例如监控它,或只是在脚本中等待特定状态。lxc-monitor 命令将监控一个或多个容器。此命令的参数接受一个正则表达式,例如
lxc-monitor -n "foo|bar"
将监控名为 'foo' 和 'bar' 的容器的状态,并且
lxc-monitor -n ".*"
将监控所有容器。
对于一个名为 'foo' 的容器,它启动、执行一些工作并退出,输出将采用以下形式
'foo' changed state to [STARTING] 'foo' changed state to [RUNNING] 'foo' changed state to [STOPPING] 'foo' changed state to [STOPPED]
lxc-wait 命令将等待特定状态更改并退出。这对于脚本同步容器启动或结束很有用。参数是不同状态的按位或组合。以下示例说明了如何等待容器成功启动为守护进程。
# launch lxc-wait in background lxc-wait -n foo -s STOPPED & LXC_WAIT_PID=$! # this command goes in background lxc-execute -n foo mydaemon & # block until the lxc-wait exits # and lxc-wait exits when the container # is STOPPED wait $LXC_WAIT_PID echo "'foo' is finished"
容器的 CGROUP 设置
容器与控制组绑定在一起,当容器启动时,将创建一个控制组并与它关联。当容器运行时,可以使用 lxc-cgroup 命令读取和修改控制组属性。lxc-cgroup 命令用于设置或获取与容器关联的控制组子系统。子系统名称由用户处理,命令不会对子系统名称进行任何语法检查,如果子系统名称不存在,命令将失败。
lxc-cgroup -n foo cpuset.cpus
将显示此子系统的內容。
lxc-cgroup -n foo cpu.shares 512
参见
lxc(7), lxc-create(1), lxc-copy(1), lxc-destroy(1), lxc-start(1), lxc-stop(1), lxc-execute(1), lxc-console(1), lxc-monitor(1), lxc-wait(1), lxc-cgroup(1), lxc-ls(1), lxc-info(1), lxc-freeze(1), lxc-unfreeze(1), lxc-attach(1), lxc.conf(5)作者
Daniel Lezcano <daniel.lezcano@free.fr>Christian Brauner <christian.brauner@ubuntu.com>
Serge Hallyn <serge@hallyn.com>
Stéphane Graber <stgraber@ubuntu.com>
索引
此文档由 man2html 使用手册页创建。
时间: 04:45:10 GMT, 2024 年 11 月 03 日