commit ca8006030c9e4c8aba22961d7fdb95a4bee22eef Author: 萧墨笙云 Date: Sat Nov 8 18:05:44 2025 +0800 上传文件至 mysql diff --git a/mysql/install-mysql8.0.44-docker.sh b/mysql/install-mysql8.0.44-docker.sh new file mode 100644 index 0000000..7987371 --- /dev/null +++ b/mysql/install-mysql8.0.44-docker.sh @@ -0,0 +1,347 @@ +#!/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博客. 保留所有权利. +# 未经许可,不得擅自复制、修改或发布本脚本 +############################################################################### \ No newline at end of file