您的位置:首页 > 运维架构 > Docker

docker容器的数据管理

2016-01-31 00:00 851 查看
docker容器的数据卷
什么是数据卷
是经过特殊设计的目录,可以绕过联合文件系统UFS,为一个或多个容器提供访问

数据卷设计的目的在于数据的永久化,他完全独立于容器的生命周期,docker不会在删除容器时删除挂载的数据卷
,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理

docker
container1
container2-----------------directory/file(data volume)
container3

数据卷特定
在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
可以在容器之间共享和重用
可以对数据卷中的内容直接xiugai9
数据卷变化不会影响容器的更新
卷会一直存在,即使挂载数据卷的容器被删除

为容器添加数据卷
root@yys-docker:~# docker run -it --name data1  -v ~/datavolume:/data ubuntu1204-base /bin/bash
root@8367a04dc76b:/# ls
bin  boot  data  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
root@8367a04dc76b:/# echo `date` >> /data/c1
退出容器
root@yys-docker:~# ls
centos66  centos66_jdk1.6  centos66_tomcat  datavolume  dockerfile  ubuntu1204
root@yys-docker:~# cat datavolume/c1
Sun Jan 31 11:23:28 UTC 2016

可以看到在宿主机上会有刚才设置的数据卷,并且其中存在刚才在容器中创建的文件

