冗长的废话就省略了,大家看到这篇博客,效果如标题所示,我将提供完整的脚本,并用 「保姆级」的详细步骤,给你提供一个快速搭建跨平台、可定制的 MySQL环境的解决方案。保证无论你是 Linux 服务器管理员、macOS 开发者,还是刚入门的新手,都能轻松上手!
一、环境准备:确认你的系统符合要求
1. 支持的系统列表
脚本兼容以下主流系统:
系统类型 | 具体版本/发行版 |
---|---|
Linux | Ubuntu 20.04+Debian 11+CentOS 7+Rocky Linux 9+AlmaLinux 9+Fedora 36+ |
macOS | macOS 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)
操作:
- 查看占用端口的进程:
lsof -i :3306
; - 终止进程:
sudo kill -9 1234
(替换1234
为实际 PID); - 重新运行脚本。
四、验证安装:确认环境可用
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 update
或sudo 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搭建,无需手动调整复杂配置。
现在就复制脚本,运行起来吧~ 遇到问题欢迎在评论区留言,我会帮你解决!