[root@XSMM-WEB mk_mariadb]# cat mariadb-func.sh
#!/bin/sh
#########################################################
# 循环检测数据库进程是否正常启动、服务是否可用 #
#########################################################
function wait_for_db() {
set +e
echo "等待数据库启动..."
while true; do
if grep "ready for connections" $ERROR_LOG; then
break;
else
echo "继续等待数据库启动完成..." && sleep 1
fi
done
set -e
}
#########################################################
# 关闭数据库进程
#########################################################
function terminate_db() {
local pid=$(cat $VOLUME_HOME/mysql.pid)
echo "捕获进程信号&关闭数据库进程..."
kill -TERM $pid
while true; do
if tail $ERROR_LOG | grep -s -E "mysqld .+? ended" $ERROR_LOG; then
break;
else sleep 0.5;
fi
done
}
#########################################################
#如果数据目录为空,调用 mysql_install_db 脚本生成默认库
# 全局变量:
# $VOLUME_HOME
# $ERROR_LOG
#########################################################
function install_db() {
if [ ! -d $VOLUME_HOME/mysql ]; then
echo "=> 数据目录 $VOLUME_HOME为空,数据库未初始化..."
echo "=> 正在安装 MariaDB..."
mysql_install_db --user=mysql > /dev/null 2>&1
echo "=> MariaDB 安装完成!"
else
echo "=> 使用已经存在数据目录文件."
fi
#########################################################
# 移除之前容器运行留下的日志文件,保留当前容器生成的日志
#########################################################
if [ -f $ERROR_LOG ]; then
echo "----------------- Previous error log -----------------"
tail -n 20 $ERROR_LOG
echo "----------------- Previous error log ends -----------------" && echo
mv -f $ERROR_LOG "${ERROR_LOG}.old";
fi
touch $ERROR_LOG && chown mysql $ERROR_LOG
}#########################################################
# 创建用户
# 变量:
# $MARIADB_USER
# $MARIADB_PASS
#########################################################
function create_mysql_user() {
echo "Creating DB admin user..." && echo
local users=$(mysql -s -e "SELECT count(User) FROM mysql.user WHERE User='$MARIADB_USER'")
if [[ $users == 0 ]]; then
echo "=> Creating MariaDB user '$MARIADB_USER' with '$MARIADB_PASS' password."
mysql -uroot -e "CREATE USER '$MARIADB_USER'@'%' IDENTIFIED BY '$MARIADB_PASS'"
else
echo "=> User '$MARIADB_USER' exists, updating its password to '$MARIADB_PASS'"
mysql -uroot -e "SET PASSWORD FOR '$MARIADB_USER'@'%' = PASSWORD('$MARIADB_PASS')"
fi;
mysql -uroot -e "GRANT ALL PRIVILEGES ON *.* TO '$MARIADB_USER'@'%' WITH GRANT OPTION"
echo "========================================================================"
echo " 可以使用以下命令连接 MariaDB Server: "
echo " mysql -u$MARIADB_USER -p$MARIADB_PASS -h<host> "
echo " "
echo " 出于安全考虑,应该修改上述密码,root可以在本地无密码登陆建议设置密码 "
echo "========================================================================"
}#########################################################
# 显示数据库状态
#########################################################
function show_db_status() {
echo "Showing DB status..." && echo
mysql -uroot -e "status"
}
#########################################################
# 清理数据库,删除test库和无密码用户
#########################################################
function secure_and_tidy_db() {
echo "删除test库和无密码用户..."
mysql -uroot -e "DROP DATABASE IF EXISTS test"
mysql -uroot -e "DELETE FROM mysql.user where User = ''"
#########################################################
# 设置root用户只能从本地登陆
#########################################################
mysql -uroot -e "DELETE FROM mysql.user where User = 'root' AND Host NOT IN ('127.0.0.1','::1')"
mysql -uroot -e "DELETE FROM mysql.proxies_priv where User = 'root' AND Host NOT IN ('127.0.0.1','::1')"
echo "设置root用户只能从本地登陆完成!"
}
[root@XSMM-WEB mk_mariadb]# cat run.sh
#!/bin/bash
set -e
set -u
source ./mariadb-func.sh
# 用户指定数据库用户名,不提供默认为mysql,并随机生成密码
MARIADB_USER=${MARIADB_USER:="mysql"}
MARIADB_PASS=${MARIADB_PASS:-$(pwgen -s 12 1)}
# 指定其它必要环境变量
VOLUME_HOME="/var/lib/mysql"
ERROR_LOG="$VOLUME_HOME/$HOSTNAME.err"
MYSQLD_PID_FILE="$VOLUME_HOME/$HOSTNAME.pid"
# Trap INT and TERM signals to do clean DB shutdown
trap terminate_db SIGINT SIGTERM
#调用install_db函数
install_db
# 输出所有信息到终端
tail -F $ERROR_LOG &
#将数据库启动到后台运行并记录PID
/usr/bin/mysqld_safe &
MYSQLD_SAFE_PID=$!
wait_for_db
secure_and_tidy_db
show_db_status
create_mysql_user
#不在终止这个脚本直到数据库进程mysqld_safe正常退出
wait $MYSQLD_SAFE_PID
[root@XSMM-WEB mk_mariadb]# cat mariadb.repo
# MariaDB 10.1 CentOS repository list - created 2016-01-06 02:19 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1 #创建镜像
[root@XSMM mk_mariadb]# docker build -t mariadb10 .
#docker run --name mydb -d -p 3306:3306 -v /mydata/mysql/:/var/lib/mysql mariadb10
...
---> Running in 35b0398fbeb8
---> d353c6e1e33b
Removing intermediate container 35b0398fbeb8
Step 12 : CMD /run.sh
---> Running in 7248c5e14559
---> 538b64e6987d
Removing intermediate container 7248c5e14559
Successfully built 538b64e6987d [root@XSMM]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb10 latest 538b64e6987d 4 minutes ago 1.111 GB
centos7-ssh latest 104c3f5a710c 7 days ago 504.1 MB
centos6 latest ba7961b610e2 7 days ago 194.6 MB
docker.io/tomcat latest 3c90608ca58a 8 days ago 357.4 MB
docker.io/centos/redis latest a4b79297fc55 2 weeks ago 405.6 MB
docker.io/centos latest 970633036444 5 weeks ago 196.7 MB #从镜像生成一个mariadb容器
[root@XSMM]# docker run --name mydb -d -p 3306:3306 -v /mydata/mysql/:/var/lib/mysql mariadb10
7eb4b284406bfb497ee0addf8cda153ab91013f3f9fc3357d856c68ea8a6e658
#查看容器日志
[root@XSMM]# docker logs mydb
=> 使用已经存在数据目录文件.
等待数据库启动...
继续等待数据库启动完成...
160910 01:07:05 mysqld_safe Logging to '/var/lib/mysql/7eb4b284406b.err'.
160910 01:07:05 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
...
2016-09-10 1:07:06 139756268353664 [Note] /usr/sbin/mysqld: ready for connections.
Version: '10.1.17-MariaDB' socket: '/var/lib/mysql/mysql.sock' port: 3306 MariaDB Server
2016-09-10 1:07:06 139756268353664 [Note] /usr/sbin/mysqld: ready for connections.
删除test库和无密码用户...
设置root用户只能从本地登陆完成!
Showing DB status...
Creating DB admin user...
=> Creating MariaDB user 'mysql' with 'tMEpSbAy0lIK' password.
========================================================================
可以使用以下命令连接 MariaDB Server:
mysql -umysql -ptMEpSbAy0lIK -h<host>
出于安全考虑,应该修改上述密码,root可以在本地无密码登陆建议设置密码
======================================================================== [root@XSMM]# mysql -umysql -ptMEpSbAy0lIK
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) #连接数据测试
[root@XSMM]# mysql --protocol=tcp -umysql -ptMEpSbAy0lIK
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.1.17-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)
MariaDB [(none)]>