[Docker] Run MariaDB under container

MariaDB

News

  • []

AliSQL under docker

目前 AliSQL 官方尚未提供 docker image, 僅提供自行編譯 在容器中使用AliSQL 的方法.

基于AliSQL打包的docker镜像

对于MySQL或其分支(MariaDB)分支的数据库镜像,docker官方是有相应的模板的。 但是其官方模板都是使用MySQL的二进制包,通过系统自带的包管理器下载。而AliSQL没有,所以我们只能拉下代码,打一个编译后的的基础镜像, 然后基于这个基础镜像封装mysql镜像的逻辑。

3rd AliSQL docker image

因暫時沒時間折騰 AliSQL docker image, 在 docker hub 上找到了第三方提供的 AliSQL image: 496080199/alisql. Docker Hub 的說明上有安裝設定流程, 相當容易. 摘錄如下:

  1. 下載 Image

    1
    docker pull 496080199/alisql
  2. 建立 AliSQL data 和 log 目錄

    1
    2
    mkdir -p /data/mysql/data
    mkdir -p /data/mysql/log
  3. 透過外部掛載 Volume 的方式啟用 alisql image

    1
    docker run -d -p 3306:3306 -v /data/mysql/data:/data/mysql/data -v /data/mysql/log:/data/mysql/log 496080199/alisql

my workflow modification log

我直接使用非官方的 AliSQL image 來設定開發環境, 個人開發環境有幾個需求:

  1. 利用 Dropbox 保持工作資料在多電腦同步
  2. 開發環境帳密和生產環境使用的帳密不同
  3. 絕不透過 root 來存取 MySQL 資料

Setup working folder on Dropbox

關於第一個需求, 可把 alisql 的 data/log/config 等資料夾建立在 Dropbox 資料夾下即可.

1
2
3
mkdir ~/Dropbox/project/DB/alisql/data
mkdir ~/Dropbox/project/DB/alisql/log
mkdir ~/Dropbox/project/DB/alisql/etc

接著把 alisql image 裡面的 my.cnf 複製到 etc 資料夾下.
Ref: Docker - copy file from container to host - Stack Overflow

1
docker cp <containerId>:/usr/local/mysql/etc/my.cnf ~/Dropbox/project/DB/etc/my.cnf

為了方便啟動與停止 container, 我另寫了幾個 shell scripts 放在 alisql 資料夾下.

1
2
3
4
5
6
7
8
export ALISQL_HOME="$KYWK_HOME/Dropbox/project/DB/alisql"

#run service
docker run --name alisql -d -p 3306:3306 \
-v $ALISQL_HOME/etc:/usr/local/mysql/etc \
-v $ALISQL_HOME/data:/data/mysql/data \
-v $ALISQL_HOME/log:/data/mysql/log \
496080199/alisql
1
docker container restart alisql
1
docker container stop alisql

Create default user

對於第二、三個設計需求, 新增一個 MySQL 使用者帳號即可.

這個 image 預設的 root 權限無法透過網路連線來 Grant 其他使用者權限. 可直接從 container 裡進行新增使用者. 或先從 container 裡把 root 權限打開, 再新增設定其他使用者.

為方便之後操作, 我選擇後者, 進入 container 把 root@%Grant_priv 打開.

1
2
3
4
5
$ docker exec -ti alisql mysql

# at mysql shell
mysql> GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

如此一來, 即可 root 在外部連線狀況下來新增修改使用者權限. 較通用於各種 MySQL Client 工具.

Ex: 新增管理使用者

1
$ mysql -h 127.0.0.1 -u root -p < kywk.sql

1
2
3
4
5
use mysql
INSERT INTO user (host, user, password) VALUES ('%','kywk',password('pw123456'));
GRANT ALL ON *.* TO 'kywk'@localhost IDENTIFIED BY 'pw123456' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'kywk'@'%' IDENTIFIED BY 'pw123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

[% div surf %]

Reference

[% enddiv %]