docker 持久化

场景:在处理mysql数据库时重启发现数据不见了。

 原因:提交操作不包含 包含在容器内的卷中包含的任何数据,也就是说只有初始化的配置操作以及一开始的建库操作会被commit掉,其他的不会记录。

当然在容器中操作,去“提交”到一个新的容器时,同样也会被容器默认的保存下来。

The commit operation will not include any data contained in volumes mounted inside the container.
It can be useful to commit a container’s file changes or settings into a new image.

 

docker的数据挂载分为三种volume, bind mount和tmpfs:


volume是由docker默认及推荐的挂载方式,volume由docker直接管理,同一个volume可以共享给多个容器使用,volume和容器的生命周期完全独立,容器删除时volume仍然存在,除非使用docker volume相应命令删除volume;缺点是volume在宿主机上比较难定位,在宿主机上直接操作volume比较困难。


bind mount是直接将宿主机文件系统上的文件路径映射到容器中,两边双向同步,显而易见,有缺点也有优点,优点是可以直接访问,也可以被别的程序使用,比如我们打包一个本地应用到本地/target路径,我们就可以把这个路径使用bind mount的方式挂在到依赖他的应用的docker容器中,这样本地应用打包后,docker里的数据卷也会同时更新;缺点也是显而易见的,因为你可以把任何文件路径使用bind mount的方式绑定到容器中,这样有可能一些安全问题,比如把宿主机的系统文件绑定到容器中。


tmpfs这种方式是使用宿主机的内存作为存储,不会写到宿主机的文件系统中,和前两种区别较大。

mysql dockerHub主页中的推荐方式是在宿主机中新建一个专门用来存放mysql docker数据的文件路径,同时在新建容器的时候将该路径映射到容器中,也就是使用bind mount的方式,之所以不使用volume的方式是因为volume是由docker管理,在宿主机上比较难定位。

那对于我的情况,既已经有一个容器使用了volume,想把volume里的数据在新的容器中使用bind mount方式挂载该怎么办呢?我们可以先把mysqldock容器中所需要的文件拷贝出来到本地的/var/own/mysqldata,通过

docker cp hub.c.163.com/library/mysql:/var/lib/mysql /var/own/mysqldata

 

然后在创建新的mysql容器时,挂载该文件即可

docker run -v /var/own/mysqldata:/var/lib/mysql --name mysqlnew -d mysql

 

这样新的容器就可以保留mysqldock中的数据了,问题解决!当然,我们也可以使用docker推荐的volume方式挂载,首先找到mysqldock的volume,然后在运行新容器时指定该volume进行挂载就行了:

 
使用volume进行挂载

这种方式繁琐?别急,还有更简单的,在创建容器的时候,可以指定使用其他容器的volume,也就是共享其他容器的volume,使用--volumes-from参数

docker run --name mysqlvolumn2 --volumes-from mysqldock -d mysql

 

其实volume还可以在创建的时候进行命名,从而是查找起来不那么繁琐,具体的参数就请大家参考官网或者--help了,其实官方更加推荐的是使用--mount代替-v参数,官网上有详尽的例子,大家也可以自行进行尝试。

 

  

posted @   NHZ-M  阅读(241)  评论(13编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示