当前位置: 首页> 文旅> 美景 > 校园网络建设_网络技术就业方向_如何推广外贸型网站_安顺seo

校园网络建设_网络技术就业方向_如何推广外贸型网站_安顺seo

时间:2025/7/10 20:27:27来源:https://blog.csdn.net/YaoXTao/article/details/145873474 浏览次数:0次
校园网络建设_网络技术就业方向_如何推广外贸型网站_安顺seo

docker的数据卷

一.数据卷的概述

Docker数据卷(Volumes)是一种在容器之间持久化和共享数据的方法。数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将宿主机操作系统目录映射到容器,是宿主机目录与容器目录之间映射的桥梁。

容器内的数据和文件系统的改动,都是发生在镜像栈最上面的容器层。容器内产生的这些文件系统和数据都是临时的,当把容器被删除时,这些数据也会跟着被删除。但是数据卷是不属于联合文件系统的,当容器被删除后数据卷中的数据任然会被保留下来。

Docker数据卷具有以下特性:

  1. 数据卷可以被多个容器挂载,实现数据的共享;
  2. 数据卷独立于容器的生命周期,容器被删除后,数据卷还是存在的,它还可以被其他容器重新挂载使用。数据卷直到没有容器使用后,才可以卸载它;
  3. 数据卷可以在不同的Docker主机之间迁移,实现数据的备份和恢复;
  4. 对数据卷的更新不会影响镜像,解耦了程序应用和数据;
  5. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。

Docker中提供了两种管理数据的方式:数据卷和数据卷容器。

二.数据卷的管理

1.volume命令

(1).docker volume create

docker volume create命令是创建一个数据卷,容器可以在创建好的数据卷中消费和存储数据。如果没给这个数据卷指定名称,Docker就会随机生成一个名称。

命令格式:

docker volume create [OPTIONS] [VOLUME]

参数选项:

  • -d,--driver:指定数据卷驱动程序名称,默认是local;
  • --label:为数据卷设置元数据;
  • -o,--opt:设置驱动程序特定选项。

示例:

docker volume create --driver local mydata

示例中我们使用了docker volume create命令创建了一个名称为“mydata”的数据卷,并指定数据卷驱动程序名称是local。

(2).docker volume inspect

docker volume inspect命令是显示数据卷的详情信息,我们可以指定一个模板来显示特定格式的详情信息,默认情况下是以JSON形式来显示的。

命令格式:

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

参数选项:

  • -f,--format:使用自定义模板设置输出格式。

示例:

docker volume inspect mydata

示例中我们使用了docker volume inspect命令返回了“mydata”数据卷的详情信息。返回的结果是JSON形式。从结果中可以看出“mydata”的数据卷对应了宿主机的/var/lib/docker/volumes/mydata/_data目录。

(3).docker volume ls

docker volume ls命令是罗列出Docker中所有数据卷的信息。

命令格式:

docker volume ls [OPTIONS]

参数选项:

  • -f,--filter:提供过滤筛选值;
  • --format:使用自定义模板设置输出格式;
  • -q,--quiet:仅显示数据卷名称。

示例:

docker volume ls
(4).docker volume prune

docker volume prune命令是删除未使用的数据卷。Docker在使用一段时间后,系统一般都会残存一些临时的、没有被使用的镜像文件。docker volume prune命令可以对这些文件进行清理,从而释放存储空间。

命令格式:

docker volume prune [OPTIONS]

参数选项:

  • -a,--all:删除所有未使用的数据卷,不仅仅是匿名卷;
  • --filter:提供过滤筛选值;
  • -f,--force:强制清理数据卷,无需弹出提示确认。

示例:

docker volume prune
(5).docker volume rm

docker volume prune命令是删除一个或多个数据卷。如果一个数据卷正在被容器使用,则不能通过docker volume prune命令进行删除。

命令格式:

docker volume rm [OPTIONS] VOLUME [VOLUME...]

参数选项:

  • -f,--force:强制删除数据卷。

示例:

docker volume rm mydata

2.docker run -v命令

当我们使用docker run命令或者docker create命令来创建一个容器时,可使用-v参数来创建一个数据卷。-v参数的主机目录必须使用绝对路径,如果指定目录不存在,Docker会自动创建这个目录。

