postgresql - 带有卷的 dockerized postgresql

标签 postgresql docker volumes

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

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

所以我的问题来了:

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

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

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

提前谢谢你。

最佳答案

查看 Postgres 的 Dockerfile ,您会看到它声明了一个音量指令:

VOLUME /var/lib/postgresql/data

每次运行一个新的 Postgres 容器时,如果不指定 --volume 选项,docker 会自动创建一个新卷。该卷被赋予一个随机名称。

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

docker volume ls

您还可以通过检查主机路径来按卷检查存储在主机上的文件:

docker volume inspect <volume-name>

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

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,需要指定--volume选项。一旦指定,docker 将不会创建新卷,它只会将现有卷挂载到 docker 命令中指定的文件夹中。

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

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 允许你这样做......

但是,请注意卷仅限于它们创建的主机。当在多台机器上运行容器时,卷需要可以从所有机器访问。有一些方法/工具可以实现这一目标 但它们有点复杂。这仍然是 Docker 中需要解决的一个限制。

关于postgresql - 带有卷的 dockerized postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47457634/

相关文章:

postgresql - 警告 : concurrent delete in progress within table while creating index in big table in Postgres 9. 2

java - 如何将外部应用程序属性传递给 Docker 容器中的 Spring Boot 应用程序

PHP & PostgreSQL – sslmode 值 "require"在未编译 SSL 支持时无效

sql - 根据初始查询的结果执行许多计数查询的总和

ubuntu - 没有容器运行时使用端口的 docker-proxy

docker - 无需链接的Docker卷。用例是什么?

data-storage - 什么是数据量?

cocoa - 如何使用 Cocoa 查找已安装卷上的可用空间量?

sql - 在 postgresql JSON 中添加列

docker - 如何将 ffmpeg 命令安装到我的 docker 中