文章目录
- 绑定卷bind mount
- 创建卷
- 操作案例
- 使用mount创建绑定卷
- 使用场景
- 管理卷和绑定卷的区别?
绑定卷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:用于敏感文件存储,文件不想存储在宿主机和容器的可写层之间
存储卷的意义?
- 跨主机使用:Docker存储卷式使用其所在的宿主机上的本地文件系统目录,也就是说宿主机上有一块片,这块磁盘没有共享给其他的Docker主机,那么工期在这个宿主机上停止或者删除,是可以重新进行创建的,但是不能调度到其他的主机上,这就是Docker没有解决的问题,所以Docker存储卷默认就是Docker所在的本地
- 启动参数位置:容器有一个问题,就是启动的选项比较多,如果下次再进行启动时候,可能会导致启动的参数遗忘,因此就需要有一个文件用来保存容器的启动,这就是容器编排工具的使用,一般情况下,可以使用命令来进行Docker的启动,但是也可以使用文件来进行读取,也就是说是借助读取文件来进行启动,读取一些比如说有存储卷这样的信息,但是也只是操作一个容器,如果有太多的容器需要进行操作,那么此时就需要用到专门的容器编排工具
管理卷和绑定卷的区别?
Docker提供了两种主要的方式来在容器和宿主机之间持久化和共享数据:管理卷(Docker Managed Volumes)和绑定挂载(Bind Mounts)。下面是两者之间的主要区别:
-
管理方式:
-
管理卷(Docker Managed Volumes):是由Docker直接管理和维护的存储区域。这些卷存储在宿主机的一个特定目录下(通常是
/var/lib/docker/volumes
),但对用户来说是抽象化的。用户不需要关心宿主机上的确切路径,Docker会自动处理卷的创建、挂载和删除。这为数据提供了更好的隔离性和可移植性,因为卷不依赖于宿主机的具体文件系统布局。 -
绑定挂载(Bind Mounts):直接将宿主机上的一个目录或文件挂载到容器内的一个目录。这意味着你需要明确指定宿主机上的源目录。这种类型的挂载让用户可以直接控制数据的存放位置,并且可以利用宿主机的文件系统特性,比如SELinux标签或访问控制。但这也意味着数据管理的责任在于用户,且可能与宿主机的目录结构和权限紧密耦合。
-
-
数据生命周期:
- 管理卷独立于任何单一容器的生命周期存在,可以在多个容器间共享,即使这些容器被删除,卷中的数据仍然会被保留,除非显式地删除卷。
- 绑定挂载的生命周期通常与宿主机上的目录或文件绑定,如果删除了宿主机上的源目录,那么数据也会丢失。
-
便携性和可迁移性:
- 管理卷更便于在不同宿主机间迁移容器,因为它们是Docker管理的标准化实体,可以在Docker网络中轻松复制和移动。
- 绑定挂载在跨宿主机迁移时可能需要重新配置,因为它们直接引用宿主机的特定目录。
-
功能特性:
- 管理卷支持额外的功能,如备份、恢复、加密以及在容器间共享,而不影响宿主机的文件系统。
- 绑定挂载则较为基础,主要是实现简单的文件共享,但可能在某些特定场景下(如需要高性能I/O或特定权限设置)更为灵活或高效。
总的来说,选择使用管理卷还是绑定挂载,取决于你的具体需求:是否需要高度的数据控制和性能,或者更倾向于数据的隔离性、可移植性和易于管理性。在开发环境中,绑定挂载可能因为其灵活性而更受欢迎;而在生产环境中,管理卷因其提供的高级特性和数据管理便利性而成为优选。