前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >容器与云|LXD 2.0 系列(三):你的第一个 LXD 容器

容器与云|LXD 2.0 系列(三):你的第一个 LXD 容器

原创
作者头像
用户8710643
修改2021-07-12 10:35:26
9430
修改2021-07-12 10:35:26
举报
文章被收录于专栏:linux百科小宇宙linux百科小宇宙

这是LXD2.0系列介绍文章的第三篇博客。

LXD入门安装与配置你的第一个LXD容器资源控制镜像管理远程主机及容器迁移LXD中的DockerLXD中的LXD实时迁移LXD和JujuLXD和OpenStack调试,及给LXD做贡献由于在管理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开发版本。

你也可以更加精确,比如你可以使用代号名:

lxclaunchubuntu-daily:xenialc4最新的AlpineLinuxAlpine镜像可以在“Images:”远程仓库中找到,通过如下命令执行:

lxclaunchimages:alpine/3.3/amd64c5其他全部的Ubuntu镜像列表可以这样获得:

lxcimagelistubuntu:lxcimagelistubuntu-daily:全部的非官方镜像:

lxcimagelistimages:某个给定的原程仓库的全部别名(易记名称)可以这样获得(比如对于“ubuntu:”远程仓库):

lxcimagealiaslistubuntu:创建但不启动一个容器如果你想创建一个容器或者一批容器,但是你不想马上启动它们,你可以使用lxcinit替换掉lxclaunch。所有的选项都是相同的,唯一的不同就是它并不会在你创建完成之后启动容器。

lxcinitubuntu:关于你的容器的信息列出所有的容器要列出你的所有容器,你可以这样这做:

lxclist有大量的选项供你选择来改变被显示出来的列。在一个拥有大量容器的系统上,默认显示的列可能会有点慢(因为必须获取容器中的网络信息),你可以这样做来避免这种情况:

lxclist--fast上面的命令显示了另外一套列的组合,这个组合在服务器端需要处理的信息更少。

你也可以基于名字或者属性来过滤掉一些东西:

stgraber@dakara:~$lxclistsecurity.privilegedtrue+------+---------+---------------------+-----------------------------------------------+------------+-----------+|NAME|STATE|IPV4|IPV6|TYPE|SNAPSHOTS|+------+---------+---------------------+-----------------------------------------------+------------+-----------+|suse|RUNNING|172.17.0.105(eth0)|2607:f2c0:f00f:2700:216:3eff:fef2:aff4(eth0)|PERSISTENT|0|+------+---------+---------------------+-----------------------------------------------+------------+-----------+在这个例子中,只有那些特权容器(禁用了用户命名空间)才会被列出来。

stgraber@dakara:~$lxclist--fastalpine+-------------+---------+--------------+----------------------+----------+------------+|NAME|STATE|ARCHITECTURE|CREATEDAT|PROFILES|TYPE|+-------------+---------+--------------+----------------------+----------+------------+|alpine|RUNNING|x86_64|2016/03/2002:11UTC|default|PERSISTENT|+-------------+---------+--------------+----------------------+----------+------------+|alpine-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:3eff:feec:65a8eth0:inet6fe80::216:3eff: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(takenat2016/03/0823:55UTC)(stateless)生命周期管理命令这些命令对于任何容器或者虚拟机管理器或许都是最普通的命令,但是它们仍然需要讲到。

所有的这些命令在批量操作时都能接受多个容器名。

启动启动一个容器就向下面一样简单:

lxcstart停止停止一个容器可以这样来完成:

lxcstop如果容器不合作(即没有对发出的SIGPWR信号产生回应),这时候,你可以使用下面的方式强制执行:

lxcstop--force重启通过下面的命令来重启一个容器:

lxcrestart如果容器不合作(即没有对发出的SIGINT信号产生回应),你可以使用下面的方式强制执行:

lxcrestart--force暂停你也可以“暂停”一个容器,在这种模式下,所有的容器任务将会被发送相同的SIGSTOP信号,这也意味着它们将仍然是可见的,并且仍然会占用内存,但是它们不会从调度程序中得到任何的CPU时间片。

如果你有一个很占用CPU的容器,而这个容器需要一点时间来启动,但是你却并不会经常用到它。这时候,你可以先启动它,然后将它暂停,并在你需要它的时候再启动它。

lxcpause删除最后,如果你不需要这个容器了,你可以用下面的命令删除它:

lxcdelete注意,如果容器还处于运行状态时你将必须使用“-force”。

容器的配置LXD拥有大量的容器配置设定,包括资源限制,容器启动控制以及对各种设备是否允许访问的配置选项。完整的清单因为太长所以并没有在本文中列出,但是,你可以从[这里]获取它。

