绑定卷bind mount

-v和-mount都可以进行绑定卷的创建

创建卷

功能:完成卷映射

语法:

docker run -v name:directory[:options]...

参数:

第一个参数表示的是宿主机目录,这个和管理卷是两个概念,第二个参数是卷映射到容器的目录,第三个参数表示的是选项,比如说有ro表示的就是read only

样例:

root@VM-24-7-ubuntu:~# docker run -d -it --name devtest -v "$(pwd)"/target:/app nginx
e387ba58e12c80be33a814e0998a815da1ed4e17623954d5cad2a2c44dfa0d21

操作案例

使用mount创建绑定卷

创建一个nginx容器,并且把宿主机的/webapp1目录挂载到容器的/usr/share/nginx/html上

root@VM-24-7-ubuntu:~# docker run -d -p 80:80 --name bind1 --mount type=bind,source=/data/myworkdir/fs/webapp1,target=/usr/share/nginx/html nginx
11a8ccfec2692842f4f44ffa6b3bccc6c05df4e0691bf62583b9ad9491582563

查看挂载信息

docker inspect bind1

进入到容器的终端,查看挂载点目录

root@VM-24-7-ubuntu:~# docker exec -it bind1 ls /usr/share/nginx/html
root@VM-24-7-ubuntu:~# cd /data/myworkdir/fs/webapp1
root@VM-24-7-ubuntu:/data/myworkdir/fs/webapp1# ls

由此可以看出,这两个内部都是没有内容的,这也是bind mount模式和volume模式最大的不同点

在宿主机添加index.html

root@VM-24-7-ubuntu:/data/myworkdir/fs/webapp1# echo hello bind mount > index.html
root@VM-24-7-ubuntu:/data/myworkdir/fs/webapp1# cat index.html 
hello bind mount

然后进行查看nginx:

在这里插入图片描述

删除容器

root@VM-24-7-ubuntu:/data/myworkdir/fs/webapp1# docker rm -f bind1
bind1
root@VM-24-7-ubuntu:/data/myworkdir/fs/webapp1# ls
index.html

此时内容依旧存在

使用场景

什么时候用volume,什么时候用bind,tmpfs?

volume:这是Docker宿主机文件系统的一部分,用于不需要规划具体目录的场景

bind:bind amount完全是依赖于主机的目录结构和操作系统,用于目录需要提前进行规划的场景,比如MySQL中的目录需要一个空间比较大的,其他服务有不占用的时候,用volume就不合适

tmpfs:用于敏感文件存储,文件不想存储在宿主机和容器的可写层之间

存储卷的意义?

  1. 跨主机使用:Docker存储卷式使用其所在的宿主机上的本地文件系统目录,也就是说宿主机上有一块片,这块磁盘没有共享给其他的Docker主机,那么工期在这个宿主机上停止或者删除,是可以重新进行创建的,但是不能调度到其他的主机上,这就是Docker没有解决的问题,所以Docker存储卷默认就是Docker所在的本地
  2. 启动参数位置:容器有一个问题,就是启动的选项比较多,如果下次再进行启动时候,可能会导致启动的参数遗忘,因此就需要有一个文件用来保存容器的启动,这就是容器编排工具的使用,一般情况下,可以使用命令来进行Docker的启动,但是也可以使用文件来进行读取,也就是说是借助读取文件来进行启动,读取一些比如说有存储卷这样的信息,但是也只是操作一个容器,如果有太多的容器需要进行操作,那么此时就需要用到专门的容器编排工具

管理卷和绑定卷的区别?

Docker提供了两种主要的方式来在容器和宿主机之间持久化和共享数据:管理卷(Docker Managed Volumes)和绑定挂载(Bind Mounts)。下面是两者之间的主要区别:

  1. 管理方式

    • 管理卷(Docker Managed Volumes):是由Docker直接管理和维护的存储区域。这些卷存储在宿主机的一个特定目录下(通常是 /var/lib/docker/volumes),但对用户来说是抽象化的。用户不需要关心宿主机上的确切路径,Docker会自动处理卷的创建、挂载和删除。这为数据提供了更好的隔离性和可移植性,因为卷不依赖于宿主机的具体文件系统布局。

    • 绑定挂载(Bind Mounts):直接将宿主机上的一个目录或文件挂载到容器内的一个目录。这意味着你需要明确指定宿主机上的源目录。这种类型的挂载让用户可以直接控制数据的存放位置,并且可以利用宿主机的文件系统特性,比如SELinux标签或访问控制。但这也意味着数据管理的责任在于用户,且可能与宿主机的目录结构和权限紧密耦合。

  2. 数据生命周期

    • 管理卷独立于任何单一容器的生命周期存在,可以在多个容器间共享,即使这些容器被删除,卷中的数据仍然会被保留,除非显式地删除卷。
    • 绑定挂载的生命周期通常与宿主机上的目录或文件绑定,如果删除了宿主机上的源目录,那么数据也会丢失。
  3. 便携性和可迁移性

    • 管理卷更便于在不同宿主机间迁移容器,因为它们是Docker管理的标准化实体,可以在Docker网络中轻松复制和移动。
    • 绑定挂载在跨宿主机迁移时可能需要重新配置,因为它们直接引用宿主机的特定目录。
  4. 功能特性

    • 管理卷支持额外的功能,如备份、恢复、加密以及在容器间共享,而不影响宿主机的文件系统。
    • 绑定挂载则较为基础,主要是实现简单的文件共享,但可能在某些特定场景下(如需要高性能I/O或特定权限设置)更为灵活或高效。

总的来说,选择使用管理卷还是绑定挂载,取决于你的具体需求:是否需要高度的数据控制和性能,或者更倾向于数据的隔离性、可移植性和易于管理性。在开发环境中,绑定挂载可能因为其灵活性而更受欢迎;而在生产环境中,管理卷因其提供的高级特性和数据管理便利性而成为优选。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