#!/bin/bash
# Docker 安装 MariaDB 自动化脚本(含远程访问配置)
# 默认配置
CONTAINER_NAME="mariadb"
MYSQL_ROOT_PASSWORD="qiuping"
HOST_PORT=3306
DATA_DIR="/opt/mariadb/data"
CONFIG_DIR="/opt/mariadb/conf.d"
IMAGE_VERSION="mariadb:10.11"
ENABLE_REMOTE=false # 默认关闭远程访问
REMOTE_USER="yourusername"
REMOTE_PASSWD="yourpasswd"
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
--name)
CONTAINER_NAME="$2"
shift 2
;;
--password)
MYSQL_ROOT_PASSWORD="$2"
shift 2
;;
--port)
HOST_PORT="$2"
shift 2
;;
--data-dir)
DATA_DIR="$2"
shift 2
;;
--config-dir)
CONFIG_DIR="$2"
shift 2
;;
--image)
IMAGE_VERSION="$2"
shift 2
;;
--enable-remote) # 新增参数
ENABLE_REMOTE=true
shift
;;
*)
echo "未知参数: $1"
exit 1
;;
esac
done
# 检查 Docker 是否可用
if ! command -v docker &> /dev/null; then
echo "错误:Docker 未安装!"
exit 1
fi
# 创建数据目录和配置目录
mkdir -p "$DATA_DIR" "$CONFIG_DIR"
chmod 755 "$DATA_DIR" "$CONFIG_DIR"
# 拉取镜像
echo "正在拉取 MariaDB 镜像: $IMAGE_VERSION"
docker pull "$IMAGE_VERSION" || {
echo "镜像拉取失败!"
exit 1
}
# 检查端口占用
if netstat -tuln | grep ":$HOST_PORT " > /dev/null; then
echo "错误:端口 $HOST_PORT 已被占用!"
exit 1
fi
# 运行容器
echo "启动 MariaDB 容器..."
docker run -d \
--name "$CONTAINER_NAME" \
--restart unless-stopped \
-p "$HOST_PORT":3306 \
-e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" \
-v "$DATA_DIR":/var/lib/mysql \
-v "$CONFIG_DIR":/etc/mysql/conf.d \
"$IMAGE_VERSION" || {
echo "容器启动失败!"
exit 1
}
# 等待容器初始化
sleep 10
# 验证容器状态
if ! docker ps --filter "name=$CONTAINER_NAME" --format "{{.Status}}" | grep -q "Up"; then
echo "容器启动异常,查看日志:"
docker logs "$CONTAINER_NAME"
exit 1
fi
# 配置远程访问
if [ "$ENABLE_REMOTE" = true ]; then
echo "配置远程访问权限..."
docker exec -i "$CONTAINER_NAME" mysql -u root -p"$MYSQL_ROOT_PASSWORD" <<-EOF
-- 允许 root 远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD' WITH GRANT OPTION;
-- 创建新远程用户
CREATE USER '$REMOTE_USER'@'%' IDENTIFIED BY '$REMOTE_PASSWD';
GRANT ALL PRIVILEGES ON *.* TO '$REMOTE_USER'@'%';
FLUSH PRIVILEGES;
EOF
if [ $? -ne 0 ]; then
echo "错误:远程访问配置失败!"
exit 1
fi
fi
# 输出成功信息
cat << EOF
✅ MariaDB 已成功部署!
=======================
容器名称:$CONTAINER_NAME
访问端口:localhost:$HOST_PORT
管理员账号:root
管理员密码:$MYSQL_ROOT_PASSWORD
数据目录:$DATA_DIR
配置文件:$CONFIG_DIR
远程访问:$([ "$ENABLE_REMOTE" = true ] && echo "已启用" || echo "已禁用")
连接命令:
本地连接:mysql -h 127.0.0.1 -P $HOST_PORT -u root -p
容器内连接:docker exec -it $CONTAINER_NAME mysql -u root -p
EOF
if [ "$ENABLE_REMOTE" = true ]; then
echo -e "\n远程访问示例:"
echo "mysql -h [服务器IP] -P $HOST_PORT -u root -p"
echo "# 或使用新用户:mysql -h [服务器IP] -P $HOST_PORT -u $REMOTE_USER -p$REMOTE_PASSWD"
fi