一个应用部署在哪层上是个很难的决定,所以我决定列一套选择器
选择 VM 的理由
- 非 Linux 的,内核不同的
- 需要 Linux 特权的
- 在玩火,需要隔离的
选择 LXC 的理由
- 支持 Linux 的
- 没有提供 docker 安装方式的应用
- 长期运行,不怎么更新的基础设施服务
- 硬件经常变化的
- 需要开机自启的
- 需要可交互环境的
- 需要保持持久化变更的(如修改系统文件)
- 需要系统级别备份功能的
- 应用数据散落各处的,靠挂目录不够的
- 需要限制资源用量的
- 计划用 DHCP 获取 IP 地址的
- 想要个简单的资源使用情况记录(但没有报警)
选择 Docker 的理由
- 版本经常变更的
- 一次性即用即抛的
- 需要多版本共存的
- 可自动化、脚本式管理的(LXC 打包镜像流程复杂)
- 应用数据仅一个文件夹可以搞定的
- Proxmox VE Scripts 上没有的
- 不想要整个系统,只运行应用(LXC 会启动自己的 init 进程,有 DHCP / console 等进程重复占用资源)
各家都能实现
必须得长时间运行的/系统启动时运行的/和系统网络相关的
需要硬件资源直通的
有定时任务的
经常要登入上去的
多个进程的
若是真想要以 Docker 为基座部署所有服务,那就不会把 Docker Daemon 放在 LXC、VM 上,而是直接 Bare Metal 放在 PVE 主机上以 Unprivileged 模式部署。因为中间多的一层总觉得很蠢,单节点环境也用不上迁移、备份的功能。
至于如何安装 Docker,就如 LXC vs LXD vs Proxmox Containers vs Docker - FAQ - Proxmox VE 所说,最好是在独立的 VM 中安装,既能降低攻击面,又能保留正真操作系统所需的特权功能。
选择举例
| 应用 | 选择 | 原因 |
|---|---|---|
| Docker Daemon | VM | 需要特权 |
| OpenWrt | LXC | 轻量、版本不常变更、架在多张网卡之间 |
| SQL Database | LXC | 基础服务 |
| PKI Service | LXC | 需要注册到 DHCP 上 |
| Hermes Agent | LXC | 需要给他一个完整的运行环境,当然 VM 更好 |
| Home Assistant | Docker | 需要 HACS 扩展,而 LXC 无法提供 |
| OpenList | Docker | 就是个普通的 Web APP,也经常更新 |
总结就是,需要时刻在线(断电重启后也自启动),需要在线备份的应用选择 LXC,其余应用都是 Docker。