当前位置: 首页 > 科技观察

LXD2.0系列(三):你的第一个LXD容器

时间:2023-03-13 11:37:07 科技观察

这是LXD2.0系列的第三篇博文。由于管理LXD容器涉及的命令较多,本文篇幅比较长。如果您更喜欢使用相同的命令逐步快速实施整个过程,您可以试试我们的实例!创建并启动新容器正如我在上一篇文章中提到的,LXD命令行客户端预配置了多个镜像源。所有Ubuntu发行版和架构都提供官方镜像,但也有大量其他发行版的非官方镜像,由社区制作并由LXC上游贡献者维护。Ubuntu如果你想支持最完整的Ubuntu版本,你可以执行以下操作:lxclaunchubuntu:注意,这意味着它会随着UbuntuLTS的发布而改变。因此,如果在脚本中使用,您需要指定您安装的版本(见下文)。Ubuntu14.04LTS要获取最新、经过测试且稳定的Ubuntu14.04LTS映像,您只需执行:lxclaunchubuntu:14.04在此模式下,将指定一个随机容器名称。如果你喜欢指定自己的名字,你可以这样做:lxclaunchubuntu:14.04c1如果你想指定一个特定的架构(非主流平台),比如32位的Intel镜像,你可以这样做:lxclaunchubuntu:14.04/i386c2当前Ubuntu开发版本中使用的“ubuntu:”远程存储库只会为您提供官方和经过测试的Ubuntu映像。但是如果你想要未经测试的日常构建,开发版本可能适合你,你需要使用“ubuntu-daily:”远程仓库。lxclaunchubuntu-daily:develc3会自动选择本例中最新的Ubuntu开发版本。你也可以更精确,比如你可以使用代号:lxclauchubuntu-daily:xenialc4***AlpineLinuxAlpine镜像可以在“Images:”远程仓库中找到,执行如下命令:lxclaunchimages:alpine/3.3/amd64c5othersallUbuntu镜像的列表可以这样获取:lxcimagelistubuntu:lxcimagelistubuntu-daily:Allunofficialmirrors:lxcimagelistimages:给定原始存储库的所有别名(友好名称)可以这样获取(例如,对于“ubuntu:"remoterepository):lxcimagealiaslistubuntu:创建但不启动容器.所有选项都是相同的,唯一的区别是它不会在您创建容器后启动它。lxcinitubuntu:关于你的容器的信息列出所有容器要列出你所有的容器,你可以这样做:lxclist有大量的选项供你选择来改变显示的列。在具有大量容器的系统上,列的默认显示可能有点慢(因为必须获取容器中的网络信息),您可以通过执行以下操作来避免这种情况:lxclist--fast上面的命令显示了另一个set在服务器端处理需要较少信息的列组合。您还可以根据名称或属性过滤掉内容:stgraber@dakara:~$lxclistsecurity.privileged=true+------+--------+--------------------+----------------------------------------------+------------+------------+|名称|状态|IPV4|IPV6|类型|快照|+------+--------+--------------------+--------------------------------------------+------------+----------+|suse|RUNNING|172.17.0.105(eth0)|2607:f2c0:f00f:2700:216:3eff:fef2:aff4(eth0)|PERSISTENT|0|+------+--------+--------------------+------------------------------------------+------------+-----------+在此示例中,将仅列出那些特权容器(禁用了用户命名空间)。stgraber@dakara:~$lxclist--fastalpine+------------+--------+------------+--------------------+---------+------------+|名称|状态|架构|创建于|配置文件|类型|+------------+--------+------------+---------------------+---------+------------+|alpine|正在运行|x86_64|2016/03/2002:11UTC|默认|PERSISTENT|+------------+--------+--------------+--------------------+--------+-------------+|高山-edge|RUNNING|x86_64|2016/03/2002:19UTC|default|PERSISTENT|+------------+--------+------------+--------------------+--------+-----------------+在本例中,只会列出名称中带有“alpine”的容器(也支持复杂的正则表达式)。获取一个容器的详细信息由于list命令显然不能以友好、可读的方式显示一个容器的所有信息,你可以使用如下查询单个容器的信息:lxcinfo例如:stgraber@dakara:~$lxcinfozerotierName:zerotierArchitecture:x86_64Created:2016/02/2020:01UTCStatus:RunningType:persistentProfiles:defaultPid:31715Processes:32Ips:eth0:inet172.17.0.101eth0:inet62607:f2c0:f00f:2700:216:8fffeec2:feec:65a8lo:inet127.0.0.1lo:inet6::1lxcbr0:inet10.0.3.1lxcbr0:inet6fe80::c0a4:ceff:fe52:4d51zt0:inet29.17.181.59zt0:inet6fd80:56c2:e21c:0:199:9379:e711:b3e1zt0:inet6fe80::79:e7ff:fe0d:5123Snapshots:zerotier/blah(拍摄于2016/03/0823:55UTC)(无状态)生命周期管理命令这些命令可能对任何容器或管理程序有用,是最常见的命令,但它们仍然需要被覆盖。所有这些命令都接受多个容器名称以进行批处理操作。启动和启动一个容器很简单:lxcstart停止一个容器可以这样做:lxcstop如果容器不合作(即不响应发送的SIGPWR信号),此时,你可以使用下面的方式强制执行:lxcstop--forcerestart通过下面的命令重启一个容器:lxcrestart如果容器不配合(即不响应发送的SIGINT信号),你可以使用下面的方法来强制执行:lxcrestart--forcepause你也可以“暂停”一个容器,在这种模式下所有的容器任务都会被发送相同的SIGSTOP信号,这也意味着它们仍然是可见的并且仍然占用内存,但它们没有从调度程序获得任何CPU时间片。如果您有一个需要一段时间才能启动的CPU密集型容器,但您并不经常使用它。这时候可以先启动,然后暂停,需要的时候再启动。lxcpausedelete***,如果你不再需要这个容器,你可以用下面的命令删除它:lxcdelete注意,如果容器还在运行,你将不得不使用“-force”。容器配置LXD有大量的容器配置设置,包括资源限制、容器启动控制以及允许访问各种设备的配置选项。完整列表太长,无法包含在本文中,但是,您可以从[此处]获取。就设备而言,LXD目前支持以下列出的设备类型:磁盘可以是物理磁盘,也可以只是挂载在容器上的分区,也可以是来自主机的绑定挂载路径。网络接口卡一种网卡。它可以是桥接的虚拟网卡,也可以是点对点设备,也可以是以太局域网设备,也可以是已经连接到容器的真实物理接口。unix块设备UNIX块设备,例如/dev/sdaunix字符设备UNIX字符设备,例如/dev/kvm无这种特殊类型用于隐藏可以通过配置文件继承的设备。配置文件可以通过以下方式获得所有可用配置文件的列表:lxcprofilelist要查看给定配置文件的内容,最简单的方法是:lxcprofileshow您可能想要更改文件的内容,您可以这样做:lxcprofileedit您可以使用以下命令更改应用于给定容器的配置文件列表:lxcprofileapply,,,...本地配置container,你不想把它放在配置文件中,你可以直接在容器上设置它们:lxcconfigedit上面的命令与“profileedit”命令的作用相同。如果你不想在文本编辑器中打开整个文件内容,你也可以像这样修改个别配置:lxcconfigset或者添加设备,例如:lxcconfigdeviceaddmy-containerkvmunix-charpath=/上面的dev/kvm命令将为名为“my-container”的容器设置一个/dev/kvm条目。上述功能也可以通过配置文件的lxcprofileset和lxcprofiledeviceadd命令实现。读取配置可以使用如下命令读取容器本地配置:lxcconfigshow或者获取扩展配置(包括所有配置值):lxcconfigshow--expanded例如:stgraber@dakara:~$lxcconfigshow--expandedzerotiername:zerotierprofiles:-defaultconfig:security.nesting:"true"user.a:bvolatile.base_image:a49d26ce5808075f5175bf31f5cb90561f5023dcd408da8ac5e834096d46b2d8volatile.eth0.hwaddr:00:16:3e:ec:65:a.8volatile.last"mapIsuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'devices:eth0:name:eth0nictype:macvlanparent:eth0type:niclimits.ingress:10Mbitlimits.egress:10Mbitroot:path:/size:30GBtype:disktun:path:/dev/net/tuntype:unix-charephemeral:false这对于检查哪些配置属性应用于给定容器很方便。实时配置更新请注意,除非文档中另有说明,否则所有配置值和设备项设置都会实时影响容器。这意味着您可以在不重新启动正在运行的容器的情况下添加和删除某些设备或修改安全配置文件。获取shellLXD允许您直接在容器中执行任务。最常见的方法是在容器内获取一个shell或执行一些管理任务。与SSH相比,这样做的优势在于您不需要容器网络可达,也不需要任何软件和特定配置。执行环境与LXD在容器内执行命令的方式之间的一个区别是shell不在容器内运行。这也意味着容器不知道正在使用什么shell,设置了什么环境变量以及你的主目录在哪里。通过LXD执行命令总是使用最小路径环境变量设置,HOME环境变量必须是/root,以容器的超级用户身份执行(即uid为0,gid为0)。其他环境变量可以通过命令行设置,也可以在“环境”中设置为***环境变量。配置。执行命令获取容器中的shell只需执行以下命令即可获取:lxcexecbash当然,这样做的前提是容器中已经安装了bash。更复杂的命令需要定界符来正确分隔参数。lxcexec--ls-lh/如果要设置或覆盖变量,可以使用“-env”参数,例如:stgraber@dakara:~$lxcexeczerotier--envmykey=myvalueenv|grepmykeymykey=myvalueManagementfiles因为LXD可以直接访问容器的文件系统,因此可以直接读写容器中的任意文件。当我们需要提取日志文件或与容器传递文件时,此功能非常有用。从容器中获取文件要从容器中获取文件,只需执行以下命令:lxcfilepull/示例:stgraber@dakara:~$lxcfilepullzerotier/etc/hostshosts或读取它获取标准输出:stgraber@dakara:~$lxcfilepullzerotier/etc/hosts-127.0.0.1localhost#ThefollowinglinesaredesirableforIPv6capablehosts::1ip6-localhostip6-loopbackfe00::0ip6-localnetff00::0ip6-mcastprefixff02::1ip6-allnodesff02::2ip06-allroutersff::3ip6-allhosts发送文件到容器另一种简单的发送方式:lxcfilepush/直接编辑文件编辑是一个方便的功能,其实就是简单的提取一个给定的路径,在你的文件中打开默认文本编辑器,关闭编辑器时自动将编辑的内容保存到容器中。lxcfileedit/快照管理LXD允许您拍摄容器的快照并恢复它们。快照包含容器在某个时刻的完整状态(如果使用-stateful,则包括运行状态),这意味着所有容器配置、容器设备和容器文件系统也被保存。要创建快照,可以使用以下命令执行快照功能:lxcsnapshot命令执行后,会生成一条名为snapX(X为自增数)的记录。另外,你还可以使用如下命令为你的快照命名:lxcsnapshot列出所有快照一个容器的所有快照数量可以通过lxclist获取,但是具体的快照列表只能执行lxcinfo命令可以看到。lxcinforestoresnapshot要恢复快照,您只需执行以下命令:lxcrestore要重命名快照,您可以使用以下命令重命名快照:lxcmove/container>/Createanewcontainerfromasnapshot您可以使用快照创建一个新容器,这个新容器会重置所有信息,除了一些变量信息(比如MAC地址)会和快照完全一样.lxccopy/删除快照***,可以执行以下命令删除快照:lxcdelete/cloneandrenametogetacleandistributionimagealwaysletPeople很高兴,然而,有时候你想在你的容器中安装一系列的软件,这时候,你需要配置它,然后将它分支到其他多个容器中。复制容器要复制容器并将其有效地克隆到新容器中,您可以执行以下命令:lxccopy目标容器在所有方面都与源容器相同。除了新容器没有源容器的任何快照,一些可变值将被重置(例如MAC地址)。移动快照LXD允许您复制容器并在主机之间移动它。但是,这将在以后的文章中介绍。现在,“移动”命令将用于重命名容器。lxcmove的唯一要求是当容器应该停止时,容器内的所有内容都将保持原样,包括可变信息(如MAC地址等)。结束语这篇长篇文章涵盖了您可能在日常操作中使用的大部分命令。显然,对于这么多命令,有一些选项可以让您的命令更有效率,或者允许您指定LXD容器的特定方面。学习这些命令的最好方法是深入研究它们的帮助文档(-help)。更多信息LXD的主要网站是:https://linuxcontainers.org/lxdGithub上的开发活动:https://github.com/lxc/lxd邮件列表支持:https://lists.linuxcontainers.orgIRC支持:#lxcontainers在irc.freenode.net如果你不想或不能在你的机器上安装LXD,你可以试试在线版本!