Named Volume 在 MySQL 数据持久化上的基本应用
原文作者:春哥
非常感謝春哥的投稿,同時(shí)也有一些感慨。
初識(shí)春哥時(shí),春哥是美術(shù)設(shè)計(jì)大咖。后不久,創(chuàng)業(yè)并致力于游戲開(kāi)發(fā),已有3年。從Unity3D到IOS(Swift)開(kāi)發(fā),從前端開(kāi)發(fā)到后端以及容器技術(shù),從設(shè)計(jì)開(kāi)發(fā)測(cè)試到產(chǎn)品經(jīng)理以及CEO,已是爬坑累累,但是仍是奮勇前行。
春哥仍在奮斗,游戲也即將上線(xiàn),而我們也需砥礪前行啊!
使用 Docker 時(shí),容器(Container)會(huì)自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)卷(Data Volume)來(lái)單獨(dú)儲(chǔ)存數(shù)據(jù)。數(shù)據(jù)卷有獨(dú)立的本地目錄,不跟著容器走,你在不同地方使用同一個(gè)容器,數(shù)據(jù)是不一樣的。自動(dòng)創(chuàng)建的數(shù)據(jù)卷不便于管理,Docker 官方建議我們用 Named Volume 來(lái)負(fù)責(zé)容器的數(shù)據(jù)持久化,Named Volume 就是自己取名字手動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)卷。
本文使用 MySQL 數(shù)據(jù)庫(kù)做例子。數(shù)據(jù)卷對(duì)數(shù)據(jù)庫(kù)容器來(lái)說(shuō)是非常重要的。
創(chuàng)建數(shù)據(jù)卷
這里我們隨便取個(gè)數(shù)據(jù)卷名字叫?my-data?吧。創(chuàng)建命令很簡(jiǎn)單:
創(chuàng)建共享網(wǎng)絡(luò)
容器在創(chuàng)建時(shí),除了自動(dòng)創(chuàng)建數(shù)據(jù)卷外,也會(huì)自動(dòng)創(chuàng)建它的專(zhuān)用網(wǎng)絡(luò)(Network)。這個(gè)網(wǎng)絡(luò)我們也要用自己創(chuàng)建的(Defined Network),自己創(chuàng)建的方便管理。這里給網(wǎng)絡(luò)取名叫?my-network:
為什么創(chuàng)建這個(gè)網(wǎng)絡(luò)呢?是為了在容器間共享網(wǎng)絡(luò),看下去就會(huì)明白。
創(chuàng)建 MySQL 容器
現(xiàn)在利用前面創(chuàng)建的數(shù)據(jù)卷和網(wǎng)絡(luò)創(chuàng)建一個(gè) MySQL 容器:
詳細(xì)解釋一下各參數(shù):
容器命名為?mysql-a。
MySQL 默認(rèn)的端口是?3306,你可以換一個(gè)以免和本地的沖突。這個(gè)例子中我映射到?33061。
-d?是后臺(tái)運(yùn)行。?--rm?是讓容器在停止運(yùn)行時(shí)自動(dòng)刪除。數(shù)據(jù)在外部的卷里,可以放心刪。
-v?就是使用數(shù)據(jù)卷。/var/lib/mysql?是 MySQL 存放數(shù)據(jù)的目錄,現(xiàn)在我們要把里面的東西都映射到數(shù)據(jù)卷里:-v my-data:/var/lib/mysql
--network my-network?使用我們剛才創(chuàng)建的網(wǎng)絡(luò)。
-e?設(shè)定 MySQL 的環(huán)境變量。在這里我們?cè)O(shè)定 root 密碼為?abcd1234
最后?mysql:latest?是映像(Image)。具體 tag 可看 Docker Hub:?MySQL
創(chuàng)建 PhpMyAdmin 容器
管理 MySQL 數(shù)據(jù)庫(kù)的客戶(hù)端有很多,其中 PhpMyAdmin 是比較常見(jiàn)的一種。所以現(xiàn)在我們要?jiǎng)?chuàng)建 PhpMyAdmin 的容器,然后去管理 MySQL 容器,也就是連接兩種容器。
如何連接?以前可以用?--link?的方式,但官方已經(jīng)不推薦了,未來(lái)版本會(huì)棄用的,這里就不寫(xiě)了。官方推薦的是 Defined Network,之前創(chuàng)建?my-network?就是為了用在這里。如果你不用 PhpMyAdmin 管理,那么 Network 也可以不單獨(dú)創(chuàng)建。
創(chuàng)建容器:
docker run -d --rm --name my-pma --network my-network -p 8080:80 -e PMA_HOST=mysql-a phpmyadmin/phpmyadmin參數(shù)中?PMA_HOST=mysql-a?指定了 MySQL 容器。端口隨便映射了一個(gè)?8080。創(chuàng)建好后,PhpMyAdmin 容器和 MySQL 容器就在同一個(gè)網(wǎng)絡(luò)里了,然后 PhpMyAdmin 就可以管理 MySQL 數(shù)據(jù)庫(kù)了。
現(xiàn)在打開(kāi)瀏覽器,進(jìn)?http://localhost:8080,輸入 root 賬戶(hù)密碼就可以進(jìn)去管理了——如果你的 MySQL 版本 >= 5.7,那可能登錄不進(jìn)去,需要改一下 MySQL 賬號(hào)所用的密碼插件(identified with mysql_native_password)。
數(shù)據(jù)卷的備份
使用數(shù)據(jù)卷的一大好處,是可以在不同機(jī)器和環(huán)境中使用同一套數(shù)據(jù)。因此,必須掌握如何備份和還原數(shù)據(jù)卷。
備份的操作思路:
創(chuàng)建一個(gè)新容器,這個(gè)容器有一個(gè)數(shù)據(jù)卷和 MySQL 容器是一樣的。
再掛載一個(gè)非 Named Volume 數(shù)據(jù)卷(本地目錄),用來(lái)映射本地備份目錄。
將 MySQL 容器數(shù)據(jù)卷打包,然后存在備份目錄里。
在本地目錄獲取數(shù)據(jù)卷打包文件。
命令行操作:
docker run --rm --volumes-from mysql-a -v $(pwd):/backup busybox tar cvf /backup/mysql-backup.tar /var/lib/mysql參數(shù)說(shuō)明:
用了?--volumes-from mysql-a,就是從?mysql-a?直接拿它的數(shù)據(jù)卷(my-data)過(guò)來(lái)用。
-v $(pwd):/backup:將本地當(dāng)前目錄作為數(shù)據(jù)卷目錄映射到容器系統(tǒng)的?/backup?目錄,$(pwd)就是輸出當(dāng)前目錄,注意在 PowerShell 里是?${pwd}。你用別的目錄也可以。
busybox?是用到的 Image,它的容量很小,但重要工具基本都有。
tar cvf /backup/mysql-backup.tar /var/lib/mysql?是在容器里執(zhí)行的備份命令:將?/var/lib/mysql?(mysql-a?數(shù)據(jù)卷內(nèi)容)打包到?/backup?目錄下的 mysql-backup.tar 中。由于本地當(dāng)前目錄和?/backup?有映射關(guān)系,所以本地當(dāng)前目錄下也會(huì)有 mysql-backup.tar 文件。
mysql-backup.tar 就是我們創(chuàng)建的數(shù)據(jù)卷備份文件,你可以帶著它到處跑了。有些人會(huì)做一個(gè)專(zhuān)門(mén)存放各種數(shù)據(jù)卷的容器作為備份,我感覺(jué)有點(diǎn)麻煩和多余。
數(shù)據(jù)卷的還原
還原的思路和備份一樣,也是先要搞一個(gè)臨時(shí)容器,然后執(zhí)行一些命令去解壓 tar 文件。
假設(shè)我們?cè)趧e的地方創(chuàng)建了一個(gè)新的 MySQL 容器?mysql-b,我們?cè)撛趺窗?my-data?數(shù)據(jù)卷的數(shù)據(jù)還原到它里面去呢?
先把 mysql-backup.tar 拷貝到當(dāng)前目錄。然后:
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"這里重點(diǎn)解釋一下在容器 bash 里執(zhí)行的命令:
cd /var/lib: 進(jìn)入?/var/lib?目錄。
rm -rf mysql/*: 刪除目錄 mysql 下的所有文件,為的是等會(huì)將數(shù)據(jù)卷的備份文件放進(jìn)去。刪除再解壓進(jìn)去比直接覆蓋更干凈穩(wěn)妥一些。
tar xvf /backup/mysql-backup.tar --strip 2: 將 mysql-backup.tar 文件中 mysql 的文件解壓到?/var/lib/mysql?目錄中去,因?yàn)槲覀冊(cè)?/var/lib?中,而打包文件包括了?/var/lib/mysql?多層目錄,所以加了參數(shù)?--strip 2。關(guān)于打包解壓目錄這種事你可以自己規(guī)劃,只要確保?mysql?里的文件能正確的備份和還原就行。
文件解壓完后,重啟當(dāng)前的 MySQL 容器:
docker restart mysql-b還原工作到此結(jié)束,現(xiàn)在?mysql-b?的數(shù)據(jù)和?mysql-a?是一樣的了。
總結(jié)
數(shù)據(jù)卷對(duì)數(shù)據(jù)庫(kù)容器非常重要。Named Volume 可以使我們管理數(shù)據(jù)卷更為方便,應(yīng)多加利用。其他數(shù)據(jù)庫(kù)的文件結(jié)構(gòu)和 MySQL 可能不一樣,但只要掌握了 MySQL 數(shù)據(jù)卷備份還原的原理之后,其他數(shù)據(jù)庫(kù)應(yīng)該也不難操作。
如果喜歡作者的文章,請(qǐng)關(guān)注“magiccodes”訂閱號(hào)以便第一時(shí)間獲得最新內(nèi)容。本文版權(quán)歸作者和湖南心萊信息科技有限公司共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
QQ群:
編程交流群<85318032>?
產(chǎn)品交流群<897857351>
長(zhǎng)沙線(xiàn)下技術(shù)社區(qū)已經(jīng)創(chuàng)建,有興趣者可以通過(guò)客服加群。接下來(lái),我們會(huì)定期組織一些線(xiàn)下技術(shù)交流分享會(huì),以饗大家。
總結(jié)
以上是生活随笔為你收集整理的Named Volume 在 MySQL 数据持久化上的基本应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在 .NET Core 中运行 Java
- 下一篇: 在实际项目中使用LiteDB NoSQL