docker run -it --name busybox-container -v /mydata hub.c.163.com/library/busybox:1.27-uclibc

上述命令中我们通过busybox的镜像创建了名称为” busybox-container”的容器,-v参数会在” busybox-container”容器中下创建一个mydata的数据卷目录。

当我们使用docker inspect命令查看容器的详情信息时,可以发现数据卷mydata目录和实际宿主机目录的对应关系。从容器的详情信息可以看出,数据卷是存储在Docker宿主机上/var/lib/docker/volumes/这个特定目录下的,挂载方式是“volume”数据卷挂载。

-v参数不仅可以创建一个数据卷,还可以将宿主机上的目录挂载为数据卷。我们在宿主机的opt目录下创建一个myVolume的目录。然后将这个目录挂载到容器的myData的目录下。

docker run -it --name busybox-container -v /opt/myVolume:/myData hub.c.163.com/library/busybox:1.27-uclibc

使用docker inspect命令查看容器的详情信息可以发现,容器的myData目录对应到了宿主机的/opt/myVolume目录,数据卷的挂载方式是bind(绑定挂载)。

我们在容器中的myData目录下创建一个名称为test的文件,在宿主机的/opt/myVolume的目录下就可以看到这个test文件。

Docker挂载数据卷的默认权限是可读可写的(rw),我们还可以使用ro参数以只读的方式来挂载一个数据卷,这样在容器的数据卷中目录下就不能修改,新增或删除文件了。

3.docker run -mount命令

当使用docker run命令或docker create命令在创建一个容器的时候,我们还可以使用-mount参数来绑定数据卷。-mount参数支持数据卷的三种挂载方式。

(1).volumn(数据卷)
  • volumn(数据卷)是Docker管理的、独立于容器的存储区域,提供了数据持久化和容器间共享的能力。
  • volumn(数据卷)存储在Docker宿主机上的特定目录,默认是 /var/lib/docker/volumes/(Linux系统),并且可以在容器间共享而不依赖于任何单一容器的生命周期。
  • 即使容器被删除,volumn(数据卷)的数据依然存在。
docker run -it --name busybox-container --mount type=volume,dst=/myData hub.c.163.com/library/busybox:1.27-uclibc

上述命令中我们使用了数据卷的挂载方式,在“busybox-container”的容器中挂载了myData这个数据卷目录。

使用docker inspect命令查看容器信息,可以发现数据卷的挂载方式是volume。容器中的myData目录对应了宿主机路径/var/lib/docker/volumes/下的一个目录。这种数据卷挂载的命令其实等价于docker run -it --name busybox-container -v /myData hub.c.163.com/library/busybox:1.27-uclibc 这种使用-v参数来新建一个数据卷的命令。

(2).bind mount(绑定挂载)
  • 绑定挂载是将宿主机上的文件系统路径直接挂载到容器内的过程。
  • 这种方式允许直接利用宿主机的文件系统资源,绑定挂载的存储位置和数据格式完全由宿主机控制,不受到Docker的直接管理。
docker run -it --name busybox-container --mount type=bind,src=/opt/myVolume,dst=/myData hub.c.163.com/library/busybox:1.27-uclibc

上述命令中我们使用了绑定挂载的方式,将宿主机的/opt/myVolume目录绑定到了容器的/myData目录下。

使用docker inspect命令查看容器信息时,可以发现数据卷的挂载方式是bind。容器中的myData目录对应了宿主机的/opt/myVolume目录。该命令其实等价于docker run -it --name busybox-container -v /opt/myVolume:/myData hub.c.163.com/library/busybox:1.27-uclibc的命令。

(3).tmpfs mount(tmpfs 挂载)
  • tmpfs挂载是将数据存储在宿主机的内存中,适用于临时文件或对速度有高要求的场景。
  • 这种类型的存储不会持久化,容器停止或宿主机重启后数据都会丢失。
  • tmpfs挂载适合存储敏感信息或缓存数据,因其不会写入磁盘,可以增加安全性。
docker run -it --name busybox-container --mount type=tmpfs,tmpfs-size=1m,tmpfs-mode=1755,dst=/myData hub.c.163.com/library/busybox:1.27-uclibc

