我将讨论一种在我的工作站上组织本地隔离开发环境的方法。 该方法是在以下因素的影响下制定的:
- 不同的语言需要不同的IDE和工具链;
- 不同的项目可能使用不同版本的工具链和库。
该方法是在笔记本电脑或工作站上本地运行的 LXD 容器内进行开发,并将图形输出重定向到主机。
配置示例 Ubuntu的20.04.
文章末尾给出了对选项和原因的思考。
1.LXD安装
В Ubuntu的20.04 LXD 不再可作为 deb 包安装,只能通过 snap 进行安装:
$ snap install lxd
安装完成后需要进行初始化:
$ lxd init
我改变的唯一参数是 storage bakend
- 我用 dir
作为最简单的一种。 由于我不使用图片和副本,因此警告
同样,目录后端被视为最后的选择。
它确实支持所有主要的 LXD 功能,但速度非常慢且效率低下,因为它无法执行
即时副本或快照,因此每次都需要复制实例的整个存储。
2.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
我更喜欢来自存储库的图像 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 等),甚至部署 $ lxc launch images:ubuntu/16.04 dev16
.
重要的是要记住,就隔离而言,与虚拟化相比,容器化具有更大的攻击面 - 主机和容器共享单个核心,该漏洞可能允许恶意软件从容器中逃脱。 当试验可疑软件时,最好使用更合适的隔离机制。
有用的链接
- 关于哈布雷的宽敞文章
LXD-Linux容器系统的基本特性 LXD项目门户 ,重要的是不要将 LXD 与 LXC 混淆 - 它们是不同的,但又是相互关联的。博客 Simos Xenitellis — 这个博客有很多关于 LXD 的有用的应用信息。为开发人员提供现成的 Windows 10 虚拟机映像 — Microsoft 定期收集新版本并使用特殊许可证分发它们。
来源: habr.com