一、挂载类型
image.png无论是使用那种类型的挂载,容器内的数据看起来都是一样的。它作为目录或容器文件系统中的单个文件。卷挂载(volumes)、绑定挂载(bind mounts)和tmpfs mounts挂载之间的区别就在于数据在 Docker 主机上的位置
卷挂载(volumes)
- 存储在由 Docker (/var/lib/docker/volumes/ 在Linux上)管理的主机文件系统中的一部分
绑定挂载(bind mounts)
- 可以存储在主机系统的任何位置。甚至可能是重要的系统文件或目录
- Docker 主机 或 Docker 容器上的非 Docker 进程可以随时修改它们
tmpfs mounts挂载
- 存储在主机系统的内从中,永远不会写入主机系统的文件系统中
二、卷挂载(volumes):推荐使用
卷挂载.png- 有Docker创建和管理
- 使用
docker volume create
命令显示创建卷,或者 Docker 可以在容器或服务创建期间创建卷
docker volume create
- 卷由 Docker 管理并且与主机的核心功能隔离
- 卷支持使用卷驱动程序,允许将数据存储在远程主机或提供商上
- 此外,与在容器的可写层中持久化数据相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外
- 如果容器生成非持久状态数据,请考虑使用
tmpfs挂载
以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能 - 卷使用 rprivate 绑定传播,并且无法为卷配置绑定传播
1、卷比绑定的优势
- 卷比绑定安装更容易备份或迁移
- 可以使用 Docker CLI 命令或 Docker API 管理卷
- 卷适用于 Linux 和 Windows 容器
- 卷可以在多个容器之间更安全地共享
- 卷驱动程序运行将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能
- 新卷的内容可以由容器预先填充
- Docker 桌面上的卷比 Mac 和 Windows 主机上的绑定挂载具有更高的性能
2、-v 或 --mount
-
--mount
更明确和详细 -
-v
语法将所有选项组合在一个字段中 - 如果需要指定卷驱动程序选项,则必须使用
--mount
-
-v
或--mount
由三个字段组成,以冒号符(:)分割。字段必须按正确的顺序排列,每个字段的含义不是很明显- 在有明确的卷的情况下,第一个字段时卷的名称,并且在给定的主机上是唯一的。对于匿名卷,第一个字段被省略
- 第二个字段是容器中的文件或文件夹路径
- 第三个字段时可选的,是以逗号分隔的选项列表,如
ro
3、创建和管理卷
- 创建卷
docker volume create ravenVolume
- 显示卷
docker volume ls
DRIVER VOLUME NAME
local 9350882ceed3c7b76f6b691d1a3293b5b2e462e3cc5682febba8c39cda0b5025
local ravenVolume
- 显示卷信息
docker volume inspect ravenVolume
[
{
"CreatedAt": "2021-10-13T10:11:23+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/ravenVolume/_data",
"Name": "ravenVolume",
"Options": {},
"Scope": "local"
}
]
- 删除卷
docker volume rm ravenVolume
4、启动容器时并挂载卷
4.1、匿名卷启动容器,挂载Nginx html静态界面
docker run -d -p 80:80 -v /usr/share/nginx/html nginx
- 4.1.1:查看Docker会创建一个随机码唯一的 卷
local fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5
- 4.1.2:查看Nginx容器信息
docker inspect 93
"Mounts": [
{
"Type": "volume",
"Name": "fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5",
"Source": "/var/lib/docker/volumes/fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
- 4.1.3:访问正常 image.png
-
4.1.4:修改挂载卷
cd /var/lib/docker/volumes/fe86f2ed452fe28b6ddd95cb4b4a4d9c624b2aea5a358225aa8eaa457b3a2fd5/_data
50x.html index.html
- 修改index.html 文件后 image.png
4.2、启动容器时挂载具名卷,Docker会为您创建该卷
docker run -d -p 80:80 -v mynginx:/usr/share/nginx/html nginx:latest
- 查看Docker是否会自动创建 mynginx 卷
DRIVER VOLUME NAME
local mynginx
- 通过docker inspect mynginx 查看详情
- 正确显示挂载一个卷,显示了正确的源和目标,并且挂载是读写的
"Mounts": [
{
"Type": "volume",
"Name": "mynginx",
"Source": "/var/lib/docker/volumes/mynginx/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
]
-
正常显示
image.png -
修改配置文件
cd /var/lib/docker/volumes/mynginx/_data
-rw-r--r-- 1 root root 497 Sep 7 23:21 50x.html
-rw-r--r-- 1 root root 615 Sep 7 23:21 index.html
- 修改 index.html 文件后显示 image.png
三、绑定挂载(bind mounts) 图片来自官网.png
- 与卷挂载相比,绑定挂载的功能有限
- 主机上的文件或目录会挂载到容器中,文件或目录由其在主机上的完整路径引用
-
绑定挂载允许访问敏感文件
- 使用绑定挂载的一个副作用,无论好坏,都可以通过容器中运行的进程更改主机文件系统,包括创建、修改或删除重要的系统文件或目录。这是一种强大的能力,可能会产生安全隐患,包括影响主机系统上的非Docker进程
1、绑定操作造成空挂载
- 启动容器
docker run -d -p 80:80 -v "$(pwd)"/html:/usr/share/nginx/html nginx:latest
- 查看本地,html文件创建成功,但是html内容为空
- 无法正常显示结果 image.png
- 进入容器查看html中内容也为空
小结
- 造成了空挂载
- 使用绑定的挂载原理是,把宿主机中挂载路径中的文件挂载到容器中,这也就是造成
空挂在
的根源所在。卷挂载原理正好相反 - 在宿主机的html中创建index.html就可以正常显示 image.png
四、tmpfs mounts挂载
- tmpfs挂载不会持久保存在磁盘上,无论是在 Docker 主机上还是在容器内。在容器的生命周期内,容器可以使用它来存储非持久状态或敏感
五、OverlayFS 存储驱动程序
image.png1、overlay工作原理
OverlayFS 在单个Linux主机上分为
两个目录
,并将它们呈现为单个目录
。这些目录称为层
,统一过程称为联合挂载
。OverlayFS指的是下层目录(lowerdir)和上层目录(upperdir)。统一视图称为merged
2、Docker镜像和Docker容器是如何分层的
- 镜像层是
lowerdir
- 容器层是
upperdir
- 统一视图通过一个名为
merged
的公开目录,实际上是容器的安装点 - 在镜像层和容器层包含相同文件的情况下(写时复制),优先使用容器中文件
网友评论