默认情况下,在容器内创建的文件,都会保存在容器基于镜像之上的一个可读写层。但是,这一层是依赖于容器而存在的,当容器不存在时,这些数据也就不存在了。而且这些数据紧紧的耦合在容器内部,很难将这些数据导出。另一点,对容器的这一层进行写操作,需要额外的系统支持,相比挂载卷这种直接写主机文件系统效率要更低。

如何将主机的文件目录映射到Docker容器中呢?大致有三种方式:volumes、bind mounts、tmpfs mounts

三种挂载方式

区别:

Volume:由docker创建和管理,数据会放在/var/lib/docker/volumes/这个目录下,其他的应用不应该访问和修改这个目录的数据

一个volume可以挂载给多个容器使用

Bind mounts:可以挂载在主机的任何目录存放数据,其他应用也可以随时访问和修改其中的数据

tmpfs mounts:只保存在内存里,永远不会持久化到文件

使用场景:

一般来说,使用Volume都是更合适的选择。

只有在一些特殊场景下,使用Bind mounts,比如;需要和主机共享某些重要的系统配置文件

tmpfs mounts就更特殊了,可能是一些不想持久化的敏感数据的场景

volume

首先创建volume:docker volume create my-vol

在以前,通常使用-v或–volume用来给docker容器挂载卷,使用–mount给swarm service挂载卷。但是从Docker 17.06版本开始,官方建议统一使用–mount给容器挂载卷存储。–mount 要比-v的语义更明确,且语法更清晰

docker run -d --mount source=my-vol,target=/webapp ubuntu:18.04 
	/bin/sh -c "while true; do echo hello world; sleep 1; done"

–mount的参数语法后面是跟的键值对。source指的是主机上的文件目录名。target指的是容器内的路径。

bind mounts

映射 volume 跟映射本地目录是两种不同的映射方式。你想把本地目录挂进去,并不需要 volume,简单方便。像下面这样操作:

1
docker run -itd -v /host_path:/container_path suse15.2

1、语法

  -v hostFile:containerFile
  1. hostFile表示宿主机的目录或文件,需要提前存在的
  2. containerFile表示容器的目录或文件,运行容器时会自动创建
  3. 容器数据卷的权限默认是可读可写权限,如果需要设置权限,则使用命令 -v hostFile:containerFile:ro
  4. 如果没有指定hostFile,即命令如果为-v containerFile则宿主机的默认目录为 /var/lib/docker/volumes/ 下,具体的映射关系可以使用命令查看 docker inspect [容器名称]|grep /var/lib/docker/volumes
  5. 注意:目录只能挂载目录,文件只能挂载文件

参考:

https://blog.csdn.net/sch0120/article/details/106292036

https://baijiahao.baidu.com/s?id=1651349260944545842&wfr=spider&for=pc

https://blog.csdn.net/qq_37035946/article/details/100553755

(完)