在生环境中使用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