Named Volume 在 MySQL 数据持久化上的基本应用
原文作者:春哥
非常感謝春哥的投稿,同時也有一些感慨。
初識春哥時,春哥是美術設計大咖。后不久,創業并致力于游戲開發,已有3年。從Unity3D到IOS(Swift)開發,從前端開發到后端以及容器技術,從設計開發測試到產品經理以及CEO,已是爬坑累累,但是仍是奮勇前行。
春哥仍在奮斗,游戲也即將上線,而我們也需砥礪前行啊!
使用 Docker 時,容器(Container)會自動創建一個數據卷(Data Volume)來單獨儲存數據。數據卷有獨立的本地目錄,不跟著容器走,你在不同地方使用同一個容器,數據是不一樣的。自動創建的數據卷不便于管理,Docker 官方建議我們用 Named Volume 來負責容器的數據持久化,Named Volume 就是自己取名字手動創建一個數據卷。
本文使用 MySQL 數據庫做例子。數據卷對數據庫容器來說是非常重要的。
創建數據卷
這里我們隨便取個數據卷名字叫?my-data?吧。創建命令很簡單:
創建共享網絡
容器在創建時,除了自動創建數據卷外,也會自動創建它的專用網絡(Network)。這個網絡我們也要用自己創建的(Defined Network),自己創建的方便管理。這里給網絡取名叫?my-network:
為什么創建這個網絡呢?是為了在容器間共享網絡,看下去就會明白。
創建 MySQL 容器
現在利用前面創建的數據卷和網絡創建一個 MySQL 容器:
詳細解釋一下各參數:
容器命名為?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 数据持久化上的基本应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 .NET Core 中运行 Java
- 下一篇: .Netcore 2.0 Ocelot