今天我寫一點在 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 ,歡迎大家補充。