前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Named Volume 在 MySQL 数据持久化上的基本应用

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

作者头像
心莱科技雪雁
发布2019-03-19 15:48:45
8610
发布2019-03-19 15:48:45
举报

原文作者:春哥

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

初识春哥时,春哥是美术设计大咖。后不久,创业并致力于游戏开发,已有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/mysqlmysql-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 数据卷备份还原的原理之后,其他数据库应该也不难操作。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 麦扣聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档