先说下自己最开始的解决数据持久化的思路:通过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目录,下面来看如何挂载数据即如何实现数据持久化
前提条件: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表已经在新容器中了。
先看下docker官网的说明
只需要指定共享源,命令如下:
docker run --name qh3 --volumes-from qh1 -d-p 33306:3306 mysql:5.6
使用navigator查看
Test库和user也出现在了新容器中