带有卷的 dockerized postgresql

dockerized postgresql with volumes

我对 docker 比较陌生。我想设置一个 postgres 数据库,但我想知道如果我重新创建容器,如何确保数据不会丢失。

然后我偶然发现了命名卷(不是绑定卷)以及如何使用它们。 但是......在 Dockerfile 中你不能使用命名卷。例如。数据:/var/lib 等 据我所知,使用 Dockerfile 它始终是一个匿名卷。 所以每次我重新创建一个容器时,它都会得到它的 自己的新卷。

所以我的问题来了:

首先:如果容器得到更新或重新创建,我如何确保新容器中的 postgres 数据库引用相同的数据并且不会丢失对先前创建的匿名卷的引用。

其次:这如何与 yml 文件一起使用? 是否可以将此类数据库容器的多个副本引用到一个卷中? (高可用性模式)?

如果有人能给我提示或最佳实践,那就太好了。

提前致谢。

查看 Postgres 的 Docker 文件,您会看到它声明了一个卷指令:

VOLUME /var/lib/postgresql/data

每次你 运行 一个新的 Postgres 容器,在没有指定 --volume 选项的情况下,docker 会自动创建一个新卷。卷的名称是随机的。

您可以通过 运行ning 命令查看所有卷:

docker volume ls

您还可以按卷检查存储在主机上的文件,方法是使用以下命令检查主机路径:

docker volume inspect <volume-name>

因此,当您没有为 运行 命令指定 --volume 选项时,docker 会为 Docker 文件中声明的所有卷创建卷。如果您忘记为您的卷命名并且数据不应该丢失,这主要是为了安全。

Firstly: how do I make sure, if the container get's updated or recreated that the postgres database from within the new container references to the same data and not losing the reference to the previously created anonymous volume.

如果要docker使用同一个卷,需要指定--volume选项。一旦指定,docker 将不会创建新卷,它只会将现有卷安装到 docker 命令中的指定文件夹。

作为最佳做法,请为包含有价值数据的卷命名。例如:

docker run --volume postgresData:/var/lib/postgresql/data ...

如果您 运行 第一次执行此命令,将创建卷 postgresData 并将在主机上备份 /var/lib/postgresql/data。第二次 运行 主机上备份的相同数据将被装载到容器中。

Secondly: how does this work with a yml file? is it possible to reference multiple replicas of such a database container to one volume?

是的,卷可以在多个容器之间共享。您可以将相同的卷挂载到多个容器中,并且这些容器将使用相同的文件。 Docker compose 允许你这样做......

但是,请注意卷仅限于创建它们的主机。当 运行 在多台机器上连接容器时,卷需要可以从所有机器访问。有 ways/tools 来实现 但它们有点复杂。这仍然是 Docker.

中要解决的限制