Docker挂载主机磁盘空间
默认情况下,在容器内创建的文件,都会保存在容器基于镜像之上的一个可读写层。但是,这一层是依赖于容器而存在的,当容器不存在时,这些数据也就不存在了。而且这些数据紧紧的耦合在容器内部,很难将这些数据导出。另一点,对容器的这一层进行写操作,需要额外的系统支持,相比挂载卷这种直接写主机文件系统效率要更低。
如何将主机的文件目录映射到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、语法
-v hostFile:containerFile
- hostFile表示宿主机的目录或文件,需要提前存在的
- containerFile表示容器的目录或文件,运行容器时会自动创建
- 容器数据卷的权限默认是可读可写权限,如果需要设置权限,则使用命令
-v hostFile:containerFile:ro
- 如果没有指定hostFile,即命令如果为
-v containerFile
则宿主机的默认目录为/var/lib/docker/volumes/
下,具体的映射关系可以使用命令查看docker inspect [容器名称]
|grep /var/lib/docker/volumes
- 注意:目录只能挂载目录,文件只能挂载文件
参考:
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
(完)
- 原文作者: 闪电侠
- 原文链接:https://chende.ren/2021/04/01191643-docker-file.html
- 版权声明:本作品采用 开放的「署名 4.0 国际 (CC BY 4.0)」创作共享协议 进行许可