05-Docker挂载

作者: 紫荆秋雪_文 | 来源:发表于2021-10-14 11:21 被阅读0次

一、挂载类型

无论是使用那种类型的挂载,容器内的数据看起来都是一样的。它作为目录或容器文件系统中的单个文件。卷挂载(volumes)、绑定挂载(bind mounts)和tmpfs mounts挂载之间的区别就在于数据在 Docker 主机上的位置

image.png

卷挂载(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.png

1、overlay工作原理

OverlayFS 在单个Linux主机上分为两个目录,并将它们呈现为单个目录。这些目录称为,统一过程称为联合挂载。OverlayFS指的是下层目录(lowerdir)和上层目录(upperdir)。统一视图称为merged

2、Docker镜像和Docker容器是如何分层的

  • 镜像层是lowerdir
  • 容器层是upperdir
  • 统一视图通过一个名为 merged的公开目录,实际上是容器的安装点
  • 在镜像层和容器层包含相同文件的情况下(写时复制),优先使用容器中文件

相关文章

  • 05-Docker挂载

    一、挂载类型 无论是使用那种类型的挂载,容器内的数据看起来都是一样的。它作为目录或容器文件系统中的单个文件。卷挂载...

  • 05-docker安装redis

    1 拉取redis镜像 2 Docker挂载配置文件 即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改...

  • docker卷挂载特点

    容器的卷挂载分为不同的挂载方式,有匿名挂载、具名挂载及绑定挂载 其中匿名挂载与具名挂载相比,使用匿名挂载在容器运行...

  • Linux学习操作系统优化

    挂载知识补充: ps:在挂载的时候不要使用有数据的挂载目录。 mount 挂载设备 挂载点 umount 挂载点

  • mount 挂载与 umount 卸载

    mount:挂载 挂载本地光盘: NFS 挂载: CentOS 挂载 U 盘: 查看挂载的情况: 查看某台主机提供...

  • 挂载

    目录: 一、挂载 二、挂载loop设备 三、挂载网络资源 四、挂载目录到另一个目录上 五、挂载配置文件 一、挂载 ...

  • 我的第一篇博客

    搭建本地YUM本地库iso挂载 挂载: 卸载: 挂载:

  • CENTOS挂载磁盘

    临时挂载 永久挂载

  • [LN_05] Linux挂载 & 用户登录信息查看命令

    一、Linux挂载命令 挂载目的是分配挂载点(分配盘符),Linux的挂载点是用目录来指定 1. 查询与自动挂载 ...

  • 挂载命令

    查询与自动挂载 mount -l 查询系统中已经挂载的设备 mount -a 自动挂载 挂载命令 mount -t...

网友评论

    本文标题:05-Docker挂载

    本文链接:https://www.haomeiwen.com/subject/kqfjoltx.html