在 Docker 中使用 mysql 的一些技巧

Muninn發表於2017-04-12

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

Compose file

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

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映象升級後需要你手動在容器中執行命令去 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 該怎麼匯入匯出資料或結構呢?照這麼做吧:

# 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 ,歡迎大家補充。

相關文章