基于 nspawn 容器化开发环境
容器化开发环境,就是我希望把所有开发套件和代码全都放到一个容器中运行,无论我装多少东西不会影响外部桌面环境的正常使用。
也许看上去有点吃饱了撑着,但是我感觉这样做会让我感到舒适。同时很主要的一点是,整套操作实现起来并不复杂,而且 VSCode 对于 SSH 远程连接有着堪比本地开发一样的爽快体验,因此何乐而不为呢。
我们会用到的东西包括:
- systemd-networkd
- systemd-nspawn
是的,全都是 systemd 全家桶自带的东西,因此我们什么都不需要额外安装。换句话说,只要你是个带 systemd 的操作系统,那么应该都能实现我们的目标。
如果你是用 NetworkManager 上网的,那么可能会和 systemd-networkd 打起来,你可能需要自己寻找解决办法。
网络配置
自从我开始用软路由之后,我就对 systemd-networkd 大彻大悟了。这个东西什么都能做,只要你愿意去看它的使用手册。
之前我还写过一篇关于 nspawn 容器的网络配置相关的东西的文章,用了一大堆工具,但实际上所有事情都可以交给 systemd-networkd 完成。
我们先还是从创建虚拟网桥开始,创建文件 /etc/systemd/network/vth0.netdev
。
[NetDev]
Name=vth0
Kind=bridge
这样 systemd-networkd 就会自动帮我们创建这个网桥了。
接着创建文件 /etc/systemd/network/20-vth0.network
[Match]
Name=vth0
[Network]
Address=192.168.26.1/24
Address=fd20:1926:0817::1/64
IPMasquerade=both
这里我们设置的都是静态地址,回头容器里面也要手动设置地址和网关。
然后重启 systemd-networkd.service
,你会看到多出来了一个网络接口 vth0
。
如果你用 ip a
查看地址,你会发现这个网桥并没有地址,是正常现象,等后面容器起来了才会开始有地址。
安装容器
参考 ArchWiki 中相关的内容,我们这里就安装一个经典的 Arch Linux 系统。
sudo pacstrap -K -c /var/lib/machines/container-dev base base-devel
安装完成之后编辑 /etc/systemd/nspawn/container-dev.nspawn
[Network]
Bridge=vth0
最后用下面的指令开启容器。
sudo machinectl start container-dev
如果要开机自动启动,那就把 start
改成 enable
就好了,和 systemctl
如出一辙(好像本来也是一家东西)。
要进入容器,用下面的指令
sudo machinectl shell container-dev
# or with specific user
sudo machinectl shell user@container-dev
进入容器之后要先配置一下网络,编辑 /etc/systemd/network/20-wired.network
[Match]
Name=host*
[Network]
Address=192.168.26.2/24
Gateway=192.168.26.1
Address=fd20:1926:0817::dead:beaf/64
Gateway=fd20:1926:0817::1
然后启动 systemd-networkd.service
和 systemd-resolved.service
,你应该就能上网了。
关于 DNS:
- 如果你比较懒,或者网络环境比较固定,你可以直接编辑
/etc/systemd/resolve.conf
选择你的 DNS 服务器(或者直接加到[Network] DNS=
里面) - 如果环境比较麻烦,你可以尝试让 systemd-networkd 充当 DNS 服务器转发子网的请求,具体可以自己去查文档
解决了网络问题之后你就可以在容器里面为所欲为了,创建新用户、添加主机的公钥等。
完成之后我们直接用 SSH 连接就好。
例如,我们可以添加下面配置到 ~/.ssh/config
Host dev
HostName 192.168.26.2
以后直接 ssh dev
就能进去容器了。
VSCode 远程连接
这还需要我教你?装个插件就好了。
如果你要说你用的是开源的版本,然后没有 Remote SSH 插件可以用,你可能要换成某些开源替代品。
最后
至此,我们基于 systemd 全家桶的工具构建了简单高效的容器化开发环境,虽然整套都还是无头服务器版本,但我觉得目前来讲基本够用了。
如果你喜欢更加复杂的带头的仰卧起坐,可以参考:
不过一般来说我就不建议折腾这么复杂了。
评论
少女祈祷中...