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 : -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 : -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 数据卷备份还原的原理之后,其他数据库应该也不难操作。
Named Volume 在 MySQL 数据持久化上的基本应用的更多相关文章
- docker mysql 数据持久化到本地、设置不区别表名大小写-清风柳絮-51CTO博客
原文:docker mysql 数据持久化到本地.设置不区别表名大小写-清风柳絮-51CTO博客 Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 ...
- k8s部署mysql数据持久化
在这里我部署mysql的目的是为了后面将上一篇博客docker打包的el-admin镜像部署到k8s上,所以本文主要是部署mysql并实现持久化. 1.将我们的应用都部署到 el-admin 这个命名 ...
- docker数据持久化
转载/参考: https://www.jianshu.com/p/ef0f24fd0674 Docker的数据持久化主要有两种方式: bind mount docker managed volume ...
- 数据持久化之Data Volume
废话不多说直接操作 1.启动一个MySQL测试容器 [root@localhost labs]# docker pull mysql #下载MySQL镜像 [root@localhost labs]# ...
- Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)
Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...
- Sentinel上生产环境只差一步,监控数据持久化
之前介绍了Sentinel相关的文章,小伙伴在生产实践中不知道有没有这个疑问?我们的Sentinel控制台监控的数据只能看最近5分钟的,如图 那么就导致历史数据是查看不了的,那肯定是不行的,在生产环境 ...
- seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案
seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...
- 迁移mysql数据到oracle上
转自:http://www.cnblogs.com/Warmsunshine/p/4651283.html 我是生成的文件里面的master.sql里面的sql,一个一个拷出来的. 迁移mysql数据 ...
- MySQL能够承受上亿万条的数据量的架构
MySQL能够承受上亿万条的数据量的架构 最近做的搜索引擎的数据量是越来越大估计了下在中国可能涉及到的1Kw的数据量,就全球来说也就是1K亿而已,最初是用的数据库是MySQL现在来说要做些优化,最终使 ...
随机推荐
- 有终将被编程潮流淹没的程序员,那是因为没学python人工智能吧?
2017年被称为中国人工智能元年--在两会时期,人工智能曾经成为国度计策,同时被写进当局报告.在从前的一年里,人工智能获得注重,已逐步浸透到别的行业,无人超市.主动驾驶.人脸识别.智能家居等" ...
- StringBuffer与StringBuilder
有些时候,需要由较短的字符串构建字符串.比如,按键或来自文件中的单词.采用字符串连接的方式达到此目的效率比较低.每次连接字符串的时候,都会构建一个新的String对象,既耗时,又浪费空间.使用Stri ...
- JavaScript的数组知识案例之随机点名器
本次分享JavaScript主要知识点涉及到for循环.if选择结构判断语句.数组的定义.定时器.清除定时器.日期对象的使用. 执行后效果图: 思路: 1.网页结构搭建: HTML 2.网页布局美化: ...
- javascript中的隐式类型转化
javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...
- Java如何获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
1 下载安装sigar-1.6.4.zip 使用java自带的包获取系统数据,容易找不到包,尤其是内存信息不够准确,所以选择使用sigar获取系统信息. 下载地址:http://sourceforge ...
- 0517JS综合练习、挂事件练习
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- Fedora Linux中解决“xxx不在sudoers文件中”
问题描述: 在Fedora中执行一些操作时需要使用root权限,当我使用命令: sudo 想在普通用户中临时获得root权限时,却被提示: "xxx 不在 sudoers 文件中.此事将被报 ...
- 概率与统计推断第二讲homework
作业目的: 体会条件独立 1.现需要设计一个根据一个人是否是学生$S$(布尔变量)和其体重$W$(连续变量)判断该人的性别$G$(布尔变量).假设在给定$G$的情况下$S$和$W$独立,且假设概率分布 ...
- JavaWeb(四)Servlet-1
1.Servlet 简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中.Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet ...
- BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈
BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...