docker mysql

MySQL環境變量:https://hub.docker.com/r/mysql/mysql-server/mysql

詳見上述官方連接,我的以爲比較有用的是幾個啓動Docker時能夠帶上的數據庫初始化參數:sql

#設置監聽地址,默認只有本機可鏈接,可設爲%使得全部客戶端都可連 MYSQL_ROOT_HOST #root密碼設置 MYSQL_ROOT_PASSWORD #指定密碼 MYSQL_ALLOW_EMPTY_PASSWORD #空密碼 MYSQL_RANDOM_ROOT_PASSWORD #隨機密碼,一次性,一段時間後過時 MYSQL_ONETIME_PASSWORD #docker啓動後建立初始數據庫 MYSQL_DATABASE #docker啓動後建立初始用戶,只對初始數據庫擁有全部權限 MYSQL_USER MYSQL_PASSWORD

使用示例:docker

#!/usr/bin/env bash set -o nounset set -o errexit set -o pipefail dbRootPwd=123 dbSensestudyDbName=sensestudydev dbSensestudyUsername=sensestudy dbSensestudyUserPwd="LKxx880)Hsens#estudyKSy8po4A" dbSensestudyDbSqlFilePath=dump.sql echo start mysql from docker ... docker run --name mysql_sensestudy -p 3307:3306 -d \ -e MYSQL_ROOT_PASSWORD=$dbRootPwd \ -e MYSQL_ROOT_HOST=% \ -e MYSQL_DATABASE=$dbSensestudyDbName \ -e MYSQL_USER=$dbSensestudyUsername \ -e MYSQL_PASSWORD=$dbSensestudyUserPwd \ mysql/mysql-server:5.7

echo start mysql from docker done.

初始化數據庫數據:數據庫

若在Docker啓動時指定了初始化的數據庫,此時若想同時初始化該數據庫裏的數據,能夠用Docker命令把sql腳本複製到Docker並執行之(固然也能夠在啓動時掛載進去從而省去手動複製,不過掛載要求源文件所在目錄的絕對路徑,麻煩點),以下:bash

//值得注意的是這種手動執行腳本的方法要求在啓動完Docker必定時間後才執行之由於MySQL沒初始化完成,不然會報連不上的錯誤。...在這上面費了好長時間
docker cp $dbSensestudyDbSqlFilePath $dockerMySQLInstanceName:/$dbSensestudyDbSqlFilePath
docker exec $dockerMySQLInstanceName /bin/sh -c "  mysql  -uroot -p$dbRootPwd   $dbSensestudyDbName  < /$dbSensestudyDbSqlFilePath "

更簡單的作法是把sql腳本所在目錄掛載到Docker的 /docker-entrypoint-initdb.d 目錄下,容器建立時會自動執行該目錄下的腳本。ide

it will execute files with extensions .sh.sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. ui

dump mysql through docker:spa

 $ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql rest

 

