参考博客:https://www.cnblogs.com/sparkdev/p/8504050.html
数据覆盖的两条规则:
如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。【覆盖】
我的测试结论:
规则1:
按路径挂载:如果容器中的非空目录是其Dockerfile中使用VOLUME命令声明过的,则容器内文件会被复制到宿主机。否则,容器内的目录会被清空。具名或匿名挂载:复制规则始终成立 规则2:只要宿主机的目录不为空,则一定会覆盖掉容器内的目录。 2、测试
重点在于规则1。
测试:使用Docker安装rabbitmq。
Rabbitmq的Dockerfile文件中声明了一个匿名数据卷:/var/lib/rabbitmq。
Rabbitmq的相关目录:
保存数据:/var/lib/rabbitmq保存配置:/etc/rabbitmq
/etc/rabbitmq中有一个conf.d文件夹,里面包含一个10-default-guest-user.conf的配置文件
测试一:按路径挂载数据和配置目录
[root@aliyunECS rabbitmq]# docker run -id --name=my-mq -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 15692:15692 > -v ~/rabbitmq/data:/var/lib/rabbitmq > -v ~/rabbitmq/conf.d:/etc/rabbitmq/conf.d > --hostname=myrabbit rabbitmq:3.9.13-management507b30bc5b8381a8c32eb060a9a2aaa091dc019b81c72c359a59bd63c3a671c5[root@aliyunECS rabbitmq]# lsconf.d data[root@aliyunECS rabbitmq]# ls datamnesia[root@aliyunECS rabbitmq]# ls data/mnesia/rabbit@myrabbit rabbit@myrabbit-feature_flags rabbit@myrabbit.pid rabbit@myrabbit-plugins-expand[root@aliyunECS rabbitmq]# lsconf.d data[root@aliyunECS rabbitmq]# ls conf.d/
现象:从12行和16行可以发现,宿主机上的data目录同步到了容器内的数据,但conf.d目录没有同步到。注意data目录是Dockerfile中使用VOLUME声明过的,而conf.d没有。
测试二:按具名挂载的方式挂载数据和配置目录
[root@aliyunECS rabbitmq]# docker run -id --name=mymq -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 15692:15692 > -v rabbit_data:/var/lib/rabbitmq > -v rabbit_conf.d:/etc/rabbitmq/conf.d > --hostname=myrabbit rabbitmq:3.9.13-management[root@aliyunECS rabbitmq]# docker volume inspect rabbit_conf.d[ { "CreatedAt": "2022-02-22T15:55:15+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/rabbit_conf.d/_data", "Name": "rabbit_conf.d", "Options": null, "Scope": "local" }][root@aliyunECS rabbitmq]# ls /var/lib/docker/volumes/rabbit_conf.d/_data10-default-guest-user.conf
现象:观察第20行可以发现,使用具名挂载后,conf.d目录也被同步下来了。