阅读:47
Docker 提供了三种方式将数据从宿主机挂载到 Docker容器中: volumes、bind mounts、tmpfs 。
/var/lib/docker/volumes/
,非 Docker 进程不能修改这个路径下面的文件,所以说 Volumes 是容器数据持久存储数据最安全的一种方式。需要再次强调的是tmpfs
挂载是临时的,只存留在容器宿主机的内存中。当容器停止时,tmpfs
挂载文件路径将被删除,在那里写入的文件不会被持久化。
docker run -d \
-p 8888:8888 \
--tmpfs /tmp \
--name spboot zimug/docker-test:1
学过SpringBoot的同学可能都知道,SpringBoot项目启动之后会在/tmp目录下面解压出tomcat容器,提供web服务。
所以将/tmp
目录使用tmpfs方式挂载到宿主机的内存中,不仅场景合适,也会提升springboot项目的运行效率(内存操作)。
其实Bind Mounts挂载数据卷的方式也是大家最常见的一种方式,比如使用-v
参数绑定数据卷,其中/root/nginx/html
是我们任意指定的一个宿主机磁盘文件目录,这种情况下就是Bind mounts方式挂载数据卷。
-v /root/nginx/html:/usr/share/nginx/html/
除了使用-v
参数绑定的方式,还可以使用--mount
参数绑定的方式实现Bind mounts数据卷挂载。在--mount
参数绑定的方式之前,我们先创建一个宿主机文件路径mkdir -p /root/nginx/html
用于做实验 。
docker run -d --name bind-mount-nginx \
-p 80:80 \
--mount type=bind,source=/root/nginx/html,target=/usr/share/nginx/html/,readonly \
nginx:latest
--mount
以键值对的方式传参,比-v
提供了更多的选项
type=bind
表示以Bind mounts方式挂载数据卷source=/root/nginx/html
表示宿主机的文件路径target=/usr/share/nginx/html/
表示容器的文件路径,宿主机source文件路径挂载到容器的target路径在宿主机 /root/nginx/html
目录下新建一个index.html
,文件内容如下
<!DOCTYPE html>
<html>
<body>
<h1>Bind mounts</h1>
</body>
</html>
访问容器宿主机服务器80端口得到如下的响应结果,证明数据卷挂载成功了。
在--mount
中加入一个readonly配置参数,表示文件路径采用只读的方式挂载。即:该路径下的文件可以在宿主机上进行修改,但是容器内的应用程序不能修改该文件。
--mount type=bind,source=/root/nginx/html,target=/usr/share/nginx/html/,readonly
可以通过docker inspect <容器ID或容器名称>
查看数据卷的挂载结果,如下
"Mounts": [
{
"Type": "bind",
"Source": "/root/nginx/html",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": false,
"Propagation": "rprivate"
}
],
/root/nginx/html
,容器挂载目标路径/usr/share/nginx/html
"RW": false
表示只读模式,路径内文件不能被容器内程序修改大家可以通过docker exec -it <容器ID或容器名称> /bin/bash
进入容器内部尝试修改/usr/share/nginx/html
路径下的文件,看看能不能修改,相信经过你的验证答案一定是否定的。
可以通过公众号关注我哦,未来更多精彩公众号发布。博主正在进行量化投资方向研究,已经小有成果,有兴趣的小伙伴关注我,不要错过!