完整腳本:code

 1 #!/bin/bash  2 
 3 curCMD=$1
 4 
 5 # set -x  6 set -o nounset  7 set -o errexit  8 set -o pipefail  9 
 10 dockerMySQLInstanceName=mysql_sensestudy  11 dbPort=3307
 12 dbRootPwd=123
 13 dbSensestudyDbName=sensestudydev  14 dbSensestudyUsername=sensestudy  15 dbSensestudyUserPwd="xxx"
 16 dbSensestudyDbInitSqlFilePath=init.sql  17 
 18 
 19 #docker service is required  20 #echo check if docker service has started ...
 21 if [ ` systemctl is-active docker` != "active" ]; then ` systemctl start docker` ; fi  22 #echo docker service started  23 
 24 
 25 
 26 #建立容器  27 function createMySQL()
 28 {  29     echo create mysql from docker ...
 30 
 31     docker run  --name $dockerMySQLInstanceName -p $dbPort:3306 -d  \
 32     -e MYSQL_ROOT_PASSWORD=$dbRootPwd  \
 33     -e MYSQL_ROOT_HOST=%  \
 34     -e MYSQL_DATABASE=$dbSensestudyDbName  \
 35     -e MYSQL_USER=$dbSensestudyUsername  \
 36     -e MYSQL_PASSWORD=$dbSensestudyUserPwd  \
 37     -v  $PWD/mysql_data:/var/lib/mysql  \
 38     mysql/mysql-server:5.7 --character-set-server=utf8  39 
 40     echo create mysql from docker done.
 41 } # -v $PWD/mysql_script:/docker-entrypoint-initdb.d  42 
 43 
 44 #初始化Docker裏MySQL數據庫數據,也能夠把sql腳本所在目錄的絕對路徑掛載到/docker-entrypoint-initdb.d  45 function initMySQLData()
 46 {  47     echo init db data ...
 48     set -x  49 
 50     docker cp $dbSensestudyDbInitSqlFilePath $dockerMySQLInstanceName:/$dbSensestudyDbInitSqlFilePath  51     docker exec   $dockerMySQLInstanceName \
 52         /bin/sh -c "  mysql  -uroot -p$dbRootPwd   $dbSensestudyDbName  < /$dbSensestudyDbInitSqlFilePath "
 53    set +x  54 
 55     echo init db data done.
 56 }  57 
 58 
 59 
 60 #啓動MySQL容器,若不存在則建立容器並從sql腳本初始化數據  61 function start()
 62 {  63     echo start $dockerMySQLInstanceName on port $dbPort ...
 64 
 65     if [   "`docker ps -a|grep "$dockerMySQLInstanceName" `" = "" ]  66     then
 67  createMySQL  68         sleep 15
 69  initMySQLData  70     else
 71         docker container start $dockerMySQLInstanceName  72  fi  73 
 74      echo start $dockerMySQLInstanceName done.
 75 }  76 
 77 
 78 # 關閉容器  79 function stop()
 80 {  81     echo stop  $dockerMySQLInstanceName ...
 82     if [ "`docker container ls| grep ${dockerMySQLInstanceName}`" != "" ]  83     then
 84         docker container stop $dockerMySQLInstanceName  85  fi  86     echo stop  $dockerMySQLInstanceName done.
 87 }  88 
 89 
 90 # 刪除容器  91 function remove()
 92 {  93     # first stop  94  stop  95 
 96     # then remove  97     echo delete  $dockerMySQLInstanceName ...
 98     if [ "`docker ps -a| grep ${dockerMySQLInstanceName}`" != "" ]  99     then
100         docker container rm $dockerMySQLInstanceName 101  fi 102     echo delete  $dockerMySQLInstanceName done.
103 } 104 
105 function restart()
106 { 107  stop 108     sleep 2
109     start
110 } 111 
112 function status()
113 { 114     if [ "`docker container ls| grep ${dockerMySQLInstanceName}`" = "" ] 115     then
116         echo mysql container is not running.
117     else
118         echo `docker container ls| grep ${dockerMySQLInstanceName}` 119  fi 120 } 121 
122 
123 
124 if [ "$curCMD" = "start" ] 125 then
126   start
127 
128 elif [ "$curCMD" = "stop" ] 129 then
130  stop 131 
132 elif [ "$curCMD" = "restart" ] 133 then
134  restart 135 
136 elif [ "$curCMD" = "status" ] 137 then
138  status 139 
140 elif [ "$curCMD" = "remove" ] 141 then
142  remove 143 
144 
145 else
146   echo "error command: please use option: start|stop|restart|status|remove"
147 fi
View Code

 

 

更全面的內容:https://hub.docker.com/_/mysql/

 

參考資料:

https://hub.docker.com/r/mysql/mysql-server/:環境變量

https://hub.docker.com/_/mysql/:構建、鏈接、環境變量、初始化、數據存儲等

相關文章
相關標籤/搜索