详见上述官方链接,个人觉得比较有用的是几个启动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/envbash
set-o nounset
set-o errexit
set-o pipefail
dbRootPwd=123dbSensestudyDbName=sensestudydev
dbSensestudyUsername=sensestudy
dbSensestudyUserPwd="LKxx880)Hsens#estudyKSy8po4A"dbSensestudyDbSqlFilePath=dump.sqlechostart 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,.sqland.sql.gzthat 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/bash2
3 curCMD=$1
4
5 # set-x6 set-o nounset7 set-o errexit8 set-o pipefail9
10 dockerMySQLInstanceName=mysql_sensestudy11 dbPort=3307
12 dbRootPwd=123
13 dbSensestudyDbName=sensestudydev14 dbSensestudyUsername=sensestudy15 dbSensestudyUserPwd="xxx"
16 dbSensestudyDbInitSqlFilePath=init.sql17
18
19 #docker service is required20 #echo check if docker service has started ...
21 if [ ` systemctl is-active docker` != "active" ]; then ` systemctl start docker` ;fi22 #echodocker service started23
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=utf839
40 echo create mysql from docker done.
41 } # -v $PWD/mysql_script:/docker-entrypoint-initdb.d42
43
44 #初始化Docker里MySQL数据库数据,也可以把sql脚本所在目录的绝对路径挂载到/docker-entrypoint-initdb.d45 function initMySQLData()
46 {47 echo init db data ...
48 set-x49
50 docker cp $dbSensestudyDbInitSqlFilePath $dockerMySQLInstanceName:/$dbSensestudyDbInitSqlFilePath51 docker exec $dockerMySQLInstanceName \
52 /bin/sh -c " mysql -uroot -p$dbRootPwd $dbSensestudyDbName < /$dbSensestudyDbInitSqlFilePath "
53 set +x54
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 createMySQL68 sleep 15
69 initMySQLData70 else
71 docker container start $dockerMySQLInstanceName72 fi73
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 $dockerMySQLInstanceName85 fi86 echo stop $dockerMySQLInstanceName done.
87 }88
89
90 #删除容器91 function remove()
92 {93 #first stop94 stop95
96 # thenremove97 echo delete $dockerMySQLInstanceName ...
98 if [ "`docker ps -a| grep ${dockerMySQLInstanceName}`" != ""]99 then
100 docker container rm $dockerMySQLInstanceName101 fi102 echo delete $dockerMySQLInstanceName done.
103 }104
105 function restart()
106 {107 stop108 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 fi120 }121
122
123
124 if [ "$curCMD" = "start"]125 then
126 start
127
128 elif [ "$curCMD" = "stop"]129 then
130 stop131
132 elif [ "$curCMD" = "restart"]133 then
134 restart135
136 elif [ "$curCMD" = "status"]137 then
138 status139
140 elif [ "$curCMD" = "remove"]141 then
142 remove143
144
145 else
146 echo "error command: please use option: start|stop|restart|status|remove"
147 fi
View Code
参考资料: