原文做者:春哥php
初识春哥时,春哥是美术设计大咖。后不久,创业并致力于游戏开发,已有3年。从Unity3D到IOS(Swift)开发,从前端开发到后端以及容器技术,从设计开发测试到产品经理以及CEO,已经是爬坑累累,可是还是奋勇前行。前端
春哥仍在奋斗,游戏也即将上线,而咱们也需砥砺前行啊!mysql
使用 Docker 时,容器(Container)会自动建立一个数据卷(Data Volume)来单独储存数据。数据卷有独立的本地目录,不跟着容器走,你在不一样地方使用同一个容器,数据是不同的。自动建立的数据卷不便于管理,Docker 官方建议咱们用 Named Volume 来负责容器的数据持久化,Named Volume 就是本身取名字手动建立一个数据卷。sql
本文使用 MySQL 数据库作例子。数据卷对数据库容器来讲是很是重要的。docker
这里咱们随便取个数据卷名字叫 my-data
吧。建立命令很简单:数据库
docker volume create --name my-data
容器在建立时,除了自动建立数据卷外,也会自动建立它的专用网络(Network)。这个网络咱们也要用本身建立的(Defined Network),本身建立的方便管理。这里给网络取名叫 my-network
:后端
docker network create my-network
为何建立这个网络呢?是为了在容器间共享网络,看下去就会明白。centos
如今利用前面建立的数据卷和网络建立一个 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
详细解释一下各参数:bash
mysql-a
。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管理 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
)。
使用数据卷的一大好处,是能够在不一样机器和环境中使用同一套数据。所以,必须掌握如何备份和还原数据卷。
备份的操做思路:
命令行操做:
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 数据卷备份还原的原理以后,其余数据库应该也不难操做。