【Docker 那些事儿】容器数据卷的本手

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在这里插入图片描述

文章目录


在这里插入图片描述

🌟 前言

在生产环境中使用 Docker 容器往往需要对数据进行持久化保存或者多个容器需要共享数据。
 
这时就会使用到容器数据卷通过容器数据卷管理容器数据是一项使用容器的基本技能。
 
我将会用两篇文章来详细介绍容器数据卷的使用及其相关内容。

1. 容器数据卷概念

容器技术使用 rootfs 机制与 Namespace构建出与宿主机隔离开的文件系统。在用户使用 Docker 容器的时候会产生一系列的数据文件。这些数据文件在 Docker 容器关闭时就会消失但是其中部分数据是用户希望能够保存的。
 
Docker 将应用与运行环境打包成容器进行运行用户希望在运行过程中产生的部分数据是可以持久化的并且容器之间能够实现数据互通。这正是容器数据卷Docker Volume要解决的问题。
 
Docker 中的数据可以存储在类似于虚拟机磁盘的介质中这种介质在 Docker 中称为数据卷。
 
数据卷以目录的形式呈现给 Docker不仅可用来存储 Docker 应用的数据还可以支持多个容器间数据共享并且修改数据卷文件也不会影响镜像。在 Docker 中使用数据卷就是在系统中挂载一个文件系统。
 
Docker 数据卷所使用的挂载技术就是 Linux 的绑定挂载。其主要作用是允许用户将一个目录或文件并非整个设备挂载到一个指定的目录上。
 
用户在该挂载点上进行的任何操作都只发生在被挂载的目录或文件上而原挂载点的内容则会被隐藏起来且不受任何影响。容器利用数据卷与宿主机进行数据共享从而实现容器间的数据共享与交换。

Docker 数据卷默认存储在宿主机的 /var/lib/Docker/volumes/ 目录下也可以指定挂载到任意位置。这种挂载仅存储在宿主机的内存中永远不会写入宿主机的文件系统。如图所示👇
在这里插入图片描述

数据卷的特点如下

  1. 容器启动时初始化如果容器使用的镜像包含数据卷这些数据也会复制到数据卷中。
  2. 容器对数据卷的修改是直接生效的。
  3. 数据卷的变化不会影响镜像的更新数据卷是独立于联合文件系统镜像是基于联合文件系统镜像与数据卷不会相互影响。
  4. 数据卷是宿主机中的一个目录与容器生命周期隔离。

2. 数据卷挂载

🍑 在命令行挂载数据卷

docker createdocker run 命令中使用 -v 为容器增加一个数据卷示例代码如下
在这里插入图片描述
以上示例使用 docker run 命令运行了一个容器并通过 -v 参数为容器添加了一个数据卷。

下面通过命令查看挂载信息示例代码如下
在这里插入图片描述
从以上示例中可以看到宿主机已经在 /var/lib/Docker/volumes/ 下自动生成了挂载目录。

下面通过命令行手动指定宿主机挂载目录示例代码如下
在这里插入图片描述
以上示例在后台运行了一个被命名为 testNginx 容器并为它挂载数据卷。

下面查看容器 test 的状态及挂载数据信息示例代码如下
在这里插入图片描述
上述示例中Mount 信息包含了上面创建的容器的详细挂载信息Source 指定了本机路径Destination 指定了容器内部的路径。

下面通过示例观察数据卷共享机制会在宿主机与容器端之间多次切换建议开启两个终端示例代码如下
在这里插入图片描述
以上示例创建了一个名为 testNginx 容器并将容器内的 /app 目录挂载至宿主机的 /web/webapp 路径下。

下面分别查看宿主机与容器的根目录下的文件示例代码如下
在这里插入图片描述
从以上示例中可以看到宿主机的根目录下新建了一个 web 目录而该目录下没有任何文件。

下面在宿主机的 /web 目录下创建文件并返回容器观察目录内容示例代码如下
在这里插入图片描述
从以上示例中可以看到在宿主机的挂载目录下创建的文件也会在容器中出现。

下面在容器中创建文件并返回宿主机观察目录内容示例代码如下
在这里插入图片描述
从以上示例中可以看出Docker 数据卷能够实现 Docker 容器与宿主机间的数据共享并且能够将容器中产生的数据永久保存下来随时在宿主机查看与修改。

在生产环境中容器服务的配置文件通常采用数据卷的方式挂载至容器内。为了防止容器内的误操作修改配置文件在挂载时可以进行权限设置。这样就可以达到在宿主机修改代码在容器内查看修改结果的目的。

下面创建容器并为数据卷设置权限示例代码如下
在这里插入图片描述
以上示例创建了一个名为 volumeNginx 容器并将挂载数据卷权限设置为 ro 只读。

下面查看数据卷是否挂载成功示例代码如下
在这里插入图片描述
从以上示例中可以看到数据卷已经挂载成功且宿主机挂载目录中没有任何文件。

