持久化应用
持久化与非持久化应用
创建应用时,你可以选择是否需要持久化数据。
默认情况下,为了获得更好的灵活性和可扩展性,应优先选择非持久化应用。不过,有些应用需要在容器重启、崩溃或更新后保留数据,因此需要启用持久化。
如果有大量不希望在每次构建中都打包的静态数据,你也可以将主机上的目录映射到容器内的目录。除非数据量非常大,否则通常不需要这样做。
持久化应用
持久化应用需要将数据存储在磁盘上,以便数据在重启、崩溃、容器更新及其他事件后仍然存在。由于数据存储在本地,这类应用会固定到特定服务器。你可以将它们移动到另一台服务器,但除非手动迁移,否则所有已存储的数据都会丢失。
需要持久化的应用示例:
- 数据库(例如 MySQL、PostgreSQL、MongoDB)
- 将图片存储在本地而不是使用第三方存储(例如 S3)的图片上传应用
- WordPress 等将上传文件或插件存储在磁盘上的 Web 应用
限制:
- CapRover 默认会将持久化应用保持为一个实例。控制面板会在显示警告后允许高级覆盖设置,但共享本地存储路径的多个实例可能会破坏数据。只有在存储驱动和应用都针对并发访问进行设计时,才应进行扩展。
注意:
即使是持久化应用,也不是所有目录默认都会持久化。创建应用后,你必须在控制面板的应用详情页面中明确指定需要持久化的目录。
定义持久化目录
你可以通过两种方式配置持久化目录:
1. 使用 Labels(推荐)
CapRover 会为你管理存储位置。
- 数据存储在:
/var/lib/docker/volumes/YOUR_VOLUME_NAME/_data - 容器路径可以自定义。
- 当前 CapRover 版本会使用你输入的卷名称。由 1.15 之前版本升级而来的安装可能仍保留以
captain--为前缀的物理卷名称。请使用docker volume ls确认服务器上的名称。
2. 使用特定的主机路径
你可以将主机上的特定目录映射到容器内的路径。
例如:
- 主机路径:
/var/usr - 容器路径:
/my-host-usr-something
保存在容器 /my-host-usr-something/myfile.txt 的文件,可以通过主机上的 /var/usr/myfile.txt 访问。
重要:
如果选择特定的主机路径,请确保在分配该路径之前,主机上已经存在对应目录。
移除持久化应用
删除应用时,控制面板会列出关联的命名卷,并允许你选择要移除的卷。CapRover 会检查选中的卷是否被其他服务使用,然后再执行删除。主机路径目录会保留在主机上,需要手动移除。
-
命名卷
- 在应用删除对话框中选择卷,或手动列出卷:
docker volume ls
- 确认没有服务使用某个卷后,可以手动移除:
docker volume rm NAME_OF_VOLUME
- 在应用删除对话框中选择卷,或手动列出卷:
-
映射的主机目录 备份所需数据,确认准确路径,然后直接从主机移除目录。
rm -rf /path/to/directory
非持久化应用
不需要将数据存储在磁盘上的应用,应始终使用非持久化模式。 它们更加灵活,并且在某台服务器变得不健康时,可以自动迁移到其他服务器。
非持久化应用的优势:
- 可以无冲突地运行多个实例(存储彼此隔离)
- 在多服务器设置中自动重新部署到其他服务器
非持久化应用仍然可以写入磁盘,但其中存储的任何数据都会在容器因崩溃、部署、配置更新或主机重启而重新启动时丢失。
示例:
- 分析上传照片的图像处理器(无状态且占用 CPU)
- 数据库是持久化的、但 Web 应用本身不在本地存储数据的 TODO Web 应用
- 使用 S3 或其他第三方存储,而不是在本地保存图片的图片上传应用