持久化应用
持久化应用与非持久化应用
创建应用时,你可以选择它是否需要 持久化数据。
默认情况下,为了获得更好的灵活性与可扩展性,你应该优先选择 非持久化应用。不过,有些应用需要在容器重启、崩溃或更新后仍能保留数据,这时就必须启用持久化。
如果你有大量静态数据,并且不希望每次构建都把它打包进去,你也可以把宿主机上的某个目录映射到容器内目录。通常只有在数据量非常大时才需要这样做。
持久化应用
持久化应用指需要把数据存到磁盘上,以便在重启、崩溃、容器更新等事件发生后数据仍然存在。由于数据保存在本地,它们会 锁定到某一台特定服务器。你可以把应用迁移到另一台服务器,但除非你手动迁移数据,否则已存储的数据会丢失。
需要持久化的应用示例:
- 数据库(例如 MySQL、PostgreSQL、MongoDB)
- 图片上传类应用:将图片保存在本地而不是使用第三方存储(例如 S3)
- 例如 WordPress 这类网页应用:将上传文件或插件存放在磁盘上
限制:
- 持久化应用 不能 扩容为多个实例。
多个容器共享同一个存储路径可能会导致数据损坏。
说明:
即使是持久化应用,也不是所有目录都会默认持久化。创建应用后,你必须在控制台的 应用详情 页面明确指定哪些目录需要持久化。
定义持久化目录
你可以通过两种方式配置持久化目录:
1. 使用标签(推荐)
由 CapRover 为你管理存储位置。
- 数据存储在:
/var/lib/docker/volumes/YOUR_VOLUME_NAME/_data - 容器内路径可自定义。
- 默认情况下,CapRover 会为卷名加上前缀
captain--。
例如输入my-volume最终会得到captain--my-volume。
2. 使用指定宿主机路径
你可以把宿主机上的 指定目录 映射到容器内的某个路径。
例如:
- 宿主机路径:
/var/usr - 容器内路径:
/my-host-usr-something
容器内保存到 /my-host-usr-something/myfile.txt 的文件,会在宿主机上对应为 /var/usr/myfile.txt。
重要:
如果你选择指定宿主机路径,请确保在绑定之前该目录在宿主机上 已经存在。
删除持久化应用
当你删除一个持久化应用时,其数据 不会自动被删除,以避免误操作导致数据丢失。若要删除持久化目录:
-
卷(基于标签)
- 列出卷:
docker volume ls - 删除目标卷:
docker volume rm NAME_OF_VOLUME

- 列出卷:
-
映射的宿主机目录
直接在宿主机上删除该目录:
rm -rf /path/to/directory
非持久化应用
对于 不需要把数据写入磁盘 的应用,应始终选择非持久化。 它们更灵活,并且在多服务器环境中,当某台服务器异常时可以自动迁移到其他服务器。
非持久化应用的优势:
- 可以无冲突地运行多个实例(存储隔离)
- 在多服务器部署中,可自动在其他服务器上重新部署
非持久化应用 仍然可以写磁盘,但容器因为崩溃、重新部署、配置更新或宿主机重启而重启时,写入其中的任何数据都会丢失。
示例:
- 一个用于分析上传图片的图像处理器(无状态且 CPU 密集)
- 一个 TODO 网页应用:数据库是持久化的,但网页应用本身不在本地存数据
- 一个图片上传应用:使用 S3 或其他第三方存储,而不是把图片保存在本地