Docker之volume使用

volume概述

容器中文件存储和数据持久性问题:

  • 容器中的文件存储在多个只读层和一个读写层之上,导致宿主机上的文件形式复杂,不便于访问和修改。
  • 容器运行过程中的数据存储在读写层,容器停止后这些数据会丢失。

Volume的优势:

  • Volume是存在于一个或多个容器中的特定文件或文件夹,以联合文件系统的形式在宿主机中存在。
  • Volume提供了数据的共享和持久化,解决了容器中文件存储和数据持久性的问题。
  • Volume的操作对数据立即生效,而且不会影响到镜像本身。

Volume的特性:

  • Volume在容器创建时自动初始化,容器运行起来后可以直接使用。也可以在容器之外单独创建Volume。
  • Volume可以在不同容器之间共享和重用,实现了容器间数据的直接共享。
  • Volume的生命周期独立于容器的生命周期,即使删除容器,Volume的数据仍然可以被使用。

总的来说,Volume是Docker中用于解决容器数据存储、持久性和共享的重要机制,提供了便利和灵活性,使得容器在处理数据时更加方便、高效,并确保了数据的持久性和可靠性。

使用流程

1.创建volume

通过命令 docker volume create 创建 volume

lua 复制代码
docker volume create myvol

上述命令会创建一个名为my_vol的Volume。可以将my_volume替换为你希望的Volume名称。创建Volume后,它就可以被挂载到容器中,用于数据的存储和共享。

默认情况下,创建的Volume会被存储在/var/lib/docker/volumes/myvol目录下。如果Volume没有被命名,Docker会为其分配一个长字符串作为标识。

在/var/lib/docker/volumes/目录下,你会看到所有已创建的Volume的列表。这个目录是Docker默认用来存储Volume数据的位置。这种设计使得Docker中的Volume可以独立于容器存在,可以被多个容器共享,确保了数据的持久性和可靠性。

创建完Volume后,可以使用-v--mount参数将Volume挂载到Docker容器中。这两种方式都允许容器与Volume建立关联,使得容器可以读取和写入Volume中的数据。

javascript 复制代码
docker run -v my_volume:/path/to/mountpoint my_image

上述命令中,my_volume是你创建的Volume的名字,/path/to/mountpoint是容器内部的挂载点。该命令会将my_volume挂载到容器内的指定路径,使得容器可以在该路径下读写Volume中的数据。使用docker run --mount命令,你可以将一个特定的Volume(由source参数指定)挂载到容器内部的指定路径(由target参数指定)。这样,容器就可以与Volume建立关联,可以在指定的路径下读写Volume中的数据。这种方式提供了更精确的挂载控制,允许你灵活地管理容器与Volume之间的数据共享。

使用--mount参数:

bash 复制代码
docker run --mount source=my_volume,target=/path/to/mountpoint my_image

这里,source=my_volume指定了Volume的名字,target=/path/to/mountpoint指定了容器内部的挂载点。与-v参数类似,--mount参数也用于将Volume挂载到容器内部。

target=/path/to/mountpoint:指定了容器内部的挂载点,也就是Volume将要挂载到容器内部的路径。在容器内部,这个路径会与指定的Volume建立关联,容器可以通过该路径读写Volume中的数据。

总的来说,--mount参数允许你将一个特定的Volume(通过source指定)挂载到容器内部的指定路径(通过target指定),从而实现容器与Volume之间的数据共享和持久化。这种方式提供了更灵活的挂载选项,可以更精确地控制Volume在容器内部的位置。

在Docker中,启动的容器可以通过docker inspect命令来查看其详细信息,包括与之关联的Volume信息。

xml 复制代码
docker inspect <container_id_or_name>

其中<container_id_or_name>是容器的ID或名称,将会得到一个包含容器详细信息的JSON输出。在这个JSON输出中,你可以找到与容器关联的Volume信息,其中的Source字段指示了Volume在宿主机上的目录。这个信息告诉你Volume的具体存储位置,以及容器可以在哪里读写Volume的数据。

通过查看Source字段,你可以确定Volume在宿主机的实际存储路径,这对于了解数据的存储位置和进行必要的维护操作非常有用。

2.容器启动添加volume

讨论一种在Docker中创建Volume的一种简单方式。你可以在创建容器的时候,使用-v参数(或者--mount参数)来创建一个Volume。

bash 复制代码
docker run -v /path/on/host:/path/in/container my_image

这个命令会在创建容器时,在宿主机的/path/on/host路径上创建一个匿名的Volume,并将其挂载到容器内的/path/in/container路径上。匿名的Volume会被分配一个长字符串作为标识。

bash 复制代码
docker run --mount source=my_volume,target=/path/in/container my_image

