冗長的廢話就省略了,大家看到這篇博客,效果如標題所示,我將提供完整的腳本,并用 「保姆級」的詳細步驟,給你提供一個快速搭建跨平臺、可定制的 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搭建,無需手動調整復雜配置。
現在就復制腳本,運行起來吧~ 遇到問題歡迎在評論區留言,我會幫你解決!