Docker For Test 系列五:数据持久化

1、踩坑-commit命令

先说下自己最开始的解决数据持久化的思路:通过commit命令

看下docker官网的 commit命令的详解

上面有写到基于容器的变化新建一个镜像,既然如此,那我在容器中对数据的修改应该会保存到新生成的镜像中,然后我再用新镜像new一个容器出来,数据更新部分不就保存到新容器中了?

于是我在5.6版本mysql的镜像上new了一个容器出来:

docker run -p 3306:3306 --name qh1 -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.6

查看容器 docker ps

使用navigator连接mysql容器

配置信息如下:

新建数据库test,并在test中新建表user

创建完数据,运行commit命令把容器生成镜像

docker commit qh1 qh-mysql1

查看镜像 docker images

从结果看镜像确实生成了,那来看看创建的数据是否有保存

马上使用新镜像new一个容器出来

连接qh-user容器

发现创建的库并没有保存下来

是时候求助官方文档了,查阅了docker commit的官方文档说明后,发现了在扩展说明中有这么一句话:

意思是commit操作并不会包含容器内挂载数据卷中的数据变化。难道是因为mysql容器的挂载数据卷引起的?

马上查看容器信息,是否有data mount相关信息:

Docker inspect qh1

结果如下:

这个信息的意思就是使用volume的方式mount,把载体机的Source目录挂载到容器的Destination目录,下面来看如何挂载数据即如何实现数据持久化

2、三种数据持久化方式

2.1、volume(重点介绍mysql实例)

2.1.1直接挂载

前提条件:qh1是一个mysql容器,基于mysql:5.6镜像生成,在qh1中手动添加了一个数据库test,在数据库中手动添加一个表user,表中有三个字段:

我们的目的是把qh1的volume挂载到新容器中的/var/lib/mysql目录下

首先我们要知道qh1的volume的路径

Docker inspect qh1查看容器

或者是docker inspect -f "{{.Mounts}}" qh1,切记区分大小写

找到qh1的volume路径为:/var/lib/docker/volumes/1de10c2b4efb8a3f8a64eb20ab44f916544ca782fa49956c7c87825aa064e179/_data

新建名称为qh2的mysql新容器,命令如下;

docker run -it -p 23306:3306 --name qh2 -v/var/lib/docker/volumes/1de10c2b4efb8a3f8a64eb20ab44f916544ca782fa49956c7c87825aa064e179/_data:/var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456 --privileged=true -d mysql:5.6

容器创建成功后查看日志,看是否存在异常

Docker logs qh2

出现以下异常信息:

是两个库使用相同的数据文件导致的,解决:

关掉qh1,重新启动qh2容器,再次查看qh2日志

启动正常,使用navigator连接qh2数据库

注意端口号是23306

Test库和user表已经在新容器中了。

2.1.2共享方式

先看下docker官网的说明

只需要指定共享源,命令如下:

docker run --name qh3 --volumes-from qh1 -d-p 33306:3306 mysql:5.6

使用navigator查看

Test库和user也出现在了新容器中

2.2、bind mount

2.3、tmpfs

本文分享自微信公众号 - 测试邦(testerbang)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券