就设备而言,LXD当前支持下面列出的这些设备类型:

磁盘既可以是一块物理磁盘,也可以只是一个被挂挂载到容器上的分区,还可以是一个来自主机的绑定挂载路径。网络接口卡一块网卡。它可以是一块桥接的虚拟网卡,或者是一块点对点设备,还可以是一块以太局域网设备或者一块已经被连接到容器的真实物理接口。unix块设备一个UNIX块设备,比如/dev/sdaunix字符设备一个UNIX字符设备,比如/dev/kvmnone这种特殊类型被用来隐藏那种可以通过配置文件被继承的设备。配置profile文件所有可用的配置文件列表可以这样获取:

lxcprofilelist为了看到给定配置文件的内容,最简单的方式是这样做:

lxcprofileshow你可能想要改变文件里面的内容,可以这样做:

lxcprofileedit你可以使用如下命令来改变应用到给定容器的配置文件列表:

lxcprofileapply,,,...本地配置有些配置是某个容器特定的,你并不想将它放到配置文件中,你可直接对容器设置它们:

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:a8volatile.last_state.idmap:'[{"Isuid":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)。

其他的环境变量可以通过命令行来设置,或者在“environment.”配置中设置成永久环境变量。

执行命令在容器中获得一个shell可以简单的执行下列命令得到:

lxcexecbash当然,这样做的前提是容器内已经安装了bash。

更复杂的命令要求使用分隔符来合理分隔参数。

lxcexec--ls-lh/如果想要设置或者重写变量,你可以使用“-env”参数,例如:

stgraber@dakara:~$lxcexeczerotier--envmykeymyvalueenv|grepmykeymykeymyvalue管理文件因为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::2ip6-allroutersff02::3ip6-allhosts向容器发送一个文件发送以另一种简单的方式完成:

lxcfilepush/直接编辑一个文件编辑是一个方便的功能,其实就是简单的提取一个给定的路径,在你的默认文本编辑器中打开它,在你关闭编辑器时会自动将编辑的内容保存到容器。

lxcfileedit/快照管理LXD允许你对容器执行快照功能并恢复它。快照包括了容器在某一时刻的完整状态(如果-stateful被使用的话将会包括运行状态),这也意味着所有的容器配置,容器设备和容器文件系统也会被保存。

创建一个快照你可以使用下面的命令来执行快照功能:

lxcsnapshot命令执行完成之后将会生成名为snapX(X为一个自动增长的数)的记录。

除此之外,你还可以使用如下命令命名你的快照:

lxcsnapshot列出所有的快照一个容器的所有快照的数量可以使用lxclist来得到,但是具体的快照列表只能执行lxcinfo命令才能看到。

lxcinfo恢复快照为了恢复快照,你可以简单的执行下面的命令:

lxcrestore给快照重命名可以使用如下命令来给快照重命名:

lxcmove//从快照中创建一个新的容器你可以使用快照来创建一个新的容器,而这个新的容器除了一些可变的信息将会被重置之外(例如MAC地址)其余所有信息都将和快照完全相同。

lxccopy/删除一个快照最后,你可以执行下面的命令来删除一个快照:

lxcdelete/克隆并重命名得到一个纯净的发行版镜像总是让人感到愉悦,但是,有时候你想要安装一系列的软件到你的容器中,这时,你需要配置它然后将它分支成多个其他的容器。

复制一个容器为了复制一个容器并有效的将它克隆到一个新的容器中,你可以执行下面的命令:

lxccopy目标容器在所有方面将会完全和源容器等同。除了新的容器没有任何源容器的快照以及一些可变值将会被重置之外(例如MAC地址)。

移动一个快照LXD允许你复制容器并在主机之间移动它。但是,关于这一点将在后面的文章中介绍。

现在,“move”命令将会被用作给容器重命名。

lxcmove唯一的要求就是当容器应该被停止,容器内的任何事情都会被保存成它本来的样子,包括可变化的信息(类似MAC地址等)。

结论这篇如此长的文章介绍了大多数你可能会在日常操作中使用到的命令。

很显然,这些如此之多的命令都会有不少选项,可以让你的命令更加有效率,或者可以让你指定你的LXD容器的某个具体方面。最好的学习这些命令的方式就是深入学习它们的帮助文档(-help)。

更多信息LXD的主要网站是:https://linuxcontainers.org/lxdGithub上的开发动态:https://github.com/lxc/lxd邮件列表支持:https://lists.linuxcontainers.orgIRC支持:#lxcontainersonirc.freenode.net如果你不想或者不能在你的机器上安装LXD,你可以试试在线版本!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档