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
)。
数据卷的备份
使用数据卷的一大好处,是可以在不同机器和环境中使用同一套数据。因此,必须掌握如何备份和还原数据卷。
备份的操作思路:
创建一个新容器,这个容器有一个数据卷和 MySQL 容器是一样的。
再挂载一个非 Named Volume 数据卷(本地目录),用来映射本地备份目录。
将 MySQL 容器数据卷打包,然后存在备份目录里。
在本地目录获取数据卷打包文件。
命令行操作:
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 里执行的命令:
cd /var/lib
: 进入/var/lib
目录。rm -rf mysql/*
: 删除目录 mysql 下的所有文件,为的是等会将数据卷的备份文件放进去。删除再解压进去比直接覆盖更干净稳妥一些。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 数据卷备份还原的原理之后,其他数据库应该也不难操作。
转载是一种动力 分享是一种美德
如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
QQ群:
编程交流群<85318032>
产品交流群<897857351>
长沙线下技术社区已经创建,有兴趣者可以通过客服加群。接下来,我们会定期组织一些线下技术交流分享会,以飨大家。
Named Volume 在 MySQL 数据持久化上的基本应用相关推荐
- 【云原生】阿里云ACK部署MySQL 数据持久化存储
思路图 一.概述 ACK介绍 阿里云容器服务Kubernetes版(Alibaba Cloud Container Service for Kubernetes,简称容器服务ACK)是全球首批通过Ku ...
- mysql数据持久化读取_Python数据持久化-小测验
2018年7月13日考试 1.Python读写csv文件 现有如下图1所示的data.csv文件数据,请使用python读取该csv文件数据,并添加一条记录后输出如图2所示的output.csv文件( ...
- 数据采集与存储案例——基于Python爬虫框架Scrapy的爬取网络数据与MySQL数据持久化
此案例需要预先安装pymsql python3.7.4 scrapy2.7.1 一.安装scrapy框架 1.使用pip命令安装scrapy pip install scrapy 在这里下载太慢可以使 ...
- docker 打包mysql_基于docker部署mysql的数据持久化问题
本人最近在使用docker部署mysql时,在持久化mysql数据时遇到了一个有趣的问题,将排查过程及思考记录在这里,以备后查. 先简单描述下我遇到的问题:在mysql容器中创建了两个数据库,然后使用 ...
- @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)
文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...
- docker mysql初始化数据及数据持久化
1.初始化默认数据 我们经常会在mysql容器启动时,需要初始化一些数据库.数据表或者其他默认数据.其实mysql早已支持我们这种需求,具体方案如下: # 其实主要的做法就是重新build mysql ...
- 三剑客”之Swarm应用数据持久化管理(volume 、bind 、 nfs)
1.前言 在上一篇文章 <"三剑客"之Swarm集群架构.集群管理 .服务管理>中,大家已了解swarm集群管理以及如何管理swarm集群中的服务.试想一下,如果sw ...
- docker学习笔记(四)docker数据持久化volume
docker数据持久化 官网:https://docs.docker.com/storage/volumes/ docker中的容器是可以随时销毁的,容器中的数据会随着容器的消亡而消亡.然而很多容器都 ...
- k8s mysql数据同步_K8s——MySQL实现数据持久化
1.搭建nfs存储 [root@docker-k8s01 ~]# yum -y install nfs-utils [root@docker-k8s01 ~]# mkdir /nfsdata/mysq ...
最新文章
- 皮一皮:华夏之大,无奇不有...
- 一个简单的反射拷贝一份新的实体类
- MFC单文档程序响应菜单消息的顺序
- 递归的效率问题及递归与循环比较
- 如何使用Cmder替换cmd
- 阿里巴巴成立云原生技术委员会,云原生升级为阿里技术新战略!
- Codeforces Round #FF (Div. 2):Problem A - DZY Loves Hash
- “购物比价类”Target SDK≥26优秀应用展示
- 7、创建ROS msg和srv
- 黑php的称呼,“黑”起母校都是把好手!这些高校别称你绝对想不到
- 虚拟化管理软件比较(Eucalyptus, OpenNebula, OpenStack, OpenQRM, XenServer, Oracle VM, CloudStack, ConVirt)
- 计算机写程序的步骤,电脑怎么编程 电脑编程的方法
- Qt QPainter CompositionMode解读及图片透明度设置
- 游戏测试好还是软件测试好,浅学软件测试 软件测试和游戏测试哪个有前途?...
- 中水处理设备:中水回用的三种主处理方法及其比较
- pyqt 打开并显示excel表单
- 发现美,创造美,拥有美^_^.
- 试用LibreOffice对VBA的支持
- 数据结构和算法学习指南
- PCI-E 5.0标准正式公布!速度再次翻番达32GT/s
热门文章
- 微软 word转换pdf_如何将行转换为Microsoft Word表中的列
- linux下设备或资源忙,linux删除文件目录 目录设备或资源忙怎么办
- 【Solidity】3.类型 - 深入理解Solidity
- nginx源码学习Unix - Unix域协议
- php的几种运行模式CLI、CGI、FastCGI、mod_php
- left outer join 和 right outer join 和 join 的区别
- 如何捕获 EF 生成的 SQL 脚本?
- Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用
- c#爬虫-1688官网自动以图搜图
- techempower拿分系列之aspcore分析