在 Docker 中使用 mysql 的一些技巧

今天我寫一點在 Docker 容器中使用 MYSQL 的 tips. 要不要在生產環境使用 Docker 運行資料庫這麼深奧的問題,等我踩足夠的坑再來寫吧。 但是至少在開發和測試環境你可以用 docker 管理資料庫啊。

Compose file

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

version: 2nservices:n mysql:n image: mysql:5.7.16n ports:n - ${DB_PORT}:3306n environment:n - TZ=Asia/Shanghain command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_cin volumes:n - ./mysql_data:/var/lib/mysqln restart: unless-stoppedn

版本

一定要鎖定鏡像到最小的版本,因為mysql鏡像升級後需要你手動在容器中執行命令去 mysql-upgrade,否則很久之後,你才發現有的數據已經損壞了。 實在想升級,升級步驟如下:

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

如果想在外部通過工具訪問,需要將3306埠映射到host上的一個埠,不準備外部訪問的環境則不必。 一般來說開發和測試環境還是經常需要登到資料庫上查看的。

時區

添加環境變數 TZ 讓mysql用你的默認時區啟動。 這是因為 mysql 的基礎鏡像是 debian, 這個環境變數可以聲明 debian 的時區,然後被 mysql 繼承。

字元編碼

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

存儲

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

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

初始化

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

導入導出

在容器中運行的 mysql 該怎麼導入導出數據或結構呢?照這麼做吧:

# Backupndocker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sqlnn# Restorendocker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE < backup.sqln

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


推薦閱讀:

網易蜂巢的原理是什麼?通俗的舉例說明
學習docker要有什麼基礎?

TAG:Docker | MySQL | 数据库 |