我是docker和volume的新手,对命名卷的工作方式感到困惑。我想知道两种情况下命名卷的工作方式
第一个场景
我必须使用docker设置两个项目,并且两个都有独立的数据库。现在如何使用/var/lib/mysql
映射数据库卷?是否根据数据库名称维护单独的数据?
第二种情况 我有两个使用相同命名卷的服务。在这两个服务中,映射到命名卷的容器的路径都不同。这将如何工作?
services:
s1:
volume:
- vol:/var/lib/s1
s2:
volume:
- vol:/var/lib/s2
volumes:
vol:
答案 0 :(得分:0)
由于您使用的是docker-compose
,因此它可以为您做一些事情。如果组成的“项目名称”为project_a
,则docker-compose vol
卷将命名为project_a_vol
。通过运行docker volume ls
进行验证。 “组合项目名称”是指项目名称,该名称通常等于运行docker-compose
的目录的名称;如果设置了--project-name
参数,则自定义名称(例如, docker-compose --project-name xxx up
)
我假设您正在使用默认的Docker卷文件系统存储驱动程序。命名卷不过是/var/lib/docker/volumes
文件夹中的目录(尝试使用sudo ls -l /var/lib/docker/volumes
)。通过使用vol:/var/lib/s1
挂载卷,您告诉docker同步目录:
本地/var/lib/docker/volumes/project_a_vol
,容器目录为/var/lib/s1
。
如果您通过这种方式撰写服务:
services:
s1:
volumes:
- vol:/var/lib/s1
s2:
volumes:
- vol:/var/lib/s2
同一目录将被安装到两个服务:s1
和s2
,您很可能会遇到问题,因为两个服务将尝试同时读取和写入同一目录。除非这些服务可以处理这种情况。
最好有单独的卷。在这种情况下,可以清除一项服务的卷,而保留另一项服务。
答案 1 :(得分:0)
对您的问题的一些提示。
第一个场景:两个带有一个DB的Docker容器。
-对于这种情况,因为数据库不同,所以它们在自己的容器空间上运行。
-您可以创建Docker Volume或使用Docker bind mounts将磁盘附加到数据库`/ var / lib / mysql'
-如果使用卷,则每个数据库创建一个卷,并且数据是隔离的。
-如果使用绑定安装,请确保安装不同的磁盘位置;如果使用相同的位置,则第二个数据库容器数据将覆盖第一个数据库数据。
第二种情况:根据这种情况,由于“卷”标签相同,因此每次启动服务时,第二种即将出现的服务数据将替换已经运行的服务数据。