使用 LXD 容器隔离开发环境

我将讨论一种在我的工作站上组织本地隔离开发环境的方法。 该方法是在以下因素的影响下制定的:

  • 不同的语言需要不同的IDE和工具链;
  • 不同的项目可能使用不同版本的工具链和库。

该方法是在笔记本电脑或工作站上本地运行的 LXD 容器内进行开发,并将图形输出重定向到主机。

配置示例 Ubuntu的20.04.

文章末尾给出了对选项和原因的思考。

1.LXD安装

В Ubuntu的20.04 LXD 不再可作为 deb 包安装,只能通过 snap 进行安装:

$ snap install lxd

安装完成后需要进行初始化:

$ lxd init

我改变的唯一参数是 storage bakend - 我用 dir 作为最简单的一种。 由于我不使用图片和副本,因此警告 文件资料 他们不会吓到我:

同样,目录后端被视为最后的选择。
它确实支持所有主要的 LXD 功能,但速度非常慢且效率低下,因为它无法执行
即时副本或快照,因此每次都需要复制实例的整个存储。

2.LXD配置文件设置

LXD 中的配置文件 — 这些是应用于多个容器的参数集。 对于我的需求,默认创建的唯一配置文件就足够了 default 进行以下更改:

  • $ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 — 以便容器中的应用程序可以与主机X11服务器交互;
  • $ lxc profile set default environment.DISPLAY :0 - 使环境变量 DISPLAY 已正确安装在容器中;
  • $ lxc profile set default raw.idmap "both 1000 1000" - 为了正确的 标识符映射.

3. 创建并设置容器

基于镜像创建容器 images:ubuntu/20.04:

$ lxc launch images:ubuntu/20.04 dev1

我更喜欢来自存储库的图像 https://images.linuxcontainers.org,因为他们预装的软件较少。 为此我添加了前缀 images: 到图像名称。 基于 Ubuntu 存储库中的映像创建容器可以按如下方式完成: $ lxc launch ubuntu/20.04 dev1.

访问容器的根shell:

$ lxc exec dev1 -- bash

我将安装 Firefox 和 VS Code(来自存储库 根据指示):

$ apt update
$ apt install curl gpg firefox

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list

$ apt update
$ apt install code

为了清楚起见,我将包括一个容器。

poweroff

奖金! 将 GPU 放入容器中非常容易,以便在容器中运行的应用程序可以使用显卡。 为此,您需要:

  • 添加设备 $ lxc config device add dev1 mygpu gpu;
  • 在容器中安装显卡驱动程序 - 与主机上安装的驱动程序相同。

4. 使用容器

如果容器尚未运行,您需要启动它:

lxc start dev1

以非 root 用户身份运行 VS Code Ubuntu的:

lxc exec dev1 -- sudo --login --user ubuntu code

启动火狐浏览器:

lxc exec dev1 -- sudo --login --user ubuntu firefox

应用程序窗口将显示在主机上,但它们将在容器内执行 - 类似于使用 ssh 转发图形。

我不会手动关闭正在运行的容器,因为我看不出它有什么意义——我限制自己关闭正在运行的应用程序的窗口。

5。 结论

我不喜欢使用主机操作系统进行开发,因为这需要安装开发工具、调试库版本、以特定方式配置系统组件以及其他操作。 所有这些都可能导致其他非开发软件甚至整个操作系统出现意外行为。 例如,OpenSSL 配置的更改可能会导致操作系统停止正确启动。

我尝试过不同的工具来隔离开发环境:

  • 虚拟机(KVM、VirtualBox 等)是最明显的选择,但它们消耗的资源明显更多,尽管 Windows 下没有其他开发选项(如果主机是 Linux);
  • 运行在本地机器上的云开发工具(容器或虚拟机中的Cloud9、Eclipse Che等) - 它们不是为这种操作模式而开发的,它们需要额外的配置和维护,最好将它们用于它们的预期目的 - 在云端;
  • Docker 容器再次用于其他用途;在我看来,它们对于使用尚未打包在单独容器中的软件进行快速原型设计不太方便。

所选择的方法以其简单性和低进入门槛给我留下了深刻的印象。 在容器本身中,您可以使用特定于项目的方法:手动安装和配置所有内容,或使用自动化(Puppet、Ansible 等),甚至部署 基于 Docker 的基础设施。 我还使用 LXD 容器来运行特定软件,这些软件要么需要安装大量依赖项,要么需要安装不同的操作系统版本 - 在这种情况下,您可以创建具有所需操作系统版本的容器,例如 $ lxc launch images:ubuntu/16.04 dev16.

重要的是要记住,就隔离而言,与虚拟化相比,容器化具有更大的攻击面 - 主机和容器共享单个核心,该漏洞可能允许恶意软件从容器中逃脱。 当试验可疑软件时,最好使用更合适的隔离机制。

有用的链接

来源: habr.com

添加评论