Named Volume 在 MySQL 数据持久化上的基本应用

原文作者:春哥

非常感谢春哥的投稿,同时也有一些感慨。

初识春哥时,春哥是美术设计大咖。后不久,创业并致力于游戏开发,已有3年。从Unity3D到IOS(Swift)开发,从前端开发到后端以及容器技术,从设计开发测试到产品经理以及CEO,已是爬坑累累,但是仍是奋勇前行。

春哥仍在奋斗,游戏也即将上线,而我们也需砥砺前行啊!



使用 Docker 时,容器(Container)会自动创建一个数据卷(Data Volume)来单独储存数据。数据卷有独立的本地目录,不跟着容器走,你在不同地方使用同一个容器,数据是不一样的。自动创建的数据卷不便于管理,Docker 官方建议我们用 Named Volume 来负责容器的数据持久化,Named Volume 就是自己取名字手动创建一个数据卷。

本文使用 MySQL 数据库做例子。数据卷对数据库容器来说是非常重要的。


创建数据卷


这里我们随便取个数据卷名字叫 my-data 吧。创建命令很简单:

docker volume create --name my-data


创建共享网络


容器在创建时,除了自动创建数据卷外,也会自动创建它的专用网络(Network)。这个网络我们也要用自己创建的(Defined Network),自己创建的方便管理。这里给网络取名叫 my-network

docker network create my-network

为什么创建这个网络呢?是为了在容器间共享网络,看下去就会明白。


创建 MySQL 容器


现在利用前面创建的数据卷和网络创建一个 MySQL 容器:

docker run -d --rm --name mysql-a -v my-data:/var/lib/mysql --network my-network -p 33061:3306 -e MYSQL_ROOT_PASSWORD=abcd1234 mysql:latest

详细解释一下各参数:

  • 容器命名为 mysql-a

  • MySQL 默认的端口是 3306,你可以换一个以免和本地的冲突。这个例子中我映射到 33061

  • -d 是后台运行。 --rm 是让容器在停止运行时自动删除。数据在外部的卷里,可以放心删。

  • -v 就是使用数据卷。/var/lib/mysql 是 MySQL 存放数据的目录,现在我们要把里面的东西都映射到数据卷里:-v my-data:/var/lib/mysql

  • --network my-network 使用我们刚才创建的网络。

  • -e 设定 MySQL 的环境变量。在这里我们设定 root 密码为 abcd1234

  • 最后 mysql:latest 是映像(Image)。具体 tag 可看 Docker Hub: MySQL


创建 PhpMyAdmin 容器


管理 MySQL 数据库的客户端有很多,其中 PhpMyAdmin 是比较常见的一种。所以现在我们要创建 PhpMyAdmin 的容器,然后去管理 MySQL 容器,也就是连接两种容器。

如何连接?以前可以用 --link 的方式,但官方已经不推荐了,未来版本会弃用的,这里就不写了。官方推荐的是 Defined Network,之前创建 my-network 就是为了用在这里。如果你不用 PhpMyAdmin 管理,那么 Network 也可以不单独创建。

创建容器:

docker run -d --rm --name my-pma --network my-network -p 8080:80 -e PMA_HOST=mysql-a phpmyadmin/phpmyadmin

参数中 PMA_HOST=mysql-a 指定了 MySQL 容器。端口随便映射了一个 8080。创建好后,PhpMyAdmin 容器和 MySQL 容器就在同一个网络里了,然后 PhpMyAdmin 就可以管理 MySQL 数据库了。

现在打开浏览器,进 http://localhost:8080,输入 root 账户密码就可以进去管理了——如果你的 MySQL 版本 >= 5.7,那可能登录不进去,需要改一下 MySQL 账号所用的密码插件(identified with mysql_native_password)。


数据卷的备份


使用数据卷的一大好处,是可以在不同机器和环境中使用同一套数据。因此,必须掌握如何备份和还原数据卷。

备份的操作思路:

  1. 创建一个新容器,这个容器有一个数据卷和 MySQL 容器是一样的。

  2. 再挂载一个非 Named Volume 数据卷(本地目录),用来映射本地备份目录。

  3. 将 MySQL 容器数据卷打包,然后存在备份目录里。

  4. 在本地目录获取数据卷打包文件。

命令行操作:

docker run --rm --volumes-from mysql-a -v $(pwd):/backup busybox tar cvf /backup/mysql-backup.tar /var/lib/mysql

参数说明:

  • 用了 --volumes-from mysql-a,就是从 mysql-a 直接拿它的数据卷(my-data)过来用。

  • -v $(pwd):/backup:将本地当前目录作为数据卷目录映射到容器系统的 /backup 目录,$(pwd)就是输出当前目录,注意在 PowerShell 里是 ${pwd}。你用别的目录也可以。

  • busybox 是用到的 Image,它的容量很小,但重要工具基本都有。

  • tar cvf /backup/mysql-backup.tar /var/lib/mysql 是在容器里执行的备份命令:将 /var/lib/mysql (mysql-a 数据卷内容)打包到 /backup 目录下的 mysql-backup.tar 中。由于本地当前目录和 /backup 有映射关系,所以本地当前目录下也会有 mysql-backup.tar 文件。

