博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker基础-22-volume-数据持久化之data volume
阅读量:4302 次
发布时间:2019-05-27

本文共 2480 字,大约阅读时间需要 8 分钟。

前面基本上把docker网络学习了一遍,docker中多机网络overlay网络,这里由于暂时不学习,在docker基础中。前面文章,我们学习了image, container, network, 接下来,我们要学习docker的持久化存储和数据共享的相关知识。

 

 

上面这个图在前面容器和镜像区别我们学习过,这里我们重点看container layer,这是我们接下来好几篇文章需要学习的内容。在docker中,默认是数据存储在container layer,也就是容器层中。因为只有这一层是可写的,其他层是镜像文件层,是只读的。那么问题就来了,既然数据都默认存储在容器层,如果容器关闭,并且被删除了,也就意味着数据也删除了,找不回来了。这种问题很严重,docker为了解决这种问题,出现一种机制。就是把数据转移到外挂或者mount的磁盘上。例如把容器里数据,同步到外层linux主机磁盘上。这样即使容器被删除了,容器里面数据还是保留在linux主机上,下次我们再启动一个容器,配置读取外层linux这个外挂的文件系统中数据,这个容器恢复正常服务功能。

 

Docker对数据持久化的方案

解决方案有两大类,基于本地文件系统的Volume,也就是外层linux主机上磁盘存储数据;第二种是通过插件的Volume,例如通过第三方插件,可以把容器里面数据通过网络,同步到AWS云存储中。我们接下来学习主要是第一种方案,基于本地文件系统的Volume.

 

Volume的类型

第一种是受管理的data Volume, 由docker后台自动创建。

第二种是绑定挂载的Volume,具体挂载位置可以由用户指定。

 

数据持久化之Data Volume

其实Volume这个关键字,我们在学习Dockerfile语法的时候跳过。同样前面几篇学习网络,我们还没有提EXPOSE这个命令,这里补充一下,EXPOSE是把容器里面端口和外层linux端口进行绑定的作用,具体练习,我打算后面用jenkins镜像来练习。本篇,我们通过mysql的镜像来学习VOLUME这个语法和volume对象。

先去,hub.docker官网看看mysql的latest的dockerfile内容。打开网站,例如,我们来看mysql 5.6版本的dockerfile内容。

上面红圈里的 VOLUME 告诉了我们在容器里存储mysql全部的数据(数据库,日志文件等)存储在/var/lib/mysql路径下,docker通过volume对象,也就是容器里有一个volume对象,容器外的linux机器也有与之对应的一个volume对象,两个配对的volume对象的机制确定了docker数据持久化实现。而且外层volume对象一旦创建,不会随着容器的消失而消失。

 

下面我们本地下载一个mysql的最新镜像,然后启动一个mysql的容器,看看这个容器里和容器外的volume对象。

先执行命令: docker pull mysql,拉一个默认latest的镜像到本地。然后使用下面命令去启动一个mysql容器

命令:docker run -d --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 mysql

这样,我们启动了一个mysql容器实例,root密码是123456,下面学习docker关于查询volume对象的命令。

目前,我只启动了一个mysql容器,其他容器也没有启动,这个红圈的就是mysql容器对应的volume对象,这个对象是不会随着mysql1这个容器删除而消失。下面我们使用-f强制停止并删除mysql1这个容器,然后看看这个volume对象是否被删除。

如果启动容器不指定-v参数,那么默认产生的volume对象就是这么一大串。

现在我把这个volume对象删除,然后启动容器的时候指定一个具体有意义的volume名称。

下面学习启动容器指定volume对象的命名,具体可以学习官网文章https://hub.docker.com/_/mysql 

docker run -d --name mysql1 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql

这里提醒(不要copy我的)一下中文输入法的-,有时候没有注意,老是发现名字执行不对,说请参考docker run –help,问题就是出现使用中文输入法输入短横线一杠,改成英文输入就好。

使用volume inspect 可以查看volume挂载的信息,上面红圈显示,挂载在linux机器上的/var/lib/docker/volumes/mysql下。当然默认是这个路径,你可以使用-v参数指定其他路径,例如-v /tmp/mysql:/var/lib/mysql这样也是可以的。

下面来演示一下,容器由于某些原因被删除,数据库持久化在本地的场景,这样数据库数据没有丢,再次启动新的mysql容器,就能访问数据库 这样一个简单的例子。

先进入mysql1容器,使用sql语句,创建一个docker的数据库

密码是123456,连接上了数据库。

当前有4个数据库,我们新增一个叫docker的数据库。

删除上面运行的mysql容器,并查看mysql这个volume对象。

启动mysql2容器,-v参数指定到原来的存在的volume对象mysql

然后进入容器mysql2,查看docker这个数据库是否还在。

 到这里,关于docker数据持久化机制一data volume方式就学习到这里。通过mysql这个例子,我们至少大概如何把一个容器的数据绑定到本地机器的磁盘里。本文章,学习了docker中volume对象,以及volume inspect介绍查询,还有如何在启动容器过程绑定一个volume对象。如果这个-v 后面是跟着一个路径,那么就是更改默认的volume挂载路径,本文没有演示这个,可以自己去试一下。

转载地址:http://ikows.baihongyu.com/

你可能感兴趣的文章
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
iOS学习之 plist文件的读写
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>
C指针声明解读之左右法则
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>
iOS 如何放大按钮点击热区
查看>>
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>