Docker数据卷挂载及宿主机目录挂载使用和区别
作者:Java方文山
✨前言
假设我们有一个容器化的机器学习模型训练应用程序。该应用程序需要大量的训练数据来进行模型的训练,而这些训练数据可能会占据大量的存储空间。如果我们将训练数据直接放在容器内部,会导致容器的镜像体积增大,每次创建或启动容器都需要复制整个数据集,这将消耗大量的时间和存储资源,而且容器被删除了不可逆,那么就会导致数据丢失非常的不方便。
当使用数据卷挂载和宿主机目录挂载时:
- 数据库存储:在容器化的应用程序中,数据库通常需要持久化存储数据。通过将数据库的数据卷挂载到容器中,可以确保数据在容器重启或更新时不会丢失。这样,即使容器被销毁,数据仍然可以在其他容器中使用。数据卷挂载还可以用于容器之间共享数据库的备份文件。
- Web服务器日志:对于运行在容器中的Web服务器,日志文件是非常重要的记录和分析工具。通过将宿主机上的日志目录挂载到容器中,可以实时记录容器内的日志,并将其保存到宿主机上。这样,在容器重启或删除后,日志仍然可以在宿主机上进行查看和分析。
- 文件共享:如果有多个容器需要访问相同的文件(例如配置文件、证书文件等),可以将这些文件放置在宿主机上的一个目录中,并将该目录通过宿主机目录挂载到各个容器中。这样,所有容器都可以共享和访问这些文件,而不需要在每个容器中复制一份。
- 静态资源存储:对于网站或应用程序中的静态资源(如图片、CSS和JavaScript文件),可以将这些资源放置在宿主机上的一个目录中,并通过宿主机目录挂载到运行Web服务器的容器中。这样,容器就可以直接从宿主机上加载和提供静态资源,而不需要将资源复制到每个容器中。
一、数据卷挂载
1.数据卷是什么
数据卷是一个虚拟目录,它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据。
为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
2.数据卷的基本使用
创建数据卷
docker volume create 数据卷名称
查看所有数据卷
docker volume ls
查看数据卷信息
docker volume inspect my-vol
删除一个volume
docker volume rm my-vol
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动 删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷 可能会占据很多空间,所以要及时删除.
挂载数据卷
在用 docker run 命令的时候,使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷 。
docker run -itd \ --name 容器名字 \ --mount source=数据卷名称,target=容器中的对应目录 \ 镜像名称
最好是通过run而非create/start创建启动容器,create/start命令创建启动容器后,再挂载数据卷 相当麻烦,要修改很多配置文件,但并非不可以。
加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行 输入,直到读到结束符,如回车
- 如果数据卷不存在,docker会自动创建
- 如果容器上目录不存在, docker会自动创建
注意:-it挂载后会直接进入容器,-itd则是在挂载不进入
查看是否挂载成功
首先查看我们数据卷的目录位置
docker inspect name
该目录就是数据卷的目录,我们现在进入该目录新建一个文本
然后我们进入容器查看是否有该文件,如果有文件说明挂载成功实现共享
二、宿主机目录挂载
1.什么是目录挂载
目录挂载是将主机上的一个目录直接挂载到容器中,容器中的文件会直接覆盖主机上的文件,这种方式不适合多个容器共享数据。目录挂载的好处是可以方便地将主机上的文件或目录与容器中的文件或目录进行同步,方便开发和调试。
2.目录挂载的基本使用
首先我们在宿主机上创建一个目录用于存放资源
将提前准备好的war放入该目录中
挂载目录
docker run -itd \ --name 容器名字 \ --mount type=bind,source=宿主机目录,target=容器中的对应目录 \ 镜像名称
或者使用简化版本
docker run -itd \ --name t1 \ -v /soft:/user/local/tomcat/webapps \ -p 8080:8080 \ tomcat:8.5.40
解释该命令的各个部分如下:
docker run
: 运行一个新的容器。-itd
: 这是三个选项的组合:-i
:保持标准输入 (stdin) 打开,即使未附加也可以与容器进行交互。-t
:为容器分配一个伪终端 (pseudo-TTY)。-d
:将容器设为后台运行模式。
--name t1
:为容器指定一个名称为 "t1",以便于管理和引用它。-v /soft:/user/local/tomcat/webapps
:将本地宿主机上的目录/soft
挂载到容器内的/user/local/tomcat/webapps
目录。这意味着容器中的 Tomcat 应用程序将能够访问并使用位于/soft
目录下的文件。-p 8080:8080
:将容器内的端口 8080 映射到宿主机的端口 8080。这样,当在宿主机上访问http://localhost:8080
时,实际上是访问容器内运行的 Tomcat 服务器。tomcat:8.5.40
:使用 tomcat:8.5.40 镜像启动容器。
但是这么使用有一个弊端,它是将整个文件夹进行替换我们想要的效果是单个文件进行替换
docker run -itd \ --name t1 \ -v /soft/oapro.war:/user/local/tomcat/webapps/oapro.war \ -p 8080:8080 \ tomcat:8.5.40
这样就可以精准替换我们想要的文件并且不应该原文件了
三、案例(实现Tomcat在线部署)
实现 Tomcat 在线部署是指在 Tomcat 运行的过程中,通过上传 WAR 文件或目录来动态地添加、删除或更新 Web 应用程序。这种方式可以避免每次更改应用程序时都要重新启动 Tomcat 的麻烦,并大大提高了开发和调试的效率。
但是直接点击就会报错,原因是因为我们没有用户信息
所以我们现在结合上面的内容进行目录挂载,首先我们需要
修改E:\apache-tomcat-8.5.40\webapps\manager\META-INF\context.xml
修改E:\apache-tomcat-8.5.40\conf\tomcat-users.xml
将就该完成的文件复制到liunx目录中
将我们docker中的tomcat文件进行替换
docker run -itd \ --name t1 \ -v /soft/tomcat-users.xml:/user/local/tomcat/conf/tomcat-users.xml \ -v /soft/context.xml:/user/local/tomcat/webapps/manager/META-INF/context.xml \ -p 8080:8080 \ tomcat:8.5.40
四、二者区别
数据卷挂载适合多个容器共享数据,而目录挂载适合单个容器与主机之间进行数据交换。
到此这篇关于Docker数据卷挂载及宿主机目录挂载使用和区别的文章就介绍到这了,更多相关Docker数据卷挂载及宿主机目录挂载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!