在生环境中使用docker,需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这涉及到容器的数据管理操作。

容器的数据管理主要有两种方法:

1 数据卷:容器内数据直接映射到本地主机上

2 数据卷容器:使用特定容器维护数据卷

数据卷

数据软是一个可供容器使用的特殊目录,他将宿主机操作系统目录直接映射进容器。类似linxu中的mount行为

[root@server01 ~]# docker volume --help

Usage:	docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

 1 创建数据卷

[root@server01 ~]# docker volume create -d local test
test

 2 查看数据卷详情

[root@server01 ~]# docker volume inspect test
[
    {
        "CreatedAt": "2020-03-13T22:35:21+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test/_data",
        "Name": "test",
        "Options": {},
        "Scope": "local"
    }
]

 3 列出所有数据卷

[root@server01 ~]# docker volume ls
DRIVER              VOLUME NAME
local               0aad8f64123edb357188008b7c56201b8eba09fb3172ca6b754d234d355374df
local               ef53e3d6d512aab869898bd05a7635b7134734edb408d218ff2fd675e275872a
local               test

 4 清除无用的数据卷

[root@server01 ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
465d5b71f3cbc113e0abaa04bd004f16b5adacc1756e1f1fb21800e00fedd8d4

 5 删除指定数据卷

[root@server01 ~]# docker volume rm test
test

 6 绑定数据卷

除了使用docker volume 管理数据卷

还可以’在创建容器时将主机本地的任意路径挂载容器内作为数据卷。这种形式创建的数据卷被称为绑定数据卷

[root@server01 ~]# docker run -it  -v /usr/local/src:/huazai aa:v8  /bin/bash
[root@601081c78d83 tmp]# ls /huazai/
ELK.zip              nginx-1.14.2/        redis-5.0.2/         workshop/
lnmp/                nginx-1.14.2.tar.gz  redis-5.0.2.tar.gz   

 

数据卷容器:

数据卷容器也是一个容器。它的作用是专门提供数据卷给其他容器挂载

注意:使用--volumes-from 参数 所挂载数据卷的容器自身不需要保持在运行状态!

使用场景:

用户需要在多个容器之间共享一些持续更新的数据。

1 创建一个数据卷容器 dbdata, 并在其中创建一个数据卷挂载到 /dbdata:

[root@server01 ~]# docker run -it -v /dbdata --name dbdata centos:7 /bin/bash
[root@709feb000817 /]# ls /
anaconda-post.log  dbdata  etc   lib    media  opt   root  sbin  sys  usr
bin                dev     home  lib64  mnt    proc  run   srv   tmp  var
[root@709feb000817 /]# ls /dbdata/
[root@709feb000817 /]# 

 2 创建两个容器db01,db02.使用--volumes-from 来挂载dbdata容器中的数据卷。

通过挂载数据卷容器来达到容器间数据共享

[root@server01 ~]# docker run -it --volumes-from dbdata --name db01 centos:7 /bin/bash

[root@daca5083285f /]# cd /dbdata/
[root@daca5083285f dbdata]# mkdir db01

 

[root@server01 ~]# docker run -it --volumes-from dbdata --name db02 centos:7 /bin/bash

[root@8220b2248062 /]# cd /dbdata/
[root@8220b2248062 dbdata]# ls
db01

利用数据卷容器来迁移数据:

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

1 备份

使用下面的命令来备份dbdata数据卷容器内的数据卷

命令分解:

1.1:利用centos:7 镜像创建了一个容器,命名为:worker

1.2:使用--volumes-from dbdata 参数来让 worker容器挂载dbdata容器的数据卷

1.3:使用-v $(pwd):/backup 参数来挂载本地的当前目录到worker容器的/backup目录     1.3《==》是为1.4 tar命令备份文件做准备呢

1.4:worker容器启动后,使用tar 命令 将/dbdata下的内容备份为/backup/backup.tar .即为宿主机当前目录下的backup.tar

[root@server01 ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos:7 tar cvf /backup/backup.tar /dbdata
/dbdata/
/dbdata/db01/
tar: Removing leading `/' from member names

 当前路径下产生了backup.tar文件

[root@server01 ~]# ll
总用量 341588

-rw-r--r--. 1 root root     10240 3月  13 23:51 backup.tar
-rw-------. 1 root root   1347072 3月   6 00:35 busybox_20200206.tar

 2 恢复

恢复数据到一个容器,可以按照下面的操作:

2.1 创建一个带有数据卷的容器:dbdata2

[root@server01 ~]# docker run -v /dbdata --name dbdata2 centos:7 /bin/bash
[root@server01 ~]# 

 2.2 然后使用centos7镜像创建一个新的容器db03,挂载dbdata2的容器,并使用xvf参数 解压备份文件到所挂载的容器卷

[root@server01 ~]# docker run --volumes-from dbdata2 --name db03 -v $(pwd):/backup centos:7 tar xvf /backup/backup.tar
dbdata/
dbdata/db01/

 2.3 创建db04,并挂载数据卷容器dbdata2 就可以看到之前的数据(db01)了!

[root@server01 ~]# docker run -it --volumes-from dbdata2 --name db04 centos:7 /bin/bash
[root@8f3b0dad97a5 /]# ls /dbdata/
db01