6

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

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

所以我的问题来了:

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

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

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

先感谢您。

4

1 回答 1

14

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

VOLUME /var/lib/postgresql/data

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

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

docker volume ls

您还可以通过使用以下命令检查主机路径来检查卷存储在主机上的文件:

docker volume inspect <volume-name>

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

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

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

作为最佳实践,请命名具有有价值数据的卷。例如:

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

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

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

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

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

于 2017-11-23T18:31:50.713 回答