冗长的废话就省略了,大家看到这篇博客,效果如标题所示,我将提供完整的脚本,并用 「保姆级」的详细步骤,给你提供一个快速搭建跨平台、可定制的 MySQL环境的解决方案。保证无论你是 Linux 服务器管理员、macOS 开发者,还是刚入门的新手,都能轻松上手!


一、环境准备:确认你的系统符合要求

1. 支持的系统列表

脚本兼容以下主流系统:

系统类型具体版本/发行版
LinuxUbuntu 20.04+Debian 11+CentOS 7+Rocky Linux 9+AlmaLinux 9+Fedora 36+
macOSmacOS 12+(Intel 芯片或 Apple Silicon 芯片均可)

2. 检查系统类型

在终端执行以下命令,确认你的系统类型:

uname -a  # Linux 输出示例:Linux ubuntu 5.15.0-78-generic #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023 x86_64# macOS 输出示例:Darwin macOS 14.0.0 #1 SMP PREEMPT_DYNAMIC Thu Jun 20 19:45:00 PDT 2024 x86_64

3. 安装必要依赖(Linux 专用)

Linux 系统需提前安装基础工具(macOS 已内置,无需操作):

Ubuntu/Debian
sudo apt update && sudo apt install -y curl gnupg2 software-properties-common
CentOS/RHEL/Rocky Linux/AlmaLinux
sudo yum install -y curl gnupg2 yum-utils device-mapper-persistent-data lvm2
Fedora
sudo dnf install -y curl gnupg2 dnf-plugins-core

二、复制脚本:一键自动化安装的核心

1. 复制完整脚本

将以下 完整脚本 复制到文本编辑器(如 nano、VS Code),保存为 install_mysql_docker.sh(注意后缀为 .sh)。

