Docker入门(4)-数据管理
- Docker系列参考自书籍<Docker技术入门与实战>,本博客以笔记为主. 如果转载请注明出处,谢谢各位大哥了. -博客园:玲珑骰子安红豆
- 前文提要
- 用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据惊醒备份,甚至多个容器之间进行共享,这必然涉及到容器的数据管理操作.
- 容器中管理数据有两种主要方式:
- 数据卷;
- 数据卷容器
- 数据卷
- 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
- 数据卷可以在容器之见共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在,直到没有容器使用
- 数据卷的使用,类似于Linux下对目录或者文件进行mount操作.
- 在容器内创建一个数据卷
- 在用docker run 命令的时候,使用-v标记可以在容器内创建一个数据卷.多次使用-v标记可以创建多个数据卷.
- 下面将使用centos镜像创建一个容器,并创建一个数据卷挂在到容器的/webapp目录
- docker run -t -i -P -v /webapp --privileged=true --name web centos:latest bash
- ps:--privileged=true命令是为了给docker容器提权,让其能访问宿主机文件 -P是允许外部访问容器需要暴露的端口
- 挂载一个主机目录作为数据卷(最常用)
- 使用-v标记可以指定挂在一个本地的有目录到容器中作为数据卷:
- [root@izt4n97garwn1ni986vmhjz wordpress]# docker run -ti --name web1 --privileged=true -v /home/wordpress/:/home/:ro centos:latest bash
- [root@9f599a8ed882 /]# cd /home/
- [root@9f599a8ed882 home]# ll
- total 8444
- drwxr-xr-x 5 nobody 65534 4096 Aug 17 08:02 wordpress
- -rw-r--r-- 1 root root 8641990 Aug 4 07:54 wordpress-4.8.1-zh_CN.tar.gz
- 上面的命令是加载/home/wordpress目录到容器的/home目录下.
- 注意:1.本地路径必须是绝对路径
- 2.如果本地路径不存在,docker会自动创建
- 3.Docker挂载数据卷的默认权限是读写(rw),用户可以指定,ro为只读
- 例子:docker run -ti --name web1 --privileged=true -v /home/wordpress/:/home/:ro centos:latest bash
- 挂在一个本地主机文件作为数据卷
- -v标记也可以挂载单个文件到容器中作为数据卷.其命令与挂载目录大同小异.
- [root@izt4n97garwn1ni986vmhjz wordpress]# docker run -ti --name web2 --privileged=true -v /home/wordpress/wordpress-4.8.1-zh_CN.tar.gz:/home/wordpress-4.8.1-zh_CN.tar.gz centos:latest bash
- [root@2b928dba921d /]# cd /home/
- [root@2b928dba921d home]# ll
- total 8440
- -rw-r--r-- 1 root root 8641990 Aug 4 07:54 wordpress-4.8.1-zh_CN.tar.gz
- 挂载文件会有一些问题,比如修改文件的话,会改变文件的inode,会引发异常.所以一般是挂在文件所在目录到docker容器中
- 数据卷容器
- 如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器.
- 数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载,使用方法如下:
- 容器创建:
- 首先,创建一个数据卷容器data,并在其中创建一个数据卷挂载到/data:
- [root@Ninemax-LPC3 data]# docker run -ti -v /data/:/data --name data centos:7.3 bash
- 然后再其他容器使用--volumes-from 来挂载data容器中的数据卷,例如创建db1和db2都挂载同一个数据卷到相同的/data目录,
- [root@Ninemax-LPC3 data]# docker run -ti --volumes-from data --name db1 centos:7.3 bash
- [root@Ninemax-LPC3 data]# docker run -ti --volumes-from data --name db2 centos:7.3 bash
- 三个容器任何一方在改目录下写入,其他容器都可以看到.
- 也可以多次使用 --volumes-from参数来从多个容器挂载多个数据卷,还可以从其他已经挂在了数据卷的容器来挂载数据卷.
- 从其他容器挂载数据卷:
- [root@Ninemax-LPC3 data]# docker run -ti --volumes-from db1 --name db3 centos:7.3 bash
- 注意:使用--volumes-from参数挂载目标容器,目标容器不需要保持在运行状态.
- 容器删除:
- 如果删除了挂载的容器(包括data db1 db2),数据卷并不会被自动删除,如果要删除数据卷,必须在删除最后一个还挂载着它的容器的时候,添加-v命令(docker rm -v data),来删除.
- 用数据卷容器迁移数据
- 可以利用数据卷容器对其中的数据进行备份,恢复以及实现数据的迁移,也可以在容器之间自由地升级和移动数据卷.
- 备份
- 使用下面的命令备份数据卷:
- docker run --volumes-from data -v ${pwd}:/backup --name back centos tar cvf /backup/back.tar /data
- 命令解释:(顺序)
- 利用镜像创建了一个名为back的容器
- 同时将当前目录挂载到back容器的/backup下
- 在容器启动后,将/data目录进行压缩,压缩文件(back.tar)保存在back容器的/backup目录下
- 因为back容器的/backup关联的是宿主机的当前目录,所以返回到宿主机就会看见备份文件啦!
- 恢复
- 如果要恢复数据到一个容器,可以按照下面的操作.
- 首先创建一个带有数据卷的容器:db2
- docker run -v /data --name db2 centos:7.3 bash
- 然后创建另一个新的容器,挂载db2的容器,并且使用untar解压备份文件到所挂载的容器卷中即可
- docker run --volumes-from db2 -v ${pwd}:/backup centos tar xvf /backup/back.tar (此命令操作的文件与备份相关)
- 其实也不需要创建两个容器,也可以合并成一个容器去操作! 但是为了保证数据卷容器与宿主机分离,所以建议像上面一样操作
如果转载请注明出处. -博客园:玲珑骰子安红豆:http://www.cnblogs.com/erbiaoge/