Docker容器管理数据有两种方式
数据卷:容器内的数据直接映射到本地主机环境
数据卷容器:使用特定容器维护数据卷
数据卷:
数据卷是一个可供容器使用的特殊目录。它将主机操作系统目录直接映射进容器,类似Linux中的mount操作
数据卷的特性:
数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便
对数据卷内数据的修改会立马生效,无论是容器操作还是本地操作
对数据卷的更新不会影响镜像,解耦了应用和数据
卷会一直存在,知道没有容器使用,可以安全的卸载它
容器内创建数据卷
使用 -v标记可以在容器内创建一个数据卷,多次重复使用-v标记可以创建多个数据卷
例如:
# docker run -itd --name web -v /webapp ubuntu e8baf9e93c2f80e22ec89be503f4de2a56b870cead2c74566aced5f3492add13 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e8baf9e93c2f ubuntu "/bin/bash" 3 seconds ago Up 2 seconds web
创建并启动一个容器,名为web,给容器创建了一个数据卷/webapp
# docker exec -it web /bin/bash root@e8baf9e93c2f:/# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr webapp
连接到容器内,可以看到/webapp目录已经创建了
挂载一个主机目录作为数据卷
# docker run -itd --name web02 -v /srv:/opt/srv ubuntu
连接到web02容器,查看/opt/srv目录下是否跟本地数据一样
# docker exec -it web02 /bin/bash # ls /opt/srv/ apache-tomcat guacamole-client-0.9.14.tar.gz jdk zabbix cdh guacamole-server-0.9.14.tar.gz tools
在容器内创建test目录
# mkdir test # ls apache-tomcat guacamole-client-0.9.14.tar.gz jdk tools cdh guacamole-server-0.9.14.tar.gz test zabbix
退出容器,可以看到/srv目录下多了test目录
# ls /srv/ apache-tomcat cdh guacamole-client-0.9.14.tar.gz guacamole-server-0.9.14.tar.gz jdk test tools zabbix
注意:将本地目录挂载到容器内时,本地路径必须是绝对路径。如果本地目录不存在,会自动创建,docker挂载数据卷的默认权限是读写,用户也可以通过ro设置为只读
例如:
# docker run -itd --name web02 -v /srv:/opt/srv:ro ubuntu
数据卷容器
如果用户希望多个容器之间共享一些持续更新数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,它是专门用来提供数据卷供其他容器挂载的。
首先创建一个数据卷容器
$ docker run -it -v /dbdata --name dbdata ubuntu
查看/dbdata目录
root@768040a3ea7f:/# ls bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷
$ docker run -it --volumes-from dbdata --name db1 ubuntu $ root@012c3b277461:/# ls bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
可以看到db1这个容器有/dbdata目录
同样的方法,创建db2容器
$ docker run -it --volumes-from dbdata --name db2 ubuntu
在db1容器的/dbdata目录下创建test目录
root@012c3b277461:/# cd dbdata/ root@012c3b277461:/dbdata# ls root@012c3b277461:/dbdata# mkdir test root@012c3b277461:/dbdata# ls test
在db2容器中可以看到/dbdata目录下也有test目录
root@f3aab4e96507:/# cd /dbdata/ root@f3aab4e96507:/dbdata# ls test
注意:可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷,如
docker run -d --name db3 --volumes-from db1 ubuntu
使用--volumes-from参数所挂载的数据卷的容器自身并不需要保持运行状态
删除了挂载的容器,数据卷并不会被自动删除。
利用数据卷容器来迁移数据
备份
利用数据卷容器可以对其中数据卷进行备份、恢复,以实现数据的迁移。
docker run --volumes-from dbdata -v $(pwd):/backup \ --name worker ubuntu tar zcf /backup/backup.tar /dbdata
解析:使用Ubuntu镜像创建一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷,即/dbdata数据卷。
使用-v $(pwd):/backup将本机的当前目录挂载到worker容器的/backup目录。
worker容器启动后,执行tar命令,将worker容器下挂载的/dbdata目录中的数据压缩备份到/backup目录下,名为backup.tar文件,而worker容器将/backup目录挂载到宿主机的当前目录了,所以backup.tar文件
也在本机的当前目录下, 宿主机下执行ls命令,可以看到backup.tar文件
# ls backup.tar
恢复
如果要将数据恢复到一个容器,执行下面的命令
# docker run -itd -v /data --name data1 centos:6 749852a07dedec5acb9249b3af8d0fd78783379922b048581e9734fd3c13335f
创建一个带有空数据卷的容器data1
# docker run --volumes-from data1 -v $(pwd):/backup centos:6 \ tar xvf /backup/backup.tar -C /data mynginx/ mynginx/zabbix-agent-3.0.8-2.el7.x86_64.rpm mynginx/Dockerfile
再次创建一个容器,挂载data1的数据卷,然后将本地的当前目录的挂载到容器的/backup目录下,执行untar解压缩命令,将本地的当前目录下的backup.tar文件解压缩到容器的/data目录下,
这样就恢复了数据卷容器中的数据
注意:很多文档里面没有将数据解压缩时,指定解压缩到/data目录,这样恢复的数据不在/data目录下。
可以创建并启动一个新的容器,挂载到data1数据卷,查看/data目录下是否有恢复过去的数据
# docker exec -it wizardly_shockley /bin/bash # ls bin dev home lib64 media opt root selinux sys usr data etc lib lost+found mnt proc sbin srv tmp var # ll /data total 0 drwxr-xr-x 2 root root 65 Jun 13 03:13 mynginx