• docker mysql


    MySQL环境变量:https://hub.docker.com/r/mysql/mysql-server/

    详见上述官方链接,个人觉得比较有用的是几个启动Docker时可以带上的数据库初始化参数:

    #设置监听地址,默认只有本机可连接,可设为%使得所有客户端均可连
    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

    使用示例:

    #!/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并执行之(当然也可以在启动时挂载进去从而省去手动复制,不过挂载要求源文件所在目录的绝对路径,麻烦点),如下:

    //值得注意的是这种手动执行脚本的方法要求在启动完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 目录下,容器创建时会自动执行该目录下的脚本。

    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. 

    dump mysql through docker:

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

    完整脚本:

      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/:构建、连接、环境变量、初始化、数据存储等

  • 相关阅读:
    进程池-非阻塞式
    进程
    单例模式
    Python内置函数之open()
    Python内置函数之len()
    Python内置函数之isinstance()
    Python内置函数之input()
    可迭代对象,迭代器(生成器)区别
    Tomcat控制台输出
    Python内置函数之format()
  • 原文地址:https://www.cnblogs.com/z-sm/p/9400353.html
Copyright © 2020-2023  润新知