这个命令中,my_volume是一个已经存在的Volume的名字。它会将指定的Volume挂载到容器内的/path/in/container路径上。target=/path/in/container指定了在容器内部的挂载点,也就是Volume将要挂载到容器内部的路径。容器内的应用程序可以通过这个路径访问Volume中的数据。使用docker run --mount命令,你可以将一个已存在的Volume(由source参数指定)挂载到容器内部的指定路径(由target参数指定)。这样,容器就可以与已存在的Volume建立关联,可以在指定的路径下读写Volume中的数据。

这两种方式都会在容器启动时创建一个Volume,用于在容器和宿主机之间共享数据。在第一种方式中,如果不指定Volume的名字,会创建一个匿名的Volume,而在第二种方式中,可以使用已经存在的具名Volume。这种方法非常方便,适用于快速创建和使用Volume的场景。

3.DockerFile添加volume

在Dockerfile的语法中,可以使用VOLUME指令来定义一个或多个Volume。VOLUME指令用于将一个目录标记为Volume,容器在启动时会自动创建这些Volume。这些Volume可以用于在容器内部存储数据,并且在容器之间共享这些数据。

bash 复制代码
FROM ubuntu
VOLUME /data

在上述的Dockerfile中,VOLUME /data指令定义了一个名为/data的Volume。当容器基于这个Dockerfile构建并运行时,Docker会自动创建一个/data的Volume,容器内部的数据可以存储在这个Volume中。VOLUME /data指令定义了一个名为/data的Volume。当基于这个Dockerfile构建并运行容器时,Docker会自动创建一个/data的Volume。这意味着在容器内部,你可以将数据存储在/data路径下,而这些数据将会被持久化保存在创建的Volume中。

使用VOLUME指令,你可以将容器内的特定目录标记为Volume,使得容器在运行时能够与主机之间实现数据共享和持久化。该Volume会在容器运行时被自动创建,无需手动操作。这种方法允许你定义容器内部的持久化数据存储位置,使得数据不会随着容器的销毁而丢失,提供了数据持久化和共享的解决方案。

这种方式允许你明确地在Dockerfile中定义Volume,以便在容器运行时使用,而不需要在容器启动时手动创建Volume。容器运行时,你可以将这些Volume挂载到不同的容器中,以实现数据的共享和持久化。

一般,在Docker中创建Volume后会执行以下操作:

  • 创建Volume:当你在Docker容器中使用VOLUME /data指令时,Docker会创建一个名为/data的Volume。
  • 自动挂载到容器内部:在容器启动时,Docker会自动将这个Volume挂载到容器内部的挂载点/data上。
  • 目录复制:如果Docker镜像中存在一个目录/data,那么在容器启动时,容器的/data目录中的文件会被复制到Volume对应的宿主机目录中。这个宿主机目录通常位于/var/lib/docker/volumes/下。

这种行为确保了容器内的数据能够持久化保存在宿主机的Volume中。任何在容器内/data目录下的文件或数据都会被复制到Volume中,并在宿主机的指定位置(通常是/var/lib/docker/volumes/下的一个子目录)保存。这样,即使容器被删除,Volume中的数据仍然存在,可以被其他容器或应用程序访问和使用。

在Dockerfile中使用Volume时需要注意一个重要的点:Volume只有在容器创建的时候才会被挂载。因此,如果在Dockerfile中尝试将Volume作为一个目录并执行一些操作,这些操作在构建镜像的过程中是不会生效的。原因是在构建镜像时,Volume对应的目录在当前镜像中是不存在的。

bash 复制代码
FROM ubuntu
VOLUME /data
RUN mkdir /data/myfolder

在这个例子中,尝试在镜像构建时创建/data/myfolder目录是无效的,因为Volume/data只有在容器运行时才会被挂载。所以,在Dockerfile中,你无法在Volume上执行文件操作,比如创建目录、写入文件等。这种操作应该在容器运行时,而不是在镜像构建时进行。Volume的挂载发生在容器启动的时候,而不是在镜像构建的时候。

相关推荐
大怪v27 分钟前
【Virtual World 04】我们的目标,无限宇宙!!
前端·javascript·代码规范
狂炫冰美式1 小时前
不谈技术,搞点文化 🧀 —— 从复活一句明代残诗破局产品迭代
前端·人工智能·后端
xw52 小时前
npm几个实用命令
前端·npm
!win !2 小时前
npm几个实用命令
前端·npm
代码狂想家2 小时前
使用openEuler从零构建用户管理系统Web应用平台
前端
dorisrv3 小时前
优雅的React表单状态管理
前端
蓝瑟3 小时前
告别重复造轮子!业务组件多场景复用实战指南
前端·javascript·设计模式
dorisrv4 小时前
高性能的懒加载与无限滚动实现
前端
韭菜炒大葱4 小时前
别等了!用 Vue 3 让 AI 边想边说,字字蹦到你脸上
前端·vue.js·aigc
jingshaoqi_ccc4 小时前
ubuntu 24下面安装docker
ubuntu·docker·eureka