docker管理器创建容器设置目录映射时,根据填的宿主机目录格式,其实所采用的docker数据持久化技术是不同的。
bind mount方式
如果我填的宿主机目录格式为绝对路径(以/或者~开头)
例如上图我创建nginx容器时,把容器中的/usr/share/nginx目录映射到我宿主机/nginx_data这个绝对路径,那么此时我就是采用bind mount方式来进行容器数据持久化。
我们通过【docker inspect 容器id】 命令可以查看容器的具体信息,找到Mounts信息,可以看到如下图所示
type为bind就表示是以bind mount方式进行数据持久化的。
注意:
如果host机器上的目录不存在,docker会自动创建该目录
如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉
也就是说如果我宿主机的目录不存在,我以这种方式进行持久化,会导致我宿主机和容器的目录都被清空。验证:ls /nginx_data查看目录为空,进入容器查看/usr/share/nginx目录也被清空
volume方式
如果我填的宿主机目录格式为下图所示
例如上图我创建nginx容器时,把容器中的/usr/share/nginx目录映射到我宿主机nginx_volume这个volume,那么此时我就是采用volume方式来进行容器数据持久化。
我们通过【docker inspect 容器id】 命令可以查看容器的具体信息,找到Mounts信息,可以看到如下图所示
type为volume就表示是以volume方式进行数据持久化的,此时他会以我们设置的volume名在容器的Root dir/volumes目录下建立一个volume,其中_data文件夹就是
对容器中目录的映射。
与bind mount不同的是,如果volume是空的而container中的目录有内容,那么docker会将container目录中的内容拷贝到volume中,
如果volume中已经有内容,则会将container中的目录覆盖。
也就是说此种方式进行持久化,如果宿主机中的volume不存在,会创建一个volume,并把容器中的目录内容同步过来,不会进行清空
验证:ls /www/server/docker/volumes/nginx_volume/_data/ 可以看到里面有内容,进入容器查看/usr/share/nginx目录未被清空