root@yys-docker:~# docker inspect data1
"Mounts": [
{
"Source": "/root/datavolume",
"Destination": "/data",
"Mode": "",
"RW": true
}

为数据卷设置权限
root@yys-docker:~# docker run -it --name data2  -v ~/datavolume:/data:ro ubuntu1204-base /bin/bash
root@95be0fc44ee6:/# echo `date` >> /data/c2
bash: /data/c2: Read-only file system
root@95be0fc44ee6:/# cat data/c1
Sun Jan 31 11:23:28 UTC 2016
可读的
root@yys-docker:~# docker inspect data2
"Mounts": [
{
"Source": "/root/datavolume",
"Destination": "/data",
"Mode": "ro",
"RW": false
}
]
root@yys-docker:~# ll datavolume/
total 1
-rw-r--r-- 1 root root   29 Jan 31 03:23 c1

使用数据卷
使用dockerfile构建数据卷镜像
VOLUME ["/data"]

root@yys-docker:~/dockerfile# docker build -t eddy/dvt .

root@yys-docker:~/dockerfile# docker build -t eddy/dvt .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM centos66-bash
---> 1e5e32e3c2d7
Step 2 : VOLUME /data1 /data2
---> Running in 7f3e85fde7c9
---> c6da55c31963
Removin
3ff0
g intermediate container 7f3e85fde7c9
Step 3 : CMD /bin/bash
---> Running in aa8be3be24b9
---> 3f5a094cdddb
Removing intermediate container aa8be3be24b9
Successfully built 3f5a094cdddb

创建容器
root@yys-docker:~/dockerfile# docker run --name data3 -it eddy/dvt
bash-4.1# ls -l
total 80
dr-xr-xr-x   2 root root  4096 Jan 22 00:17 bin
dr-xr-xr-x   2 root root  4096 Sep 23  2011 boot
drwxr-xr-x   2 root root  4096 Jan 31 06:46 data1
drwxr-xr-x   2 root root  4096 Jan 31 06:46 data2
drwxr-xr-x   5 root root   380 Jan 31 06:46 dev
drwxr-xr-x  44 root root  4096 Jan 31 06:46 etc
drwxr-xr-x   2 root root  4096 Sep 23  2011 home
dr-xr-xr-x   7 root root  4096 Jan 22 00:17 lib
dr-xr-xr-x   6 root root 12288 Jan 22 00:17 lib64
drwxr-xr-x   2 root root  4096 Sep 23  2011 media
drwxr-xr-x   2 root root  4096 Sep 23  2011 mnt
drwxr-xr-x   2 root root  4096 Sep 23  2011 opt
dr-xr-xr-x 116 root root     0 Jan 31 06:46 proc
dr-xr-x---   2 root root  4096 Sep 23  2011 root
dr-xr-xr-x   2 root root  4096 Jan 22 00:17 sbin
drwxr-xr-x   2 root root  4096 Sep 23  2011 selinux
drwxr-xr-x   2 root root  4096 Sep 23  2011 srv
dr-xr-xr-x  13 root root     0 Jan 31 06:26 sys
drwxrwxrwt   2 root root  4096 Sep 23  2011 tmp
drwxr-xr-x  13 root root  4096 Jan 22 00:15 usr
drwxr-xr-x  17 root root  4096 Jan 22 00:15 var

"Mounts": [
{
"Name": "acfeede86e38976f5a366e994d9a94719920eecd9425973db871327fdf262768",
"Source": "/var/lib/docker/volumes/acfeede86e38976f5a366e994d9a94719920eecd9425973db871327fdf262768/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "d84dec9b415d047c3bd866700f904c07ff85a770e389667708825c141504e033",
"Source": "/var/lib/docker/volumes/d84dec9b415d047c3bd866700f904c07ff85a770e389667708825c141504e033/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
}
],

root@yys-docker:~/dockerfile# docker run --name data4 -it eddy/dvt
"Mounts": [
{
"Name": "068f0e2a2d233d18c3c667c1b6cafd3ad8dcbd5cdf7f2c2e622ca48fe05f6407",
"Source": "/var/lib/docker/volumes/068f0e2a2d233d18c3c667c1b6cafd3ad8dcbd5cdf7f2c2e622ca48fe05f6407/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "67a2f99076033520686e0e0818ee061a228e345c4666313a48588b0e65a5569c",
"Source": "/var/lib/docker/volumes/67a2f99076033520686e0e0818ee061a228e345c4666313a48588b0e65a5569c/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
}
],

两个容器启动初始化之后这样就没办法共享因为不是一个数据卷

docker的数据卷容器
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器

挂载数据卷容器的方法
root@yys-docker:~/dockerfile# docker run -it --name data5 eddy/dvt
bash-4.1# ls
bin  boot  data1  data2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  sbin	selinux  srv  sys  tmp	usr  var
bash-4.1# echo `date` >> /data1/data5
bash-4.1# cat data1/data5
Sun Jan 31 06:53:54 EST 2016
bash-4.1# exit
exit

root@yys-docker:~/dockerfile# docker run -it --name data6 --volume-from data5 centos66-bash /bin/bash
flag provided but not defined: --volume-from
See 'docker run --help'.
root@yys-docker:~/dockerfile# docker run -it --name data6 --volumes-from data5 centos66-bash /bin/bash
bash-4.1# ls -l data1/
total 4
-rw-r--r-- 1 root root 29 Jan 31 06:53 data5
bash-4.1# cat data1/data5
Sun Jan 31 06:53:54 EST 2016

bash-4.1# echo `date` >> /data1/data5_1
bash-4.1# exit
exit
root@yys-docker:~/dockerfile# docker run -it --name data7 --volumes-from data5 centos66-bash /bin/bash
bash-4.1# ls data1/
data5  data5_1

bash-4.1# cat data1/data5_1
Sun Jan 31 06:56:42 EST 2016

这样使用数据卷容器就可以快速的共享数据
root@yys-docker:~/dockerfile# docker inspect  data6
"Mounts": [
{
"Name": "0098b24a714f6913d7a671571ed55f76b65078843607a8757745f741f85eea1c",
"Source": "/var/lib/docker/volumes/0098b24a714f6913d7a671571ed55f76b65078843607a8757745f741f85eea1c/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "bccc194adc775d09fd3269c709021b13f4a163496d075d59cbfa50721de06f36",
"Source": "/var/lib/docker/volumes/bccc194adc775d09fd3269c709021b13f4a163496d075d59cbfa50721de06f36/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
}
],
root@yys-docker:~/dockerfile# docker inspect  data7
"Mounts": [
{
"Name": "bccc194adc775d09fd3269c709021b13f4a163496d075d59cbfa50721de06f36",
"Source": "/var/lib/docker/volumes/bccc194adc775d09fd3269c709021b13f4a163496d075d59cbfa50721de06f36/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "0098b24a714f6913d7a671571ed55f76b65078843607a8757745f741f85eea1c",
"Source": "/var/lib/docker/volumes/0098b24a714f6913d7a671571ed55f76b65078843607a8757745f741f85eea1c/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
}
]

完全一致的数据卷

删除数据卷容器
root@yys-docker:~/dockerfile# docker rm data5
root@yys-docker:~/dockerfile# docker restart data6
root@yys-docker:~/dockerfile# docker attach data6
bash-4.1# ls /data1/
data5  data5_1
可以看到数据卷依然存在

创建一个新的数据卷容器
root@yys-docker:~/dockerfile# docker run -it --name data8 eddy/dvt
root@yys-docker:~/dockerfile# docker run -it --name data9 --volumes-from data8 centos66-bash /bin/bash
bash-4.1# ls
bin  boot  data1  data2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  sbin	selinux  srv  sys  tmp	usr  var
bash-4.1# ls data1/
bash-4.1# echo `date` >> /data1/data9_1
bash-4.1# exit
exit
root@yys-docker:~/dockerfile# docker rm -v data8
data8
root@yys-docker:~/dockerfile# docker restart data9
data9
root@yys-docker:~/dockerfile# docker attach data9

bash-4.1# ls /data1/
data9_1
bash-4.1# echo `date` >> /data1/data9_2
说明即使删除了数据卷容器并且删除数据卷,只要有容器还在使用数据卷,那么数据卷就会一直存在

docker数据卷的备份和还原

数据卷的备份和还原

数据备份
root@yys-docker:~# docker run --volumes-from data9  -v ~/backup:/backup --name data10 ubuntu1204-base tar cvf  /backup/data9.tar /data1
tar: Removing leading `/' from member names
/data1/
/data1/data9_1
/data1/backup/
/data1/data9_2
root@yys-docker:~# ll backup/
total 20
drwxr-xr-x 2 root root  4096 Jan 31 04:19 ./
drwx------ 9 root root  4096 Jan 31 04:15 ../
-rw-r--r-- 1 root root 10240 Jan 31 04:19 data9.tar
root@yys-docker:~# docker run --volumes-from data9  -v ~/backup:/backup --name data11 ubuntu1204-base tar cvf  /backup/data8.tar /data1
tar: Removing leading `/' from member names
/data1/
/data1/data9_1
/data1/backup/
/data1/data9_2
root@yys-docker:~#
root@yys-docker:~# ll backup/
total 32
drwxr-xr-x 2 root root  4096 Jan 31 04:19 ./
drwx------ 9 root root  4096 Jan 31 04:15 ../
-rw-r--r-- 1 root root 10240 Jan 31 04:19 data8.tar
-rw-r--r-- 1 root root 10240 Jan 31 04:19 data9.tar
root@yys-docker:~#

docker run --volumes-from data9  -v ~/backup:/backup --name data11 ubuntu1204-base tar cvf  /backup/data8.tar /data1
说明
-v ~/backup:/backup
宿主机目录 容器目录
含义就是新建一个数据卷容器既去本地目录挂载数据卷,又挂载需要备份的数据卷,然后执行命令把备份的数据卷拷贝到自己挂载的数据卷中从而实现数据卷的备份

还原
root@yys-docker:~# docker attach data9

bash-4.1# ls
bin  boot  data1  data2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  sbin	selinux  srv  sys  tmp	usr  var
bash-4.1# ls data1/
backup	data9_1  data9_2
bash-4.1# rm data
data1/ data2/
bash-4.1# rm data1/* -rf
bash-4.1# ls data1/
bash-4.1# exit
exit

root@yys-docker:~# docker run --volumes-from data9  -v ~/backup:/backup --name data12 ubuntu1204-base tar xvf  /backup/data9.tar
data1/
data1/data9_1
data1/backup/
data1/data9_2
root@yys-docker:~# docker restart data9
data9
root@yys-docker:~# docker attach data9

bash-4.1# ls /data1/
backup	data9_1  data9_2

还原完成


7fe0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: