冗长的废话就省略了,大家看到这篇博客,效果如标题所示,我将提供完整的脚本,并用 「保姆级」的详细步骤,给你提供一个快速搭建跨平台、可定制的 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; then
DISTRO="ubuntu"
elif command -v yum &> /dev/null; then
# 兼容 CentOS/RHEL/Rocky Linux/AlmaLinux
DISTRO="centos"
elif command -v dnf &> /dev/null; then
# Fedora 或 RHEL 8+
DISTRO="fedora"
else
error_exit "不支持的 Linux 发行版(仅支持 Ubuntu/Debian/CentOS/RHEL/Rocky Linux/AlmaLinux/Fedora)"
fi
log "✅ 检测到 Linux 发行版:$DISTRO"
elif [[ "$OSTYPE" == "darwin"* ]]; then
# macOS 系统
DISTRO="macos"
log "✅ 检测到 macOS 系统"
else
error_exit "不支持的操作系统(仅支持 Linux/macOS)"
fi
}
install_docker() {
log "🔧 正在安装 Docker..."
case "$DISTRO" in
"ubuntu"|"debian")
# Ubuntu/Debian 安装 Docker
sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "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/null
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
;;
"centos"|"fedora")
# CentOS/RHEL/Rocky Linux/AlmaLinux/Fedora 安装 Docker
if command -v yum &> /dev/null; then
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
else
sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
fi
;;
esac
# 启动 Docker 并加入用户组(避免 sudo)
sudo systemctl enable --now docker
sudo 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" ]]; then
sudo chown -R 999:999 "$DATA_DIR" "$CONF_DIR" "$LOG_DIR"
fi
log "✅ 目录创建完成:$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秒,可环境变量覆盖
EOF
log "✅ 配置文件生成完成"
}
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" ]]; then
error_exit "容器状态异常(当前状态:$container_status),请查看日志:docker logs $CONTAINER_NAME"
fi
log "✅ 容器状态正常(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"* ]]; then
error_exit "连接失败:$test_result"
fi
log "✅ 连接成功!MySQL 版本:$(echo "$test_result" | awk '{print $2}')"
}
# ==================== 主流程 ====================
main() {
log "===== MySQL Docker 自动安装脚本 ====="
check_system
install_docker
pull_mysql_image
create_directories
generate_my_cnf
start_mysql_container
verify_service
test_connection
log "🎉 安装完成!以下是关键信息:"
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搭建,无需手动调整复杂配置。
现在就复制脚本,运行起来吧~ 遇到问题欢迎在评论区留言,我会帮你解决!
4870

被折叠的 条评论
为什么被折叠?



