Docker 数据卷容器

发布时间:2024年01月18日

docker在容器中管理数据主要有两种方式:

  • 数据卷(Volumes)
  • 挂载主机目录(Bind mounts)

????????而每个容器的数据都是独立的,数据跟随着容器的生命周期。如mysql容器,如果容器被删除了所有的数据都会丢失。所以容器的数据不能放在容器里面,数据卷就用来管理容器中的数据的。

数据卷?

????????为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合 文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。?

????????数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器,它可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

数据卷作用:

????????将宿主机(虚拟机)的目录或者文件放到容器中去,容器删除了但是数据卷(虚拟机的目录里面的内容不受影响),将需要修改的配置文件在外面写好,通过数据卷的形式放到容器中来做替换。

1. 数据卷容器挂载

1.1.创建数据卷

docker volume create my-vol

命令如下:

参数可以为数字“1”,字母L:大小写均可,但效果不一样?
? ? ?ls -1 /var/lib/docker/volumes

此时,数据卷默认会放到/var/lib/docker/volumes路径下,会发现所新建的数据卷位置,查看


1.2.查看所有的数据卷

docker volume ls


1.3.查看指定数据卷的详细信息(显示一个JSON格式的数据)

docker volume inspect my-vol


1.4.删除一个volume

docker volume rm my-vol

注:数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,所以要及时删除。

1.5.启动一个挂载数据卷的容器

  • 挂载数据卷,最好是通过run而非create/start创建启动容器
  • create/start命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以?
# 示例
docker run -itd \ #-it挂载后会直接进入容器,-itd则是在挂载不进入(后台运行)
--name 容器名字 \
--mount source=数据卷名称,target=容器中的对应目录 \ 
镜像名称


## demo1
? ? ?docker run -itd \
? ? ? ?--name tomcat01 \
? ? ? ?--mount source=my-vol,target=/webapp \
? ? ? ?centos:latest

?## demo2
? ? ?docker run -itd \
? ? ? ?--name tomcat02 \
? ? ? ?--mount type=bind,source=/root/webapp02,target=/root/webapp02 \
? ? ? ?centos:latest ? ? ? ?

注1:linux命令结尾加斜杠有什么用 ??
????????加了 “ \ ” 意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车

注2:source=my-vol,target=/webapp
? ? ? ? ? my-vol为要挂载的数据卷,如果数据卷不存在,docker会自动创建
? ? ? ? ? /webapp为容器上目录,如果目录不存在, docker会自动创建 ??

注3:mount选项高级用法
? ? ? ? ? --mount选项的type参数支持三种类型的数据卷
? ? ? ? ? --mount标志:由多个名值对组成,逗号分隔,每个键值由 <key> = <value> 元组组成?
? ? ? ? ?
注4:--mount type=volume,source=my-vol,target=/webapp

? ? type的默认值,提前先创建数据卷:

  • type=volume普通数据卷(默认即这种类型),映射到主机/var/lib/docker/volumes路径下;
  • bind:绑定数据卷,映射到主机指定路径下:? ? ? ? ??
--mount type=bind,source=/webapp,destination=/webapp2
  • ?tmpfs :临时数据卷,只存在于内存中
? docker run -itd \
? ? ? ? ? ? ? --name tmptest \
? ? ? ? ? ? ? --mount type=tmpfs,destination=/app \
? ? ? ? ? ? ? nginx:latest

注意:source=my-vol,target=/webapp

????????这个指令会将my-vol内容替换掉webapp的内容,所以这中方式一般不用,如果需要将指定文件进行挂载就要使用目录挂载

2.?目录挂载

????????如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。 数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。

2.1.首先我们在宿主机上创建一个目录用于存放资源

进入创建的tomcat数据卷路径,放入一个war包

2.2.Tomcat 挂载目录(简化)

docker run -itd \
--name t1 \
-v /soft/oapro.war:/usr/local/tomcat/webapps/oapro.war \
-p 8080:8080 \
tomcat:8.5.20

挂载成功,访问tomcat:?

访问资源:

3. Tomcat在线部署案例?

????????实现 Tomcat 在线部署是指在 Tomcat 运行的过程中,通过上传 WAR 文件或目录来动态地添加、删除或更新 Web 应用程序。这种方式可以避免每次更改应用程序时都要重新启动 Tomcat 的麻烦,并大大提高了开发和调试的效率。

?点进去报错,最初是没有配置登录信息的:

?1、修改tomcat配置,有两个文件需要修改可以直接在本地tomcat找到并修改上传到虚拟机:

  • apache-tomcat-8.5.40\webapps\manager\META-INF\context.xml?
  • apache-tomcat-8.5.40\conf\tomcat-users.xml

2、然后重启docker进行目录挂载

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

3、再次访问 Manager App:输入配置密码

4、上传资源

?

文章来源:https://blog.csdn.net/Justw320/article/details/135549495
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。