mysql-backup.tar 就是我们创建的数据卷备份文件,你可以带着它到处跑了。有些人会做一个专门存放各种数据卷的容器作为备份,我感觉有点麻烦和多余。


数据卷的还原


还原的思路和备份一样,也是先要搞一个临时容器,然后执行一些命令去解压 tar 文件。

假设我们在别的地方创建了一个新的 MySQL 容器 mysql-b,我们该怎么把 my-data 数据卷的数据还原到它里面去呢?

先把 mysql-backup.tar 拷贝到当前目录。然后:

docker run --rm --volumes-from mysql-b -v $(pwd):/backup centos bash -c "cd /var/lib && rm -rf mysql/* && tar xvf /backup/mysql-backup.tar --strip 2"

这里重点解释一下在容器 bash 里执行的命令:

  1. cd /var/lib: 进入 /var/lib 目录。

  2. rm -rf mysql/*: 删除目录 mysql 下的所有文件,为的是等会将数据卷的备份文件放进去。删除再解压进去比直接覆盖更干净稳妥一些。

  3. tar xvf /backup/mysql-backup.tar --strip 2: 将 mysql-backup.tar 文件中 mysql 的文件解压到 /var/lib/mysql 目录中去,因为我们在 /var/lib 中,而打包文件包括了 /var/lib/mysql 多层目录,所以加了参数 --strip 2。关于打包解压目录这种事你可以自己规划,只要确保 mysql 里的文件能正确的备份和还原就行。

文件解压完后,重启当前的 MySQL 容器:

docker restart mysql-b

还原工作到此结束,现在 mysql-b 的数据和 mysql-a 是一样的了。


总结


数据卷对数据库容器非常重要。Named Volume 可以使我们管理数据卷更为方便,应多加利用。其他数据库的文件结构和 MySQL 可能不一样,但只要掌握了 MySQL 数据卷备份还原的原理之后,其他数据库应该也不难操作。



640?wx_fmt=png转载是一种动力 分享是一种美德640?wx_fmt=gif

如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


QQ群:

编程交流群<85318032> 

产品交流群<897857351>


长沙线下技术社区已经创建,有兴趣者可以通过客服加群。接下来,我们会定期组织一些线下技术交流分享会,以飨大家。


640?wx_fmt=png640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.Netcore 2.0 Ocelot Api网关教程(7)- 限流

本文介绍Ocelot中的限流&#xff0c;限流允许Api网关控制一段时间内特定api的总访问次数。限流的使用非常简单&#xff0c;只需要添加配置即可。1、添加限流修改 configuration.json 配置文件&#xff0c;对 UpstreamPathTemplate 为 /webapib/values 的配置修改如下&#xff1…

微信开发必看,使用.Net Core 开发微信跨平台应用

.NET Core 是一个开源通用的开发框架&#xff0c;源码由微软官方和社区共同支持。支持跨平台&#xff0c;即支持在 Window&#xff0c;macOS&#xff0c;Linux 等系统上的开发和部署&#xff0c;并且可以在硬件设备&#xff0c;云服务&#xff0c;和嵌入式/物联网方案中进行使用…

CF1526 D. Kill Anton

CF1526 D. Kill Anton 题意&#xff1a; 给你一个由’A’,‘N’.‘T’,O’四个字符组成的字符串b&#xff0c;现在要求你改变b的顺序得到a&#xff0c;使得a通过移动回到b的步数最多。 每次移动只能移动相邻两项 题解&#xff1a; 官方题解说&#xff1a;最佳情况为相同字符…

ASP.NET Core 3.0预览版体验

目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3&#xff0c;对应ASP.NET Core 3.0 Preview 3。ASP.NET Core 3.0 之后将不再支持.NET Framework&#xff0c;只运行在.NET Core 上面。ASP.NET Core 3.0 现在已经出到了第三个预览版&#xff0c;增加和改进了很多功能。环境准…

C# .net 中 Timeout 的处理及遇到的问题

C# 中 Timeout 的处理前言最近在项目中要实现一个功能&#xff0c;是关于 Timeout 的&#xff0c;主要是要在要在 TCP 连接建立的时间 和 整个请求完成的时间&#xff0c;在这两个时间层面上&#xff0c;如果超出了设置的时间&#xff0c;就抛出异常&#xff0c;程序中断。研究…

[CodeJam 2021 Round 3] Square Free(调整法 / 字典序最小解网络流)

CodeJam 2021 Round3 Square Freeproblemsolutioncodecode-stdproblem 神奈子是个很爱打麻将的老婆婆&#xff0c;有一天她把她的麻将放进了一个 nmn\times mnm 的网格图里&#xff0c;每个麻将可以左斜着放入网格中&#xff08;如 / &#xff09;&#xff0c;也可以右斜着&am…

ConsurrentDictionary并发字典知多少?

在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理.有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题.https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?redirectedfromMSDN&viewn…

ASP.NET Core 基于JWT的认证(二)

上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍&#xff0c;这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用。.Net Core 2.2Visual Studio 2017ASP.NET Core WebAPI2在上一篇文章中&#xff0c;我们详细的介绍了JWT的知识&#xff0c;这…

Docker最全教程之Go实战,墙裂推荐(十九)

前言与其他语言相比&#xff0c;Go非常值得推荐和学习&#xff0c;真香&#xff01;为什么&#xff1f;主要是可以直接编译成机器代码&#xff08;性能优越&#xff0c;体积非常小&#xff0c;可达10来M&#xff0c;见实践教程图片&#xff09;而且设计良好&#xff0c;上手门槛…

你注意到 .Net Framework 和 .Net Core 中使用 Session 的区别了吗?

在测试一个例子时发现的问题&#xff0c;这个示例实现的功能是刷新页面也能保持表格锁定列的状态&#xff0c;先看下页面的完成效果&#xff1a;测试中发现&#xff0c;几乎相同的代码&#xff1a;在 FineUIMvc&#xff08;Net Framework&#xff09;下没有问题&#xff1a;htt…

一键发布部署vs插件[AntDeploy]开源了

deploy to remote server by one button click功能支持docker一键部署(支持netcore)支持iis一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚)(支持点火)支持windows服务一键部署(支持netcore和framework)(支持增量发布)(支持一键回滚) 使用插件前我要发布一个net…

【学习笔记】平等博弈及常见的公平博弈类型

文章目录平等博弈nim堆SG定理nim和常见的公平博弈模型bash博弈nim博弈nim-k博弈wythoff博弈扩展wythoff博弈fibonacci博弈阶梯博弈green hackenbushMisre Nim博弈Every-SGnim积翻棋子游戏游戏的积&#xff0c;tartan定理平等博弈 G{L∣R},LRG\{L|R\},LRG{L∣R},LR&#xff0c;所…

Excel催化剂开源第31波-pdf相关功能实现及类库介绍

在Excel催化剂刚推出的pdf相关功能中&#xff0c;反馈很热烈&#xff0c;不止是用户层面好多人喜欢&#xff0c;也听到在.NET开发群里有询问pdf在winform上展现的功能诉求&#xff0c;一段时间没写开源篇&#xff0c;生怕大家以为Excel催化剂太小气了&#xff0c;不再开发了&am…

[小技巧]ASP.NET Core中如何预压缩静态文件

原文地址&#xff1a;Pre-compressed static files with ASP.NET Core作者&#xff1a;Gunnar Peipman译者&#xff1a;Lamond Lu译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10552131.html示例代码&#xff1a;https://github.com/lamondlu/CompressedStaticFileSample…

【学习笔记】简单的连通性状压DP——插头DP(不学以为是天书)

文章目录哈希链表插头DP概念括号表示法 / 最小表示法例题洛谷插头dp板题CITYParkIITonys TourEfficient Tree[CQOI2015]标识设计哈希链表 众所周知&#xff0c;哈希是有冲突的可能性的&#xff0c;而且在状态数越多&#xff0c;冲突的概率就越高。目前掌握的处理方案有多哈希&…

[NewLife.XCode]实体类详解

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…

Counting Triangles

Counting Triangles 题意&#xff1a; 给你一个完全图&#xff0c;每个边被赋值为0或1&#xff0c;问这个完全图中有多少个完美三角形&#xff1f; 完美三角形定义&#xff1a;三角形的三边都为0或1 题解&#xff1a; 正着求不好求&#xff0c;我们可以倒着想 不考虑完美&a…

程序员过关斩将--论商品促销代码的优雅性

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;YY说你帮她解决了几个问题&#xff0c;也帮我解决一个呗原来是D妹子&#xff0c;来坐我身边&#xff0c;说下情况我的项目是个电商项目&#xff0c;现在产品狗要给商品做活动正常呀我一个新手初来咋到顶不住压力了&…

Math(牛客多校第三场)

Math 题意&#xff1a; 问你有多少对(x,y),1<x<y<n,满足(x2 y2)%(xy1) 0 题解&#xff1a; 这种题。。。直接打表芜湖~ 通过打表发现&#xff1a;满足情况的为(i,i * i * i),但是也有不和谐的声音出现&#xff1a;当x8时&#xff0c;会出现两个&#xff0c;一个…

[NewLife.XCode]增删改查入门

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中。开源地址&#xff1a;https://github.com/…