默认情况下,在容器内创建的文件,都会保存在容器基于镜像之上的一个可读写层。但是,这一层是依赖于容器而存在的,当容器不存在时,这些数据也就不存在了。而且这些数据紧紧的耦合在容器内部,很难将这些数据导出。另一点,对容器的这一层进行写操作,需要额外的系统支持,相比挂载卷这种直接写主机文件系统效率要更低。
Docker提供两种独立于容器之外的持久化存储技术,volumes, and bind mounts
不管选哪种挂载方式,在容器内部看起来都是一样的。
区别:
Volume:由docker创建和管理,数据会放在/var/lib/docker/volumes/这个目录下,其他的应用不应该访问和修改这个目录的数据
一个volume可以挂载给多个容器使用
Bind mounts:可以挂载在主机的任何目录存放数据,其他应用也可以随时访问和修改其中的数据
tmpfs mounts:只保存在内存里,永远不会持久化到文件
使用场景:
一般来说,使用Volume都是更合适的选择。
只有在一些特殊场景下,使用Bind mounts,比如;需要和主机共享某些重要的系统配置文件
tmpfs mounts就更特殊了,可能是一些不想持久化的敏感数据的场景
命令:
在以前,通常使用-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指的是容器内的路径
使用docker inspect d82a4478a8 查看一下容器详情
在Mounts标签下是挂载的信息
"Mounts": [{"Type": "volume","Name": "my-vol","Source": "/var/lib/docker/volumes/my-vol/_data","Destination": "/webapp","Driver": "local","Mode": "z","RW": true,"Propagation": ""}]
查看主机上目录:
/var/lib/docker/volumes/my-vol/_data
查看容器内的目录
docker exec -it d82a4478a8a8 进入容器命令行交互
可以看到我们挂载的target目标文件夹 /webapp
移除volume
现在要删除volume,只删除容器是不行的。
需要执行
docker volume rm my-vol