九、Docker数据管理,数据卷与数据卷容器
随着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
<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日