九、Docker数据管理,数据卷与数据卷容器

作者: 温新

分类: 【Docker】

阅读: 2254

时间: 2020-08-11 14:25:43

随着Docker容器的销毁,容器中的数据都为被销毁,不保留。生产环境中,需要对数据持久化处理,或要在多个容器中进行数据共享,这就需要数据卷了。

容器中管理数据主要有两种方式,如下:

  • 数据卷(Data Volumes),容器内数据直接映射到本地主机环境
  • 数据卷容器(Data Volume Containers),使用特定容器维护数据卷

数据卷

数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。

数据卷特性如下:

  • 数据卷可以在容器之间共享和重用,容器间传递数据变得高效与方便
  • 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像,解耦开应应用和数据
  • 卷会一直存在,直到没有容器使用,可以安全地卸载它

1、使用 volume 命令创建数据卷

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 创建本地卷(主机)</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">volume</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">create</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">my_nginx</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 或</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">volume</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">create</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">d</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">local</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">test</span></span>
<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 查看创建的本地卷</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">ls</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">l</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">/</span><span style="box-sizing: border-box; color: rgb(198, 120, 221) !important;">var</span><span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">/</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">lib</span><span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">/</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span><span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">/</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">volumes</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">   </span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 查看所有卷</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">volume</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">ls</span></span>

2、绑定数据卷

除了使用volume子命令管理数据卷之外,还可以在创建容器时将主机本地任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。

在使用 docker [container] run命令时,可以使用-mount选项来使用数据卷。-mount选项支持三种类型的数据卷,如下:

  • volume 普通数据卷,映射到主机 /var/lib/docker/volumes路径下
  • bind 绑定数据卷,映射到主机指定路径下
  • tmpfs 临时数据卷,只存在于内存中

案例

步骤一:启动第一个centos容器,命名为centos01

9_1_v

<span style="color: rgb(255, 192, 0);"># 测试不成功,等待ing</span><br></br>

数据容器卷

1)创建数据卷容器

多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器。数据卷容器也是一个容器,不同的是,这个容器是专门用来为其它容器提供数据的容器。

这里使用centos8使用数据卷容器(当然了这个centos8是pull下来的镜像),启动容器时,在容器内创建一个数据卷。

步骤一:启动第一个centos容器,命名为centos01

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">run</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">it</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">v</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">/</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">testdata</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">--</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">name</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">centos01</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">centos</span>:<span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">8</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">   </span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">cd</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">/</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">testdata</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(232, 191, 106) !important;">touch</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">centos01</span>.<span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">txt</span></span>

步骤二:新窗口打开,重新启动一个centos容器,命名为centos2,用来挂载centos01中的目录

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 查看容器</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">ps</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">a</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box;"></span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;">#找到centos01对应的容器ID,并进行挂载</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">docker</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">run</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">it</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">--</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">name</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">centos02</span> <span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">--</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">volumes</span><span style="box-sizing: border-box; color: rgb(86, 182, 194) !important;">-</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">from</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">centos01</span>  <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">831691599</span><span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">b88</span></span>

这里会发现,centos02容器看到了centos01.txt

用数据卷容器来迁移数据

利用数据容器卷对数据其中的数据卷进行备份、恢复,实现数据的迁移。

练习

创建数据卷

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 创建数据卷</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">docker volume create test1</span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box;"></span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 数据卷所在目录</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(232, 191, 106) !important;">cd</span> /var/lib/docker/volumes</span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 查询数据卷</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(232, 191, 106) !important;">ls</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">a09cbd0a3bd271ca682a0d8e57f3ea7fcc14e6ce7b5351c68cc6b2f38d83e229  backingFsBlockDev  metadata.db  test1</span>

方式一:先创建数据卷后绑定

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 创建容器</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">docker run <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-d</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">--name</span> w1 <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-P</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-v</span> test1:/usr/share/nginx/html nginx</span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box;"></span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 查看数据卷</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">/var/lib/docker/volumes/test1/_data</span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(232, 191, 106) !important;">ls</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">50x.html  index.html</span>

html中的文件已经被同步到了宿主体机

方式二:不创建数据卷直接绑定

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 若没有创建test2数据卷,绑定时后自动创建</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">docker run <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-d</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">--name</span> w2 <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-P</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-v</span> test2:/usr/share/nginx/html nginx</span>

方式三:目录挂载

<span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;"><span style="box-sizing: border-box; color: rgb(98, 151, 85) !important;"># 若没有创建test2目录,绑定时后自动创建</span></span><br></br><span style="box-sizing: border-box; color: rgb(171, 178, 191); padding-right: 0.1px;">docker run <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-d</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">--name</span> w3 <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-P</span> <span style="box-sizing: border-box; color: rgb(209, 154, 102) !important;">-v</span> /www:/usr/share/nginx/html nginx</span>

注意:挂载目录时,容器中有些文件不会同步到宿主机

方式四:--mount挂载

<span style="color: rgb(255, 255, 255);">docker run -d --name w4 -P --mount src=test3,dst=/usr/share/nginx/html nginx</span><br></br>

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年08月11日

请登录后再评论