我对码头工人比较新。我想建立一个postgres数据库,但我想知道如果重新创建容器,如何确保数据不会丢失。
然后我偶然发现了命名卷(不是绑定卷)以及如何使用它们。 但是......在Dockerfile中你不能使用命名卷。例如。数据:/ var / lib等 据我所知,使用Dockerfile它总是一个匿名卷。 所以每次我重新创建一个容器都会得到它 自己的新卷。
所以这是我的问题:
首先:如果容器得到更新或重新创建,新容器中的postgres数据库引用相同数据并且不会丢失对先前创建的匿名卷的引用,我该如何确定。
其次:如何使用yml文件? 是否可以将这样的数据库容器的多个副本引用到一个卷? (高可用性模式)?
如果有人能给我一些提示或最佳实践,那真的很棒。
提前谢谢。
答案 0 :(得分:9)
查看Postgres的Dockerfile,您会看到它声明了一个卷指令:
VOLUME /var/lib/postgresql/data
每当您运行新的Postgres容器而未指定--volume
选项时,docker会自动创建新卷。该卷具有随机名称。
您可以通过运行命令来查看所有卷:
docker volume ls
您还可以通过使用以下方法检查主机路径来检查卷上存储在主机上的文件:
docker volume inspect <volume-name>
因此,当您没有为run命令指定--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中要解决的限制。