上述命令中我们使用了tmpfs挂载的方式,在宿主机的内存中创建了一个大小为1M,mode为755的内存数据卷。

三.数据卷容器

如果我们需要在多个容器之间共享一些持久化的数据,就可以使用数据卷容器。数据卷容器也是一个容器,它可以提供自己创建的数据卷给其他容器挂载。

1.数据卷容器的使用

我们可以在一个容器中创建一个数据卷,其他的多个容器可以使用--volumes-from参数挂载这个已经创建的数据卷,这样的话,多个容器就共享了同一个数据卷。使用--volumes-from参数时所挂载数据卷的容器自身并不需要保持在运行状态。

docker run -it --name busybox-container1 -v /container-data-volume hub.c.163.com/library/busybox:1.27-uclibc

我们首先使用docker run命令创建了一个名称为“busybox-container1”的容器,并在这个容器中创建了“container-data-volume”数据卷目录。

docker run -it --name busybox-container2 --volumes-from busybox-container1 hub.c.163.com/library/busybox:1.27-uclibc

我们创建了一个名称为“busybox-container2”的容器,并使用--volumes-from参数从“busybox-container1”容器挂载了“container-data-volume”的数据卷目录。

docker run -it --name busybox-container3 --volumes-from busybox-container2 hub.c.163.com/library/busybox:1.27-uclibc

我们也可以从其他已经挂载了数据卷的容器来挂载数据卷。示例命令中创建了名称为“busybox-container3”的容器,使用--volumes-from参数就是从“busybox-container2”这个已经挂载了“container-data-volume” 数据卷目录的容器再来挂载数据卷。当然“busybox-container3”容器也是可以直接从“busybox-container1”这个容器来挂载数据卷的。

我们发现以上三个容器都挂载到了同一个“container-data-volume” 数据卷目录,若其中的一个容器在“container-data-volume” 目录下创建一个文件,其它的所有容器都可以在这个数据卷下看到这个文件。

我们在“busybox-container1”容器的“container-data-volume”目录下创建一个名称为test的文件,其他的两个容器的“container-data-volume”目录下都是可以看到这个文件的。

使用数据卷容器存储的数据是不会轻易丢失的,即使所有挂载数据卷的容器都被删除,数据依然还是还存在的。要删除一个数据卷,在没有容器使用的情况下可以使用docker volume rm命令来进行删除。或者可以在删除最后一个使用该数据卷的容器时,使用docker rm –v参数也可以将这个数据卷删除。

2.数据迁移

我们还可以使用数据卷容器对数据卷中的数据进行备份、恢复,以实现数据的迁移。

(1).备份
docker run -it --name busybox-container1 -v /container-data-volume hub.c.163.com/library/busybox:1.27-uclibc

以上命令中,我们创建了一个名称为“busybox-container1”容器,并在容器的“container-data-volume”目录绑定挂载了一个数据卷。我们在这个目录下创建三个文件,以便用于打包备份。

docker run --name busybox-container2 --volumes-from busybox-container1 -v $(pwd):/backup hub.c.163.com/library/busybox:1.27-uclibc tar cvf /backup/backup.tar /container-data-volume

上述的命令可以把“busybox-container1”容器数据卷中的所有文件进行打包,然后存放在宿主机的当前目录下。该命令主要做以下几件事情:

  1. 命令会创建一个名称为“busybox-container2”的容器;
  2. 使用--volumes-from参数从“busybox-container1”容器挂载了“container-data-volume” 数据卷目录。
  3. 使用-v参数把宿主机的当前目录绑定挂载到了“busybox-container2”容器的/backup目录。
  4. 最后使用tar cvf命令把“container-data-volume”数据卷中的文件打包成backup.tar后,存放在宿主机的当前目录下。

(2).恢复
docker run -it --name busybox-container3 -v /container-data-volume hub.c.163.com/library/busybox:1.27-uclibc

我们创建了一个名称为“busybox-container3”的容器,并在容器的“container-data-volume”目录也绑定挂载了一个数据卷。此时这个数据卷目录下还是空的。

docker run --name busybox-container4 --volumes-from busybox-container3 -v $(pwd):/backup hub.c.163.com/library/busybox:1.27-uclibc tar xvf /backup/backup.tar