#!/bin/bash# ==================== 全局变量 ====================
MYSQL_VERSION="8.0"          # MySQL 版本(支持5.7/8.0/8.1,修改此值即可)
MYSQL_ROOT_PASSWORD="YourStrongPassword123!"  # root 密码(建议复杂)
MYSQL_PORT=3306              # 宿主机映射端口(避免与本地冲突)
DATA_DIR="/docker/mysql/data"       # 数据持久化目录(宿主机)
CONF_DIR="/docker/mysql/conf"       # 配置文件目录(宿主机)
LOG_DIR="/docker/mysql/logs"        # 日志目录(宿主机)
CONTAINER_NAME="mysql-auto"         # 容器名称
MYSQL_USER="app_user"             # 自定义普通用户
MYSQL_PASSWORD="AppPass456"         # 自定义普通用户密码# ==================== 函数定义 ====================
log() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}error_exit() {log "❌ 错误:$1"exit 1
}check_system() {log "🔍 检测当前系统..."if [[ "$OSTYPE" == "linux-gnu"* ]]; then# Linux 系统(细分发行版)if command -v apt &> /dev/null; thenDISTRO="ubuntu"elif command -v yum &> /dev/null; then# 兼容 CentOS/RHEL/Rocky Linux/AlmaLinuxDISTRO="centos"elif command -v dnf &> /dev/null; then# Fedora 或 RHEL 8+DISTRO="fedora"elseerror_exit "不支持的 Linux 发行版(仅支持 Ubuntu/Debian/CentOS/RHEL/Rocky Linux/AlmaLinux/Fedora)"filog "✅ 检测到 Linux 发行版:$DISTRO"elif [[ "$OSTYPE" == "darwin"* ]]; then# macOS 系统DISTRO="macos"log "✅ 检测到 macOS 系统"elseerror_exit "不支持的操作系统(仅支持 Linux/macOS)"fi
}install_docker() {log "🔧 正在安装 Docker..."case "$DISTRO" in"ubuntu"|"debian")# Ubuntu/Debian 安装 Dockersudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-commoncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullsudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io;;"centos"|"fedora")# CentOS/RHEL/Rocky Linux/AlmaLinux/Fedora 安装 Dockerif command -v yum &> /dev/null; thensudo yum install -y yum-utils device-mapper-persistent-data lvm2sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install -y docker-ce docker-ce-cli containerd.ioelsesudo dnf install -y dnf-plugins-coresudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.reposudo dnf install -y docker-ce docker-ce-cli containerd.iofi;;esac# 启动 Docker 并加入用户组(避免 sudo)sudo systemctl enable --now dockersudo usermod -aG docker "$USER"log "✅ Docker 安装完成,请重新登录或执行:newgrp docker"
}pull_mysql_image() {log "🔍 正在拉取 MySQL ${MYSQL_VERSION} 镜像..."local mysql_image="mysql:${MYSQL_VERSION}"docker pull "$mysql_image" || error_exit "镜像拉取失败(标签可能不存在),请检查 MySQL 版本是否正确"log "✅ 镜像拉取完成($mysql_image)"
}create_directories() {log "📂 正在创建目录结构..."mkdir -p "$DATA_DIR" "$CONF_DIR" "$LOG_DIR" || error_exit "目录创建失败"# 修复 Linux 下目录权限(容器内 MySQL 用户为 999:999)if [[ "$DISTRO" != "macos" ]]; thensudo chown -R 999:999 "$DATA_DIR" "$CONF_DIR" "$LOG_DIR"filog "✅ 目录创建完成:$DATA_DIR, $CONF_DIR, $LOG_DIR"
}generate_my_cnf() {local conf_file="${CONF_DIR}/my.cnf"log "📝 正在生成配置文件:$conf_file"cat <<EOF > "$conf_file"
[client]
default-character-set=utf8mb4[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+08:00'  # 北京时间
bind-address=0.0.0.0        # 允许远程连接
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock# 性能优化参数(根据宿主机内存调整)
innodb_buffer_pool_size=${INNODB_BUFFER_POOL_SIZE:-1G}  # 默认1G,可环境变量覆盖
max_connections=${MAX_CONNECTIONS:-500}                 # 默认500,可环境变量覆盖
innodb_flush_method=O_DIRECT                              # 直接IO(提升写入性能)
innodb_io_capacity=${INNODB_IO_CAPACITY:-2000}            # 默认2000,SSD建议4000+# 日志配置
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=${LONG_QUERY_TIME:-2}                     # 默认2秒,可环境变量覆盖
EOFlog "✅ 配置文件生成完成"
}start_mysql_container() {log "🚀 正在启动 MySQL 容器..."docker run -d \--name "$CONTAINER_NAME" \-p "${MYSQL_PORT}:3306" \-v "$DATA_DIR:/var/lib/mysql" \-v "$CONF_DIR/my.cnf:/etc/mysql/conf.d/my.cnf" \-v "$LOG_DIR:/var/log/mysql" \-e MYSQL_ROOT_PASSWORD="$MYSQL_ROOT_PASSWORD" \-e MYSQL_DATABASE="test_db" \-e MYSQL_USER="$MYSQL_USER" \-e MYSQL_PASSWORD="$MYSQL_PASSWORD" \--restart unless-stopped \mysql:"${MYSQL_VERSION}" || error_exit "容器启动失败"log "✅ 容器启动完成(名称:$CONTAINER_NAME,端口:$MYSQL_PORT)"
}verify_service() {log "🔍 正在验证服务状态..."local container_status=$(docker ps -f name="$CONTAINER_NAME" --format "{{.Status}}")if [[ "$container_status" != "Up" ]]; thenerror_exit "容器状态异常(当前状态:$container_status),请查看日志:docker logs $CONTAINER_NAME"filog "✅ 容器状态正常(Running)"
}test_connection() {log "🔗 正在测试数据库连接..."local test_result=$(mysql -h 127.0.0.1 -P "$MYSQL_PORT" -u root -p"$MYSQL_ROOT_PASSWORD" -e "SELECT VERSION();" 2>&1)if [[ "$test_result" == *"ERROR"* ]]; thenerror_exit "连接失败:$test_result"filog "✅ 连接成功!MySQL 版本:$(echo "$test_result" | awk '{print $2}')"
}# ==================== 主流程 ====================
main() {log "===== MySQL Docker 自动安装脚本 ====="check_systeminstall_dockerpull_mysql_imagecreate_directoriesgenerate_my_cnfstart_mysql_containerverify_servicetest_connectionlog "🎉 安装完成!以下是关键信息:"log "  - 容器名称:$CONTAINER_NAME"log "  - 宿主机端口:$MYSQL_PORT"log "  - root 密码:$MYSQL_ROOT_PASSWORD"log "  - 数据目录:$DATA_DIR"log "  - 连接命令:mysql -h 127.0.0.1 -P $MYSQL_PORT -u root -p"
}# 执行主流程
main

2. 脚本功能说明

这个脚本能帮你 一键完成 以下所有操作:

  • 自动检测系统类型(Linux/macOS)并安装对应版本的 Docker;
  • 拉取指定版本的 MySQL 官方镜像(支持 5.7/8.0/8.1);
  • 创建数据、配置、日志目录,并修复 Linux 下的权限问题;
  • 生成优化的 my.cnf 配置文件(含字符集、时区、慢查询日志等);
  • 启动 MySQL 容器并绑定宿主机端口;
  • 验证容器状态和数据库连接;
  • 输出关键信息(容器名称、端口、密码等)。

三、安装步骤

步骤1:保存并赋予脚本权限

将上面的脚本复制到本地后,执行以下命令赋予执行权限:

chmod +x install_mysql_docker.sh

步骤2:运行脚本

在终端输入以下命令,启动自动化安装流程:

./install_mysql_docker.sh

步骤3:等待安装完成

脚本运行时会输出详细日志,无需手动操作,但需注意以下可能出现的提示:

场景1:Docker 未安装

脚本会自动安装 Docker,过程中可能提示:

🔧 正在安装 Docker...
正在处理时可能会询问是否继续(输入 'y' 确认)。

操作:按 Enter 键确认默认选项即可。

场景2:数据目录权限问题(Linux)

若脚本检测到 Linux 数据目录权限异常,会提示:

⚠️ 检测到 Linux 数据目录权限异常,尝试手动修复...

操作:按提示执行 sudo chown -R 999:999 /docker/mysql/data 后重新运行脚本。

场景3:端口冲突(所有系统)

若 3306 端口被占用,脚本会提示:

❌ 错误:端口 3306 被占用(进程 PID=1234)

操作

  1. 查看占用端口的进程:lsof -i :3306
  2. 终止进程:sudo kill -9 1234(替换 1234 为实际 PID);
  3. 重新运行脚本。

四、验证安装:确认环境可用

1. 检查容器状态

运行以下命令,确认 MySQL 容器处于「运行中」状态:

docker ps -f name=mysql-auto

预期输出

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES
a1b2c3d4e5f6   mysql:8.0      "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes    0.0.0.0:3306->3306/tcp   mysql-auto

2. 连接 MySQL 数据库

使用以下命令连接(输入脚本设置的 MYSQL_ROOT_PASSWORD):

mysql -h 127.0.0.1 -P 3306 -u root -pYourStrongPassword123!

3. 执行基础 SQL 验证

连接成功后,执行以下命令确认数据库可用:

-- 查看 MySQL 版本(应显示你设置的版本,如 8.0.36)
SELECT VERSION();-- 创建测试库(无报错即成功)
CREATE DATABASE test_db;-- 切换到测试库
USE test_db;-- 创建测试表并插入数据
CREATE TABLE demo (id INT, name VARCHAR(20));
INSERT INTO demo VALUES (1, 'Hello MySQL');-- 查询数据(应返回刚插入的记录)
SELECT * FROM demo;

4. 验证数据持久化

即使删除容器,数据也不会丢失。测试步骤:

# 停止并删除容器
docker stop mysql-auto && docker rm mysql-auto# 重新启动容器(数据会自动加载)
docker run -d --name mysql-auto -p 3306:3306 -v /docker/mysql/data:/var/lib/mysql ...(其他参数同上)# 连接后查询数据(应仍存在)
mysql -h 127.0.0.1 -P 3306 -u root -pYourStrongPassword123 -e "SELECT * FROM test_db.demo;"

五、自定义配置:按需调整环境

1. 修改 MySQL 版本

若需切换 MySQL 版本(如 5.7),只需修改脚本中的 MYSQL_VERSION 变量:

sed -i 's/MYSQL_VERSION="8.0"/MYSQL_VERSION="5.7"/' install_mysql_docker.sh
./install_mysql_docker.sh

2. 调整容器端口

若 3306 端口被占用,可修改 MYSQL_PORT 变量(如改为 3307):

sed -i 's/MYSQL_PORT=3306/MYSQL_PORT=3307/' install_mysql_docker.sh
./install_mysql_docker.sh

3. 自定义数据目录

若需将数据存储到其他路径(如 /data/mysql),修改 DATA_DIR 变量:

sed -i 's/DATA_DIR="\/docker\/mysql\/data"/DATA_DIR="\/data\/mysql"/' install_mysql_docker.sh
./install_mysql_docker.sh

4. 调整性能参数(高级)

通过环境变量覆盖默认配置(无需修改脚本):

# 示例:调整缓冲池大小为2G,最大连接数为1000,慢查询阈值为3秒
export INNODB_BUFFER_POOL_SIZE=2G
export MAX_CONNECTIONS=1000
export LONG_QUERY_TIME=3
./install_mysql_docker.sh

六、常见问题与解决方案

问题1:Docker 安装失败(Linux)

现象:运行 install_docker 时提示「无法找到包」或「权限不足」。
解决方案

  • 确保已更新包索引(sudo apt updatesudo dnf check-update);
  • 检查网络连接,或手动下载 Docker 安装包(参考 https://docs.docker.com/get-docker/)。

问题2:容器启动失败(所有系统)

现象:脚本提示「容器启动失败」,日志显示「Error starting daemon」。
解决方案

  • 查看 Docker 日志:journalctl -u docker.service(Linux);
  • 重启 Docker 服务:sudo systemctl restart docker(Linux);
  • 检查磁盘空间(df -h),确保 /var/lib/docker 目录有足够空间。

问题3:远程连接失败(所有系统)

现象:其他设备连接 MySQL 提示「Connection refused」。
解决方案

  • 检查容器是否运行(docker ps);
  • 确认 bind-address=0.0.0.0 已在 my.cnf 中配置(脚本已自动添加);
  • 开放宿主机防火墙端口(如 sudo ufw allow 3306(Ubuntu)或 sudo firewall-cmd --add-port=3306/tcp --permanent(CentOS))。

总结

这篇博客从环境准备到验证,覆盖了 MySQL Docker 环境搭建的全流程,脚本支持主流 Linux 发行版和 macOS,兼容 MySQL 5.7/8.0/8.1 版本。无论你是新手还是运维人员,都能通脚本快速完成MySQL搭建,无需手动调整复杂配置。
现在就复制脚本,运行起来吧~ 遇到问题欢迎在评论区留言,我会帮你解决!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90839.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90839.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90839.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAC包头、IP包头 、UDP包头中的长度含义是啥?三者之间有啥区别?

以太网帧、IP包及TCP与UDP的报文格式 下面用通俗技术的方式详细解释&#xff1a; 1. MAC包头&#xff08;以太网帧头&#xff09;中的长度 字段名称&#xff1a;EtherType/Length位置&#xff1a;以太网帧头的第13、14字节含义&#xff1a; 如果值小于等于1500&#xff08;0x0…

Multiscale Structure Guided Diffusion for Image Deblurring 论文阅读

基于多尺度结构引导扩散模型的图像去模糊 摘要 扩散概率模型&#xff08;Diffusion Probabilistic Models, DPMs&#xff09;最近被用于图像去模糊&#xff0c;其被表述为一个以模糊输入为条件的图像条件生成过程&#xff0c;将高斯噪声映射到高质量图像。当在成对的域内数据上…

git 提交时排除一个或多个文件

前言 在提交文件时&#xff0c;总是有一些文件是不需要提交的&#xff0c;比如机器上的配置文件&#xff0c;日志文件等等&#xff0c;所以在提交时就需要排除这些文件&#xff1b; 第一种方案 git add file1 file2 比如我新添加了3个文件&#xff1a; file1.txt file2.txt fil…

OpenCV 入门:基础图像操作

在计算机视觉领域&#xff0c;OpenCV 无疑是最受欢迎的开源库之一。它由 Intel 公司俄罗斯团队发起&#xff0c;如今已成为处理图像和视频的强大工具。本文我会介绍OpenCV 的基础知识&#xff0c;从图像的读写显示到实时视频流处理&#xff0c;迈出计算机视觉的第一步。 目录 …

大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(3):使用云平台最小外部依赖方案

文章大纲 1 方案总览(与官方文档映射) 2 环境准备(一步完成) 3 数据层(零代码迁移 Excel → BigQuery 或 SQLite) 4 函数声明(JSON Schema 与官方示例一致) 5 Cloud Function(**最小外部依赖**) 6 客户端调用(对齐官方 Python 示例) 7 Token 与性能对比(官方计费口…

C++高效实现轨迹规划、自动泊车、RTS游戏、战术迂回包抄、空中轨迹、手术机器人、KD树

C++ 算法汇总 基于C++的城市道路场景 以下是基于C++的城市道路场景中车辆紧急变道轨迹生成的实现方法和示例代码。内容涵盖轨迹规划算法、数学建模及代码实现,适用于自动驾驶或驾驶辅助系统开发。 基于多项式曲线的轨迹生成 采用五次多项式(Quintic Polynomial)生成平滑…

电动汽车转向系统及其工作原理

电动汽车的转向系统作为电动汽车的一个关键系统&#xff0c;与燃油车的转向系统有着较大差异。电动汽车的转向系统主要分为 电动助力转向&#xff08;EPS, Electric Power Steering&#xff09; 、电动液压助力转向系统&#xff08;EHPS, Electro-Hydraulic Power Steering&…

TCP/IP 体系结构网络接口层的原理

TCP/IP 网络接口层详解 网络接口层&#xff08;Network Interface Layer&#xff09;是 TCP/IP 模型的最底层&#xff08;对应 OSI 模型的物理层 数据链路层&#xff09;&#xff0c;负责在物理网络中传输原始比特流&#xff0c;实现相邻设备之间的可靠数据传输。核心功能物理…

笔记本键盘的启用和禁用

管理员 打开 CMD&#xff1a;这一步要求以管理员权限打开命令提示符&#xff08;Command Prompt&#xff09;。在Windows系统中&#xff0c;可以通过搜索“cmd”&#xff0c;然后右键选择“以管理员身份运行”来实现。sc config i8042prt start disabled (关闭笔记本键盘)&…

vue3的一些浅显用法

1/ 父页面调用子页面相关需要在父页面引用 <FieldUserForm ref"userFormRef" success"handleUserFormSuccess" />其中 FieldUserForm 是子页面 success"handleUserFormSuccess" 是子页面成功后回调方法 父页面 实现 handleUserFormSucces…

C语言习题讲解-第五讲-循环编程练习等

C语言习题讲解-第五讲-循环编程练习等1. 关于一维数组描述不正确的是&#xff1a;( )2. 关于一维数组初始化&#xff0c;下面哪个定义是错误的&#xff1f;&#xff08; &#xff09;3. 定义了一维 int 型数组 a[10] 后&#xff0c;下面错误的引用是&#xff1a;&#xff08; &…

MongoDB索引及其原理

目录 索引原理 索引类型 单键索引 组合索引 特性索引 唯一索引 稀疏索引 部分索引 TTL索引 多键索引 文本索引 地理空间索引 哈希索引 总结 MongoDB 索引执行计划 索引原理 MongoDB索引的背后的原理和MySQL中的索引原理是差不多的,都是使用B数来对数据进行管理…

学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型

服务器/多客户端模型循环服务器 while(1){ accept(); recv(); } 适用于简单任务&#xff0c;如基础Web服务器&#xff0c;但无法处理并发请求。并发服务器 通过thread或fork实现多任务处理。需注意子进程/线程的资源回收&#xff0c;避免内存泄漏。多路IO模型服务器 使用select…

【Canvas与标牌】优质资产六角星标牌

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>优质资产六角星标记 Draft1</title><style type"text/cs…

扫雷游戏开发教程:从零打造精美像素扫雷

完整源码在本文结尾处一、游戏概述 扫雷是一款经典的益智游戏&#xff0c;玩家需要在不触发地雷的情况下揭开所有安全格子。本教程将带你从零开始开发一个具有精美界面和动画效果的扫雷游戏&#xff0c;包含难度选择、棋盘大小调整等高级功能。 二、游戏核心功能 三种难度级别&…

Linux驱动开发笔记(五)——设备树(上)

内容详见《【正点原子】I.MX6U嵌入式Linux驱动开发指南》四十三章 开发板&#xff1a;imx6ull mini 虚拟机&#xff1a;VMware17 ubuntu&#xff1a;ubuntu20.04 一、什么是设备树 视频&#xff1a;第6.1讲 Linux设备树详解-什么是设备树&#xff1f;_哔哩哔哩_bilibili 对…

【QT入门到晋级】window opencv安装及引入qtcreator(包含两种qt编译器:MSVC和MinGW)

前言 本文主要分享QT的两种编译器环境&#xff08;MSVC和MinGW&#xff09;下&#xff0c;安装及引入opencv的方法。 编译器区别 特性​​​​MSVC​​​​MinGW​​​​编译器类型​​微软专有编译器&#xff08;cl.exe&#xff09;基于GCC的开源工具链​​平台支持​​仅Wi…

字节跳动Coze Studio开源了!架构解析

Coze Studio 是字节跳动推出的一款 AI 应用开发平台&#xff0c;专注于帮助开发者快速构建、测试和部署基于大语言模型的智能应用。其整体架构围绕“低代码开发 AI 应用”的核心目标设计&#xff0c;融合了模型能力、工具集成、流程编排和多端部署等功能。以下是其整体架构的详…

Claude 4.0 终极编程指南:模型对比、API配置与IDE集成实战

Claude 4.0 终极编程指南&#xff1a;模型对比、API配置与IDE集成实战 基于官方文档及可验证数据源&#xff08;2025年7月更新&#xff09; 1 Claude 4.0 技术解析&#xff1a;对比竞品的核心优势与局限 1.1 官方性能数据&#xff08;来源&#xff1a;Anthropic技术白皮书&…

优化:Toc小程序猜你喜欢功能

引言&#xff1a;来自自创的小程序中热点接口&#xff0c;本小程序专为在校学生自提点餐使用 一、功能描述 该功能作为一个推荐的职责&#xff0c;根据用户最近行为给用户推荐用户可能喜欢去吃的店铺&#xff0c;可能比较简洁&#xff0c;但是需要设计的方面挺多的&#xff0c…