使用 Docker 卷持久化数据

Docker 容器是短暂的。当容器停止时,写入其中的任何数据都会丢失。因此,如果您希望在 Docker 中使用 Neo4j 时持久化数据,则必须将存储挂载到容器。存储还允许您将数据进出容器。

可以通过两种方式将存储挂载到容器

  • 主机文件系统上的文件夹。

  • Docker 卷——Docker 管理的命名存储位置。

有关如何将存储挂载到 Docker 容器的说明,请参阅官方 Docker 文档绑定挂载

Neo4j 提供了几个用于存储的挂载点,以简化在 Docker 中使用 Neo4j。以下部分描述了挂载点及其使用方法。

Neo4j 挂载点和权限

下表是 Neo4j Docker 镜像识别的挂载点和文件权限的完整参考。

所有列出的挂载点都是**可选的**。Neo4j 可以完全不挂载任何卷就在 Docker 中运行。但是,对于除最基本用例之外的所有用例,将存储挂载到/data都被认为是必不可少的。

如果容器发生任何问题,在没有/data挂载的情况下运行容器化的 Neo4j 会导致**不可恢复的数据丢失**。

表 1. Neo4j 容器的挂载点
挂载点 所需权限 描述

/data

读,写

Neo4j 数据库的数据存储。请参阅将存储挂载到/data

/logs

读,写

Neo4j 日志的输出目录。请参阅将存储挂载到/logs

/conf

[1]

在启动时将配置文件传递给 Neo4j。
请参阅修改默认配置

/plugins

[2]

允许您在容器化的 Neo4j 中安装插件。
请参阅插件

/licenses

通过挂载许可证文件夹来提供 Neo4j 和任何插件的许可证。
请参阅安装插件许可证

/import

使csv和其他可导入文件可用于neo4j-admin import

/ssl

为 Neo4j 提供 SSL 证书以进行消息加密。
请参阅Neo4j Docker 容器中的 SSL 加密

/metrics

企业版指标文件的输出目录。请参阅指标

1. 使用dump-config功能时需要写入权限。

2. 使用NEO4J_PLUGINS功能下载和存储插件时需要写入权限。

将存储挂载到/data

Docker 中的 Neo4j 将数据库文件存储在/data文件夹中。通过将存储挂载到/data,任何写入 Neo4j 的数据都将在容器停止后持久化。

停止容器,然后重新启动并挂载相同的文件夹到/data,将启动一个使用相同数据的新容器化 Neo4j 实例。

如果 Neo4j 无法正确关闭,它可能已将数据置于错误状态,并且很可能在启动时失败。这与在容器外部运行 Neo4j 并且未正确关闭的情况相同。

示例 1. 将存储挂载到/data挂载点的两种方法
将文件夹挂载到/data
docker run -it --rm \
   --volume $HOME/neo4j/data:/data \
   neo4j:5.25.1
创建命名卷并将其挂载到/data
docker volume create neo4jdata (1)
docker run -it --rm \
   --volume neo4jdata:/data \  (2)
   neo4j:5.25.1
1 创建一个名为neo4jdata的 Docker 卷。
2 将卷名neo4jdata挂载到/data

将存储挂载到/logs

Neo4j 日志输出写入/logs目录中的文件。此目录作为/logs卷挂载。通过将存储挂载到/logs,日志文件可在容器外部使用。

有关配置 Neo4j 的更多信息,请参阅配置
有关 Neo4j 日志文件的更多信息,请参阅日志记录

文件权限

出于安全原因,默认情况下,Neo4j 在容器内以neo4j用户身份运行。此用户的用户 ID 为7474。如果neo4j需要对挂载的文件夹进行读或写访问,但没有权限,则该文件夹将自动重新拥有到7474

这是一个方便的功能,因此您无需担心 Docker 中文件权限的细节,并且可以更轻松地开始使用。但是,这意味着挂载的文件夹会更改所有权,您可能会发现无法在没有 root 访问权限的情况下读取文件。

--user标志的 Docker run

docker run--user标志强制 Docker 以提供的用户身份运行。在这种情况下,如果该用户没有对任何挂载的文件夹所需的读或写访问权限,则 Neo4j 将无法启动。