下面为宿主机目录中添加文件并返回容器中查看效果示例代码如下
在这里插入图片描述
从以上示例中可以看到在容器挂载目录中可以查看文件内容。

下面在容器挂载目录下的文件中修改内容示例代码如下
在这里插入图片描述
以上示例中在容器挂载目录中修改文件时发生报错这是因为在容器中文件为只读类型无法进行修改。

下面在容器挂载目录中创建新的文件示例代码如下
在这里插入图片描述
以上示例中在容器挂载目录中创建文件时发生报错这是因为在容器中挂载目录同样为只读类型无法对其进行实质性的操作。

🍑 通过Dockerfile挂载数据卷

用户创建镜像时通常会在 Dockerfile 文件中加上 VOLUME[/date] 来创建含有数据卷的镜像并使用该镜像创建包含数据卷的容器。
 
Dockerfile 可以创建多个数据卷与使用 docker run 命令创建数据卷不同Dockerfile 中的数据卷不能映射到已经存在的本地目录。
 
在启动容器时才会创建 Dockerfile 中指定的数据卷并且以 Docker 中指定的名称命名。运行同样镜像的容器创建的数据卷是不一样的可以看到不同容器的数据卷地址也是不一样的。当容器中的数据卷地址不一样时容器之间就无法共享数据了。

下面使用 Dockerfile 中的 VOLUME 选项来指定挂载数据卷首先创建 Dockerfile 并添加内容示例代码如下
在这里插入图片描述
以上示例创建了一个 Dockerfile 文件并添加了内容即挂载三个数据卷。

下面通过该 Dockerfile 创建新镜像示例代码如下
在这里插入图片描述
以上示例中镜像已经构建完成并且执行了挂载三个数据卷的命令。

3. 数据卷容器

运行容器时宿主机会随机生成挂载目录无法保持目录地址一致所以无法实现容器间的数据共享。
 
数据卷容器可以有效地解决这个问题讲已命名的容器挂载数据卷其他容器通过挂载这个容器实现数据共享挂载数据卷的容器叫做数据卷容器。

数据卷容器挂载了一个宿主机目录其他容器连接数据卷容器来实现数据的共享。如图所示👇
在这里插入图片描述
下面启动一个名为 volume-container 容器此容器包含两个数据卷 /volume1/volume2这两个数据卷目录是在容器中的运行容器时会自动创建示例代码如下
在这里插入图片描述
上述示例中容器 volume-container 已经创建完成数据卷也挂载完成。

下面使用 Ctrl+P+Q 组合键退出当前容器终端查看挂载信息并在宿主机中为数据卷添加文件示例代码如下
在这里插入图片描述
上述示例在宿主机中分别为两个数据卷添加文件及文件内容。

下面创建容器 test1-container 容器用 --volumes-from 参数挂载 volume-container 中的数据卷示例代码如下
在这里插入图片描述
从以上示例中可以看出两个容器实现了数据共享。

下面将初始数据卷容器删除观察数据卷还能否正常工作示例代码如下
在这里插入图片描述
从以上示例中可以看到即使删除了初始的数据卷容器 volume-container 或其他容器只要有容器在使用该数据卷里面的数据就不会丢失。

下面删除所有容器再观察数据卷示例代码如下
在这里插入图片描述
以上示例中即使删除了所有容器数据卷也保留在宿主机中这大大保证了数据的安全性。

4. 备份数据卷

企业中业务数据不容有失人们通常会对数据进行一次备份或多次备份以保证数据的安全性。

下面创建一个名为 data-volumeCentOS 容器准备对其挂载的两个数据卷/ var/volume1/var/volume2 进行备份操作。示例代码如下
在这里插入图片描述
以上示例中容器已经创建完成数据卷也成功挂载。

下面在容器挂载目录中创建文件并添加内容示例代码如下
在这里插入图片描述
以上示例分别在容器挂载目录 volume1volume2 中创建了 a.txtb.txt 两个文件并在文件中添加了内容。

简而言之备份数据卷就是使用 -volumes-from 参数来创建一个挂载数据卷的容器从宿主机挂载要存放备份数据的目录到容器的备份目录并备份数据卷中的数据。

完成后使用 --rm 参数删除容器此时备份数据已经保存在当前的目录下。

示例代码如下
在这里插入图片描述
以上示例成功将容器中 /var/volume1/a.txt 文件备份到宿主机中并在备份之后将容器删除。

宿主机中 /root/backup/backup1.tar文件就是备份数据只是该文件经过了压缩。

下面以同样的方式对容器中 /var/volume2/b.txt 文件进行备份示例代码如下
在这里插入图片描述
此时两份文件都已备份到宿主机中。

下面解压备份文件并查看其目录结构示例代码如下
在这里插入图片描述
在以上示例中仍可以看到备份之前的路径。

另外也可以使用一条命令完成多个文件备份示例代码如下
在这里插入图片描述
以上示例中仅通过一条命令就成功备份了两份数据通常在需要备份多份数据时将会使用此方式。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker

“【Docker 那些事儿】容器数据卷的本手” 的相关文章