#!/bin/bash # MySQL Docker 自动安装脚本 # 使用镜像: 根据网络环境自动选择官方或第三方镜像 ############################################################################### # 版权声明 # 该脚本由X博客"xblog.tech"编写与维护 # 版权所有 (c) 2025 X博客. 保留所有权利. # 未经许可,不得擅自复制、修改或发布本脚本 ############################################################################### set -e # 遇到错误立即退出 # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # 无颜色 # 彩色输出函数 color_echo() { local color=$1 shift echo -e "${color}$*${NC}" } # 检查并安装curl(如果需要) check_and_install_curl() { if ! command -v curl &> /dev/null; then color_echo $YELLOW "检测到系统未安装curl,正在尝试安装..." # 根据不同的包管理器尝试安装curl if command -v apt-get &> /dev/null; then color_echo $BLUE "使用apt-get安装curl..." sudo apt-get update && sudo apt-get install -y curl elif command -v yum &> /dev/null; then color_echo $BLUE "使用yum安装curl..." sudo yum install -y curl elif command -v dnf &> /dev/null; then color_echo $BLUE "使用dnf安装curl..." sudo dnf install -y curl elif command -v apk &> /dev/null; then color_echo $BLUE "使用apk安装curl..." sudo apk add curl else color_echo $RED "无法自动安装curl,请手动安装后再运行此脚本" color_echo $YELLOW "您可以运行以下命令之一来安装curl:" color_echo $CYAN " Ubuntu/Debian: sudo apt-get install curl" color_echo $CYAN " CentOS/RHEL: sudo yum install curl" color_echo $CYAN " Fedora: sudo dnf install curl" color_echo $CYAN " Alpine: sudo apk add curl" exit 1 fi # 验证安装是否成功 if command -v curl &> /dev/null; then color_echo $GREEN "✓ curl安装成功" else color_echo $RED "✗ curl安装失败,请手动安装后再运行此脚本" exit 1 fi else color_echo $GREEN "✓ 系统已安装curl" fi echo "" } color_echo $PURPLE "=== MySQL 8.0.44 Docker 自动安装脚本 ===" echo "" # 检查Docker是否安装 if ! command -v docker &> /dev/null; then color_echo $RED "错误: Docker 未安装,请先安装Docker" color_echo $YELLOW "安装Docker的参考命令:" color_echo $CYAN " curl -fsSL https://get.docker.com -o get-docker.sh" color_echo $CYAN " sudo sh get-docker.sh" exit 1 fi color_echo $GREEN "✓ Docker 已安装" echo "" # 检查并确保curl已安装 check_and_install_curl # 网络环境检测和镜像选择 color_echo $BLUE "检测网络环境..." OFFICIAL_IMAGE="library/mysql:8.0.44" THIRD_PARTY_IMAGE="docker.1ms.run/library/mysql:8.0.44" # 检测是否能够访问Docker Hub check_network() { color_echo $BLUE "正在测试网络连接..." # 尝试访问Docker Hub if curl --connect-timeout 10 -s https://hub.docker.com/ > /dev/null; then color_echo $GREEN "✓ 可以访问 Docker Hub" return 0 else color_echo $YELLOW "✗ 无法访问 Docker Hub" return 1 fi } # 选择镜像源 select_image_source() { if check_network; then MYSQL_IMAGE=$OFFICIAL_IMAGE color_echo $GREEN "将使用官方镜像: $MYSQL_IMAGE" else echo "" color_echo $YELLOW "⚠️ ⚠️ ⚠️ 安全提示 ⚠️ ⚠️ ⚠️" color_echo $RED "您即将调用第三方镜像源进行容器的创建,在此之前请您确认您信任该镜像的来源" color_echo $YELLOW "镜像来源: \"毫秒镜像 1ms.run/r/library/mysql\"" echo "" color_echo $CYAN "若您同意使用该镜像请您输入 y 确认: " read -p "确认使用第三方镜像 (y/N): " CONFIRM_THIRD_PARTY if [[ $CONFIRM_THIRD_PARTY =~ ^[Yy]$ ]]; then MYSQL_IMAGE=$THIRD_PARTY_IMAGE color_echo $GREEN "将使用第三方镜像: $MYSQL_IMAGE" else color_echo $YELLOW "安装已取消" exit 0 fi fi echo "" } # 执行镜像源选择 select_image_source # 交互式获取用户输入 color_echo $PURPLE "请配置MySQL安装参数(可直接回车使用默认值)" color_echo $CYAN "==========================================" # 容器名称 read -p "$(color_echo $BLUE '1. 输入容器名称') [$(color_echo $GREEN '默认: mysql-8.0.44')]: " CONTAINER_NAME CONTAINER_NAME=${CONTAINER_NAME:-"mysql-8.0.44"} # MySQL root密码 while true; do read -s -p "$(color_echo $BLUE '2. 输入MySQL root密码 (输入将隐藏)') : " MYSQL_ROOT_PASSWORD echo if [ -z "$MYSQL_ROOT_PASSWORD" ]; then color_echo $RED "错误: Root密码不能为空,请重新输入" continue fi read -s -p "$(color_echo $BLUE '请再次确认root密码') : " MYSQL_ROOT_PASSWORD_CONFIRM echo if [ "$MYSQL_ROOT_PASSWORD" != "$MYSQL_ROOT_PASSWORD_CONFIRM" ]; then color_echo $RED "错误: 两次输入的密码不一致,请重新输入" else break fi done # 端口号 read -p "$(color_echo $BLUE '3. 输入MySQL映射端口') [$(color_echo $GREEN '默认: 3306')]: " MYSQL_PORT MYSQL_PORT=${MYSQL_PORT:-"3306"} # 检查端口是否被占用 if command -v lsof &> /dev/null; then if lsof -Pi :$MYSQL_PORT -sTCP:LISTEN -t >/dev/null ; then color_echo $YELLOW "警告: 端口 $MYSQL_PORT 已被占用,请选择其他端口" read -p "$(color_echo $BLUE '输入新的MySQL映射端口'): " MYSQL_PORT fi else color_echo $YELLOW "注意: 无法检查端口占用情况(lsof未安装),请确保端口 $MYSQL_PORT 可用" fi # 数据目录 read -p "$(color_echo $BLUE '4. 输入数据存储目录') [$(color_echo $GREEN '默认: /docker/mysql/data')]: " DATA_DIR DATA_DIR=${DATA_DIR:-"/docker/mysql/data"} # 配置目录 read -p "$(color_echo $BLUE '5. 输入配置存储目录') [$(color_echo $GREEN '默认: /docker/mysql/conf')]: " CONF_DIR CONF_DIR=${CONF_DIR:-"/docker/mysql/conf"} # 显示配置摘要 echo "" color_echo $PURPLE "=== 安装配置摘要 ===" color_echo $CYAN "容器名称: $CONTAINER_NAME" color_echo $CYAN "MySQL 端口: $MYSQL_PORT" color_echo $CYAN "数据目录: $DATA_DIR" color_echo $CYAN "配置目录: $CONF_DIR" color_echo $CYAN "使用镜像: $MYSQL_IMAGE" color_echo $CYAN "Root密码: ******" echo "" color_echo $YELLOW "注意: 此安装只创建root用户,不创建额外数据库和用户" echo "" # 确认安装 read -p "$(color_echo $BLUE '是否继续安装?(y/n)') [$(color_echo $GREEN '默认: y')]: " CONFIRM_INSTALL CONFIRM_INSTALL=${CONFIRM_INSTALL:-"y"} if [[ ! $CONFIRM_INSTALL =~ ^[Yy]$ ]]; then color_echo $YELLOW "安装已取消" exit 0 fi echo "" color_echo $GREEN "开始安装 MySQL 8.0.44..." echo "" # 创建数据目录和配置目录 color_echo $BLUE "创建数据目录..." sudo mkdir -p $DATA_DIR sudo mkdir -p $CONF_DIR sudo chmod -R 755 $DATA_DIR sudo chmod -R 755 $CONF_DIR color_echo $GREEN "✓ 目录创建完成: $DATA_DIR, $CONF_DIR" # 拉取MySQL镜像 color_echo $BLUE "拉取 MySQL 镜像: $MYSQL_IMAGE" docker pull $MYSQL_IMAGE color_echo $GREEN "✓ MySQL 镜像拉取完成" # 创建自定义配置文件 color_echo $BLUE "创建MySQL配置文件..." sudo tee $CONF_DIR/my.cnf > /dev/null << EOF [mysqld] default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci max_connections=1000 innodb_buffer_pool_size=256M [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 EOF color_echo $GREEN "✓ 配置文件创建完成" # 停止并删除已存在的同名容器(如果存在) if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then color_echo $YELLOW "发现已存在的容器,停止并删除..." docker stop $CONTAINER_NAME docker rm $CONTAINER_NAME color_echo $GREEN "✓ 旧容器已清理" fi # 运行MySQL容器(只设置root密码) color_echo $BLUE "启动 MySQL 容器..." docker run -d \ --name $CONTAINER_NAME \ --restart=unless-stopped \ -p $MYSQL_PORT:3306 \ -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ -v $DATA_DIR:/var/lib/mysql \ -v $CONF_DIR:/etc/mysql/conf.d \ $MYSQL_IMAGE color_echo $GREEN "✓ MySQL 容器启动完成" # 等待MySQL启动 color_echo $BLUE "等待MySQL服务启动..." for i in {1..30}; do if docker logs $CONTAINER_NAME 2>&1 | grep -q "Ready for start up"; then color_echo $GREEN "✓ MySQL 启动完成" break fi color_echo $YELLOW "等待MySQL启动... ($i/30)" sleep 2 done # 检查容器状态 if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then color_echo $GREEN "✓ MySQL 容器正在运行" # 测试连接 color_echo $BLUE "测试MySQL连接..." sleep 5 if docker exec $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT 1;" &> /dev/null; then color_echo $GREEN "✓ MySQL 连接测试成功" # 显示默认数据库 color_echo $BLUE "默认数据库列表:" docker exec $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW DATABASES;" else color_echo $YELLOW "⚠️ MySQL 连接测试失败,请检查日志" docker logs $CONTAINER_NAME fi else color_echo $RED "❌ MySQL 容器启动失败" docker logs $CONTAINER_NAME exit 1 fi # 显示安装完成信息 echo "" color_echo $PURPLE "=== MySQL 安装完成 ===" color_echo $GREEN "容器名称: $CONTAINER_NAME" color_echo $GREEN "MySQL 版本: 8.0.44" color_echo $GREEN "连接地址: 127.0.0.1:$MYSQL_PORT" color_echo $GREEN "数据目录: $DATA_DIR" color_echo $GREEN "配置目录: $CONF_DIR" color_echo $GREEN "使用镜像: $MYSQL_IMAGE" color_echo $GREEN "Root 用户: root" echo "" color_echo $CYAN "管理命令:" color_echo $BLUE "查看日志: docker logs $CONTAINER_NAME" color_echo $BLUE "进入容器: docker exec -it $CONTAINER_NAME bash" color_echo $BLUE "连接MySQL: docker exec -it $CONTAINER_NAME mysql -uroot -p" color_echo $BLUE "停止容器: docker stop $CONTAINER_NAME" color_echo $BLUE "启动容器: docker start $CONTAINER_NAME" echo "" # 保存配置信息到文件(可选) CONFIG_FILE="./mysql_install_${CONTAINER_NAME}.info" cat > $CONFIG_FILE << EOF MySQL 安装配置信息 安装时间: $(date) 容器名称: $CONTAINER_NAME MySQL 版本: 8.0.44 连接端口: $MYSQL_PORT 数据目录: $DATA_DIR 配置目录: $CONF_DIR 使用镜像: $MYSQL_IMAGE Root 密码: $MYSQL_ROOT_PASSWORD EOF color_echo $GREEN "配置信息已保存到: $CONFIG_FILE" color_echo $YELLOW "请注意妥善保管此文件,特别是密码信息!" echo "" color_echo $CYAN "安装后建议操作:" color_echo $BLUE "1. 登录MySQL后创建所需的数据库和用户" color_echo $BLUE "2. 根据需求调整MySQL配置" color_echo $BLUE "3. 考虑设置定期备份策略" ############################################################################### # 版权声明 # 该脚本由X博客"xblog.tech"编写与维护 # 版权所有 (c) 2025 X博客. 保留所有权利. # 未经许可,不得擅自复制、修改或发布本脚本 ###############################################################################