上述命令是把我们先前备份在宿主机/backup目录下backup.tar文件的数据,恢复到“busybox-container3”容器的数据卷目录下面。该命令也主要做以下几件事情:

  1. 命令先创建一个名称为“busybox-container4”的容器;
  2. 使用--volumes-from参数从“busybox-container3”容器挂载了“container-data-volume” 数据卷目录。
  3. 使用-v参数把宿主机的当前目录绑定挂载了“busybox-container3”容器的/backup目录。
  4. 最后使用tar xvf命令把宿主机当前目录下的backup.tar文件解压到“container-data-volume”数据卷目录下。

当命令执行完成后,可以发现“busybox-container3”容器的数据卷目录下,出现了以前打包的三个文件。

四.数据卷插件

Docker数据卷默认是使用local类型驱动的,只支持将容器中的目录挂载到本地宿主机,但是不支持跨主机的数据卷挂载。

但是Docker社区中提供了数据卷管理的接口,我们可以根据自身需求来开发数据卷插件或者使用第三方插件来进行跨主机的数据卷管理。

目前社区已经有了很多的插件。比较有名的开源插件有:Convoy,Flocker,Rex-Ray等。

五.Docker环境下数据库持久化

我们在Docker环境下部署应用程序时,有可能会涉及到数据库。应用程序在使用过程中产生的业务数据,一般会存储在数据库中。由于数据库是部署在Docker容器中的,当我们重新创建容器时,存储在数据库中的数据都会丢失。所以把Docker容器中数据库的数据进行持久化是相当有必要的。

Docker提供了宿主机目录挂载到容器和数据卷的两种方式,来实现数据的持久化。本文中是以MySQL数据库为例来说明数据库如何持久化,首先我们在网易的镜像仓库中,先拉取一个MySQL数据库的镜像。

docker pull hub.c.163.com/library/mysql:8.0.1

1.宿主机目录挂载

使用宿主机目录挂载方式的话,就需要我们首先在宿主机上创建一个目录,这个目录是用于存放容器中MySql数据库的数据文件。

mkdir -p /opt/mysql/data

我们使用mkdir命令创建了opt/mysql/data目录,该目录专门用于存放数据库的数据文件。当然我们也可以创建一个log目录用于存放数据库的日志文件 (本文中只演示持久化数据文件) 。

创建好目录后,我们在使用docker run命令创建数据库容器时,需要使用-v参数把宿主机的/opt/mysql/data目录绑定挂载到容器的/var/lib/mysql目录下。/var/lib/mysql目录是容器中MySql数据库数据文件存放的目录。

docker run -d \--name=mysql-server \-e MYSQL_ROOT_PASSWORD="test123" \-p 3306:3306 \-v /opt/mysql/data:/var/lib/mysql \hub.c.163.com/library/mysql:8.0.1

此时带有MySql数据库的容器已经创建成功,我们可以使用数据库客户端工具Workbench来连接这个数据库,并在MySql数据库中创建一个名称为test1的数据库和一个t1的表。

数据库和表创建好后,我们把“mysql-server”容器停止并删除掉,然后再新创建一个“mysql-server1”的容器。

由于“mysql-server1”容器的/var/lib/mysql目录还是绑定挂载到宿主机的/opt/mysql/data目录。这个目录下的以前的数据库文件在删除容器时并没有跟着容器被删除掉。当我们Workbench再次连接数据库时,以前创建的test1数据库和t1表都还存在,这就保证了容器数据库数据的持久化。

2.数据卷

使用数据卷和宿主机目录方式的挂载方式大致是相同的,所不同的是我们需要首先创建一个数据卷的目录,然后再把这个数据卷目录挂载到容器中数据库的数据目录即可。

docker volume create mysql-data

本文中我们使用docker volume create命令创建了一个名称为“mysql-data”的数据卷,然后在创建并启动容器时,再把这个数据卷挂载到容器中数据库的数据目录/var/lib/mysql。

docker run -d \--name=mysql-server \-e MYSQL_ROOT_PASSWORD="test123" \-p 3306:3306 \-v /mysql-data:/var/lib/mysql \hub.c.163.com/library/mysql:8.0.1

关键字:校园网络建设_网络技术就业方向_如何推广外贸型网站_安顺seo

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: