查看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 中需要解决的一个限制。