利用数据卷可以查看容器内应用产生的数据,或者把容器内的数据进行备份,或者多个容器之间共享数据。数据卷有以下特点:
- 数据卷可以在容器之间共享和重用;
- 数据卷修改会立马生效;
- 对数据卷的更新,不会影响镜像;
- 数据卷会一直存在,知道没有容器使用
1、挂在一个主机目录做数据卷
docker run -v /home/lzj/my_docker:/home/lzj -it ubuntu /bin/bash
把宿主机上的/home/lzj/my_docker目录挂载到容器的/home/lzj目录上,目录不存在的话,直接创建。宿主机上的/home/lzj/my_docker目录下的数据就可以和容器中/home/lzj目录下的数据进行共享了。
2、数据卷容器
如果用户要在容器之间共享数据,最简单的方式就是使用数据卷容器。数据卷容器就是一个普通的容器,专门用它提供数据卷供其他容器挂载使用。使用方法如下:
第一步,首先创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/lzj_data目录
docker run -it -v /lzj_data --name dbdata ubuntu /bin/bash
进入dbdata容器,可以看到多了个/lzj_data目录
第二步,分别创建两个容器db1和db2,并使用–volumes-from来挂载dbdata容器中的数据卷,命令如下:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
分别进入db1和db2容器,可以看到/lzj_data目录
dbdata 和db1、db2容器中其中一个容器修改/lzj_data目录下数据,三个容器中的/lzj_data目录是同步的。例如在db1容器中/lzj_data目录下创建一个hello.txt文件,则同时能在dbdata和db2容器下的/lzj_data目录下看到hello.txt文件。
可以多次使用–volumes-from从多个容器挂载多个数据卷;还可以从已经挂载了容器卷的容器来挂载数据卷,例如db2就可以从db1挂载数据卷。
注意:如果关闭了挂载数据卷的容器,数据卷并不会自动删除,例如关闭了dabada、db1和db2容器,下次再启动三者容器时,依然能看到挂载的数据卷以及其中的内容。如果要删除数据卷,必须在删除最后一个还挂载它的容器时显示使用docker rm -v命令指定同时删除关联的容器。
3、利用数据卷容器迁移数据
备份
docker run --volumes-from dbdata -v $(pwd):/backup --name mydocker ubuntu tar cvf /backup/backup.tar /lzj_data
解析:首先利用ubuntu镜像创建了一个mydocker容器,用–volumes-from来让mydocker容器挂载了dbdata容器的数据卷(即/lzj_data目录),使用-v $(pwd):/backup挂载本地当前目录到mydocker容器的/backup目录。
mydocker容器启动后,运行tar cvf /backup/backup.tar /lzj_data命令,将/lzj_data目录下的数据备份到了/backup/backup.tar压缩文件,而mydocker又挂载了宿主机当前目录,因此在宿主机当前目录会看到一个backup.tar文件。
恢复
如果想恢复已经备份好的数据到正在运行的容器中,可以继续利用数据卷容器。
首先创建一个运行的容器dbdata,把备份好的数据恢复到该容器中:
docker run -it -v /mydata --name dbdata ubuntu /bin/bash
先在创建一个数据卷容器,用于恢复数据
docker run --volumes-from dbdata -v $(pwd):/backup --name db ubuntu tar -xvf /backup/hello.zip -C /mydata
解析:启动了一个db容器,并挂载了dbdata容器,db容器共享了dbdata的数据卷,然后db又把宿主机本地目录挂载到了db容器中/backup中,宿主机本地有备份的hello.zip压缩文件,所以在db容器中/backup目录页共享了该压缩文件,在启动db容器时执行了tar -xvf /backup/hello.zip -C /mydata
,把压缩文件解压到了db容器的/mydata目录,因此在dbdata容器中的/mydata容器也看到了解压的文件。