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
相关文章推荐
- docker(一):安装
- docker学习(5) 在mac中创建mysql docker容器
- docker-compose
- Docker RestApi 的配置及使用
- 孵化 Docker 的 PaaS 平台 DotCloud 即将关闭
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
- dockerfile的一些经验吧
- docker: 解决centos7下cgroup.procs: no such device的错误
- S-Docker_02_基本概念_02_容器
- S-Docker_02_基本概念_01_镜像
- docker容器秒死的解决办法
- Docker学习笔记(4) — 开启Docker远程访问
- Docker学习笔记(3) — docker仓库的镜像怎么删除
- docker下gitlab运行
- docker 源码分析 六(基于1.8.2版本),Docker run启动过程
- 在容器中使用quagga
- Docker镜像和容器系列(二)- 操作详解
- Docker命令详解系列(一)- Docker最常用命令速记
- docker registry私服搭建
- windows10/2016上使用docker