Dcoker 入门之存储卷
Docker 入门之存储卷一、Docker中的文件二、存在的问题和解决方案1)存在的问题2)解决方案三、什么是docker存储卷?1)概述2)卷(volume)的特点3)卷的类型(volume types)四、使用docker存储卷(volume)1)docker-managed volume2)bind mount volume3)复制使用其他容器的卷
[http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h2]Docker 入门之存储卷[/http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h2][http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3]一、Docker中的文件[/http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3]首先我们需要回顾一下之前的内容:
1、docker镜像由多个层叠加而成,启动容器时,docker会加载只读镜像层,并在镜像栈顶部添加一个读写层。
2、如果运行中的容器修改了现有的一个已经存在的文件,那该文件会从只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制。
docker中的文件[http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3]二、存在的问题和解决方案[/http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3][http://blog.51cto.com/xiaowangzai/h4]1)存在的问题[/http://blog.51cto.com/xiaowangzai/h4]通俗来讲:容器是分层的,最上面一层是可读写层,对所有数据的修改,都是保存在最上层的;在运行容器之后,所有的操作都不会影响到镜像本身,如果是编辑操作,那么docker只会从只读层将文件复制(非移动)到读写层给用户进行编辑。
1、当用户关闭和重启容器时,容器中的数据不受影响,但删除容器,则其数据会全部丢失。
2、数据存储在联合文件系统中,不易于宿主机访问。
3、容器间数据共享不便
4、容器写入和更改数据效率低,部分文件需要从底层复制,不适合IO较高的应用。
[http://blog.51cto.com/xiaowangzai/h4]2)解决方案[/http://blog.51cto.com/xiaowangzai/h4]“卷”是容器一个或多个“目录”,此次类目录可绕过联合文件系统,于宿主机上的目录“绑定(关联)”
目录绑定[http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3]三、什么是docker存储卷?[/http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3][http://blog.51cto.com/xiaowangzai/h4]1)概述[/http://blog.51cto.com/xiaowangzai/h4]将宿主机的目录直接于容器中的目录进行绑定,容器向目录写入数据时,可以直接写入宿主机的目录中。这样容器内的数据保存时就能绕过容器内部文件系统的限制,与宿主机的文件系统建立关联关系,实现数据共享,容器被停止或者删除时,数据不会丢失。
[http://blog.51cto.com/xiaowangzai/h4]2)卷(volume)的特点[/http://blog.51cto.com/xiaowangzai/h4]1、volume于容器初始化之时即会创建,由base image提供的卷中的数据会在此期间完成复制。(例:将宿主机上/data/docker/b1 和 容器b1中的/etc/绑定,那么会将容器中/etc/的内容复制到宿主机/dta/docker/b1/目录中)
2、volume的初衷是独立于容器的生命周期实现数据持久化,因此删除容器之时即不会删除卷,也不会对哪怕未被引用的卷做垃圾回收操作。
3、volume为docker提供了独立于容器的数据管理机制
(可以把”镜像“想象为静态文件,例如”程序“,把”卷“类比为动态内容,例如”数据“;于是,镜像可以被重用,而卷可以被共享;卷实现了”程序(镜像)“和”数据(卷)“的分离,用户制作镜像时无需再考虑镜像运行的容器所在的环境)
docker 有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同
3.1 bind mount volume(绑定挂载卷)
a volume thttp://blog.51cto.com/xiaowangzai/hat points to a user-specified location on thttp://blog.51cto.com/xiaowangzai/he http://blog.51cto.com/xiaowangzai/host file system
3.2 docker-manged volume(docker 管理卷)
thttp://blog.51cto.com/xiaowangzai/he docker daemon creates managed volumes in a portion of thttp://blog.51cto.com/xiaowangzai/he http://blog.51cto.com/xiaowangzai/host's file system thttp://blog.51cto.com/xiaowangzai/hat's system thttp://blog.51cto.com/xiaowangzai/hat's owned by docker
两种类型的卷[http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3]四、使用docker存储卷(volume)[/http://blog.51cto.com/xiaowangzai/http://blog.51cto.com/xiaowangzai/h3]bind mount volume:指定绑定的路径
docker-managed volume:宿主机的路径由docker daemon定义
无论是哪种类型的卷,都使用docker run的-v参数。
[http://blog.51cto.com/xiaowangzai/h4]1)docker-managed volume[/http://blog.51cto.com/xiaowangzai/h4]1.1 创建容器b1,指定b1的/data/目录使用存储卷
[root@localhttp://blog.51cto.com/xiaowangzai/host ~]# docker run --name b1 -it -v /data busybox / # cd /data/ /data #&n 5ac bsp;ls /data #
1.2 查看关联的宿主机目录
[root@localhttp://blog.51cto.com/xiaowangzai/host b1]# docker inspect -f {{.Mounts}} b1 [{volume 4e1f3596768357e009da8df6d38c4 1c84 339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local true }] [root@localhttp://blog.51cto.com/xiaowangzai/host b1]#
1.3 在宿主机目录中写入文件
[root@localhttp://blog.51cto.com/xiaowangzai/host b1]# cd /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data/ [root@localhttp://blog.51cto.com/xiaowangzai/host _data]# echttp://blog.51cto.com/xiaowangzai/ho 'welcome to arppinging.com' >> test.txt [root@localhttp://blog.51cto.com/xiaowangzai/host _data]# cat test.txt welcome to arppinging.com [root@localhttp://blog.51cto.com/xiaowangzai/host _data]#
1.4 在容器b1中查看是否有test.txt文件
/data # cat /data/test.txt welcome to arppinging.com /data #[http://blog.51cto.com/xiaowangzai/h4]2)bind mount volume[/http://blog.51cto.com/xiaowangzai/h4]
使用绑定挂载卷的时候,如果宿主机的目录不存在,那么会自动创建该目录。
1.1 创建容器b2,配置宿主机的/data/docker/b2/与容器b2的/data/关联
[root@localhttp://blog.51cto.com/xiaowangzai/host ~]# docker run --name b2 -it -v /data/docker/b2:/data busybox / # ls /data/ / #
1.2 查看b2的关联目录
[root@localhttp://blog.51cto.com/xiaowangzai/host _data]# docker inspect -f {{.Mounts}} b2 [{bind /data/docker/b2 /data true rp 5ac rivate}] [root@localhttp://blog.51cto.com/xiaowangzai/host _data]#
1.3 在b2的/data/中创建一个文件,
/ # cd /data/ /data # echttp://blog.51cto.com/xiaowangzai/ho 'welcome to b2.arppinging.com' > b2.http://blog.51cto.com/xiaowangzai/html /data #
1.4 在宿主机的/data/docker/b2中是否能看到b2创建的文件?
[root@localhttp://blog.51cto.com/xiaowangzai/host /]# cd /data/docker/b2/ [root@localhttp://blog.51cto.com/xiaowangzai/host b2]# ls b2.http://blog.51cto.com/xiaowangzai/html [root@localhttp://blog.51cto.com/xiaowangzai/host b2]# cat b2.http://blog.51cto.com/xiaowangzai/html welcome to b2.arppinging.com [root@localhttp://blog.51cto.com/xiaowangzai/host b2]#
1.5 删除容器b2,查看宿主机的目录文件是否还存在
[root@loca 16c9 lhttp://blog.51cto.com/xiaowangzai/host ~]# docker rm b2 b2 [root@localhttp://blog.51cto.com/xiaowangzai/host ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec2ff6aeb48a busybox "shttp://blog.51cto.com/xiaowangzai/h" 10 minutes ago Exited (0) 4 minutes ago b1 [root@localhttp://blog.51cto.com/xiaowangzai/host ~]# [root@localhttp://blog.51cto.com/xiaowangzai/host ~]# cd /data/docker/b2/ [root@localhttp://blog.51cto.com/xiaowangzai/host b2]# cat b2.http://blog.51cto.com/xiaowangzai/html welcome to b2.arppinging.com [root@localhttp://blog.51cto.com/xiaowangzai/host b2]#[http://blog.51cto.com/xiaowangzai/h4]3)复制使用其他容器的卷[/http://blog.51cto.com/xiaowangzai/h4]
复制和使用其他容器的卷,使用的是--volumes-from选项
创建一个容器b3,使用b1的存储卷
[root@localhttp://blog.51cto.com/xiaowangzai/host b2]# docker run --name b3 -it --volumes-from b1 busybox / # cat /data/test.txt welcome to arppinging.com / #
查看映射卷
[root@localhttp://blog.51cto.com/xiaowangzai/host b2]# docker inspect -f {{.Mounts}} b1 [{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local true }] [root@localhttp://blog.51cto.com/xiaowangzai/host b2]# docker inspect -f {{.Mounts}} b3 [{volume 4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177 /var/lib/docker/volumes/4e1f3596768357e009da8df6d38c4339df04b64dee2d80e262609f83b87d4177/_data /data local true }] [root@localhttp://blog.51cto.com/xiaowangzai/host b2]#
- 【Android入门 十三】数据存储
- MS SQL入门基础:管理存储过程
- 存储入门:存储区域网络SAN技术完全详解
- SQLite入门与分析(八)---存储模型(2)
- Activiti入门教程七(玩转存储引擎API)
- MySQL从入门到精通_1存储引擎
- 分布式 Key-Value 存储系统:Cassandra 入门
- SQL Server AlwaysON从入门到进阶(2)——存储
- 存储入门:图文阐释DAS、NAS、SAN
- Android入门之数据存储那么几种方式
- 示波器入门之采样率、存储深度
- 【cocos2d-x入门实战】微信飞机大战之十二:分数的本地存储
- 存储过程入门与提高
- 存储过程入门与提高
- 存储过程从入门到熟练
- Android入门笔记 - 数据存储 - SQLite,单元测试
- Oracle 存储过程创建和执行入门实例
- 存储过程入门
- MYSQL入门学习之二十七:MySQL存储引擎简介 之 InnoDB
- MS SQL入门基础:存储查询结果