前言
在家庭数据中心的搭建过程中,涉及到了3种虚拟技术,分别是传统的Virtual Machine(VM)、Linux容器(LXC)、以及我们搭建应用时候主要使用的docker技术。
为什么我会同时使用这3种虚拟技术呢?
要回答这个问题,我们先要搞清楚这3种技术之间的关系。说起来,这3种技术其实存在“包含”的大小关系,如下图(随手画的,比较随意,看得明白就成):
上图中的包含关系正确的来说应该是虚拟内容的多少,圈越大需要虚拟的内容就越多。
1、Virtual Machine(下文中就简称VM)
VM技术需要虚拟全套硬件,包括cpu、内存、网卡、硬盘、显卡等等,这种程度的虚拟会消耗一定的系统资源,不过带来的好处是完全的资源隔离性,这个在实际生产环境中尤为重要,可以确保重要业务之间的完全隔离。正常情况下,使用VM技术搭建的虚拟机是裸硬件,需要自行安装操作系统,不过可以通过制作模板的方式来提高部署效率。
本质上来讲,VM就是虚拟硬件。
2、Linux容器(LXC)
VM技术是通过消耗资源换来完全的资源隔离性,但是有时候我们也可能不太在意资源的完全隔离性而反而在意消耗,比如我:一台inter-cpu-mini主机,i5 13400的cpu(才10核还分大小~),64g内存,这点资源多一个虚拟机就是多一份消耗,蚊子再小也是肉啊,所以这种情况下不到万不得已我是不会用Virtual Machine来搭建虚拟机的。
这个时候,LXC技术就显得尤为实用:如果你的宿主机的操作系统是Linux,那么LXC技术可以几乎无消耗的提供给你各种发行版的Linux(还包含不同版本的选择)的虚拟机,而且新建一个虚拟机只需要几秒的时间,甚至还包含很多基础组件库,你说气人不?
本质上来讲,LXC就是虚拟Linux系统(通过共享宿主机内核的方式)。
3、docker
使用VM搭建的虚拟机是裸硬件,使用LXC搭建的虚拟机是裸Linux系统(且对宿主机操作系统有要求),但是对于大部分人而言并不在意硬件和使用的宿主操作系统(win,Linux,macos),而只是关心需要部署的应用,那么这个时候docker就是最理想的选择了。docker最大的优势就是只要能成功部署运行环境,不管硬件是pc,nas,服务器,软路由还是其他什么乱七八糟的硬件,统统都能运行。按照血统来看,docker其实是LXC加强了cgroup和namespace之后的产物。
不同环境下虚拟技术的选择
讲清楚了3个虚拟技术的各种优劣势,再回到家庭数据中心搭建中的选择问题。
由于要利旧乞丐版的m1 mac-mini(只有8g内存,干啥都嫌小),想来想去,就安装了docker desktop for mac作为主力的docker运行环境,同时作为tailscale中继服务器(这个以后专门用一篇文章讲)、apple缓存服务器、proxy发布服务器、VNC远程运维服务器,也算充分利用了。
inter-cpu-mini主机安装了PVE虚拟环境(Esxi是收费软件,不符合我们搭建家庭数据中心时免费的理念,关键宿主系统还没法折腾,比如安装tailscale),其免费版都支持集群部署、迁移这些功能,还原生支持LXC,加上PVE7.4本身就是基于debian 11的,可玩性高,除了这个还有其他选择吗。。?
PVE虚拟环境中,同时部署了2种类型的虚拟机(VM和LXC)。所有需要源码方式部署的应用都分开放在不同的LXC中,起到了一定的隔离作用(例如可以分开重启不同的LXC)。通过VM搭建的虚拟机有2个,一个是win11(作为RDP远程运维服务器,emby演示服务器),这个没办法,只能用虚拟机;另一个是debian12。
为什么有一个debian12的虚拟机?这个就和LXC的一些局限有关了。前面提到过,LXC本质上是和宿主机Linux共享内核,其为了安全,默认限制了一些对宿主机root调用的权限(可以通过启用特权模式容器开启,但是一般不建议这么干),所以如果在LXC中运行docker(“容器”套“容器”),有少量需要使用到宿主机root权限的应用就会报错(比如长亭雷池的WAF和宝塔云控平台)。为此,我专门创建了一个debian12的虚拟机用来作为备用docker环境,LXC就专注跑源码部署的应用了。其实LXC跑docker是最好的,只要docker没有特殊的权限要求,但是我有强迫症,不想LXC部署一堆docker,debian12虚拟机又部署一堆docker,所以干脆就把备用环境的docker全放在debian12虚拟机上跑了。
综上所述,适合docker部署的就用docker,适合源码部署的就用LXC,迫不得已的时候就用VM。