在 Docker 中使用 MYSQL 的一些技巧

今天我寫一點在 Docker 容器中使用 MYSQL 的 tips.
要不要在生產(chǎn)環(huán)境使用 Docker 運行數(shù)據(jù)庫這么深奧的問題,等我踩足夠的坑再來寫吧。
但是至少在開發(fā)和測試環(huán)境你可以用 docker 管理數(shù)據(jù)庫啊。

Compose file

先貼一個我常用的 docker-compose 片段,后邊進行詳細的解釋。這是日常使用的狀態(tài),此處省略了別的服務(wù)。

version: '2'
services:
    mysql:
        image: mysql:5.7.16
        ports:
        - ${DB_PORT}:3306
        environment:
        - TZ=Asia/Shanghai
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        volumes:
        - ./mysql_data:/var/lib/mysql
        restart: unless-stopped

版本

一定要鎖定鏡像到最小的版本,因為mysql鏡像升級后需要你手動在容器中執(zhí)行命令去 mysql-upgrade,否則很久之后,你才發(fā)現(xiàn)有的數(shù)據(jù)已經(jīng)損壞了。
實在想升級,升級步驟如下:

  • 如果是用 docker run 啟動的,那么停掉再啟動個新的。如果是用 docker-compose 啟動的,直接改版本號 pull 鏡像重新 up。
  • 在新的版本啟動后執(zhí)行 docker exec -it 你的容器名稱或id mysql-upgrade

端口

如果想在外部通過工具訪問,需要將3306端口映射到host上的一個端口,不準備外部訪問的環(huán)境則不必。
一般來說開發(fā)和測試環(huán)境還是經(jīng)常需要登到數(shù)據(jù)庫上查看的。

時區(qū)

添加環(huán)境變量 TZ 讓mysql用你的默認時區(qū)啟動。
這是因為 mysql 的基礎(chǔ)鏡像是 debian, 這個環(huán)境變量可以聲明 debian 的時區(qū),然后被 mysql 繼承。

字符編碼

mysql 的鏡像默認編碼是 latin1 這可不行,在中國我們一般都用 UTF8 。
一般我們要是在主機上配置 mysql 的話,是去修改配置文件。但使用容器時映射進去一個配置文件是很復(fù)雜的。
于是我們有個簡單的辦法,mysql 接受很多 flag 通過啟動時傳入。其中就有聲明服務(wù)器默認編碼的。
我們的 command 命令就是給 mysql 在啟動時加了兩個參數(shù)。

存儲

容器中有需要持久化存儲的內(nèi)容時就會有點麻煩。一般有兩種方案,一種是映射主機的一個目錄,一種是利用數(shù)據(jù)卷。
在很長時間的使用中,我總結(jié)出了這個比較方便的辦法。

  • 因為 docker-compose 有個潛規(guī)則就是大家一般都在有 compose 文件那個目錄執(zhí)行命令。
  • 于是我們做一個以環(huán)境名稱命名的文件夾,里邊是 compose 文件,.env 文件,和各種需要持久化的文件夾。
  • 在 compose 文件中,我們映射文件夾用相對目錄。
  • 最后,這個文件夾就是一個整體,只需要把它拷貝在任何機器任何地方都可以啟動這個環(huán)境。

初始化

mysql 容器在首次啟動的時候,必須指定一個root密碼才能啟動,指定的方式是聲明環(huán)境變量 MYSQL_ROOT_PASSWORD 。
一旦在指定的數(shù)據(jù)文件夾發(fā)現(xiàn)已經(jīng)存在庫的時候,這個參數(shù)就會被忽略掉。
所以我們只需要在第一次啟動的時候加上,后面有了數(shù)據(jù)后都去掉就好了。

導(dǎo)入導(dǎo)出

在容器中運行的 mysql 該怎么導(dǎo)入導(dǎo)出數(shù)據(jù)或結(jié)構(gòu)呢?照這么做吧:

# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql

# Restore
docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE < backup.sql

就這么多吧,還有什么 Tips ,歡迎大家補充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容