一、痛点切入:传统 MySQL 安装有多 “折磨”?
做开发或测试时,你是否遇到过这些问题:
- 环境依赖卡壳:CentOS/Ubuntu 依赖包版本冲突,装 libaio-dev、ncurses5 等耗时 1 小时 +
- 配置繁琐易错:手动改 my.cnf、设置字符集、授权远程访问,新手常漏配置导致连接失败
- 卸载不干净:传统安装残留配置文件,下次重装出现 “端口被占”“权限报错”
- 跨环境不兼容:开发机装的 MySQL,部署到测试服务器因系统差异需重新调试
而用Docker + 脚本部署,能解决所有痛点 —— 无需依赖、一键执行、5 分钟搞定,且可移植性拉满!
二、前置准备:3 分钟搭好基础环境
(一)必备工具清单
|
工具 |
作用 |
安装验证命令 |
|
Docker |
容器化运行 MySQL |
docker –version |
|
bash 脚本 |
自动化执行部署流程 |
bash –version |
|
curl/wget |
(可选)拉取配置文件 |
curl –version |
(二)Docker 快速安装(多系统适配)
如果未装 Docker,执行以下命令(复制即用):
# CentOS 7/8 安装Docker
sudo yum install -y yum-utils
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
sudo systemctl start docker && sudo systemctl enable docker
# Ubuntu 20.04/22.04 安装Docker
sudo apt update && sudo apt install -y docker.io
sudo systemctl start docker && sudo systemctl enable docker
# Windows/macOS 简化方案
# 直接安装Docker Desktop:
https://www.docker.com/products/docker-desktop/
三、核心实战:Docker + 脚本一键部署 MySQL
(一)Step1:编写部署脚本(完整代码)
创建deploy_mysql.sh文件,复制以下代码(含详细注释):
#!/bin/bash
# MySQL Docker一键部署脚本
# 作者:CSDN博主-XXX
# 功能:自动拉取镜像、创建容器、配置权限、验证连接
# 1. 定义可配置参数(根据需求修改)
MYSQL_VERSION=”8.0.36″ # MySQL版本(推荐8.0/LTS版)
MYSQL_PORT=”3306″ # 宿主机端口(避免冲突可改3307)
MYSQL_ROOT_PWD=”Root@123456″ # root密码(需符合复杂度)
MYSQL_DATA_DIR=”/data/mysql” # 数据存储目录(宿主机路径,避免容器删除丢失数据)
CONTAINER_NAME=”mysql8″ # 容器名称
# 2. 检查Docker是否运行
if ! systemctl is-active –quiet docker; then
echo “⚠️ Docker服务未启动,正在启动…”
sudo systemctl start docker
if [ $? -ne 0 ]; then
echo “❌ Docker启动失败,请检查Docker安装!”
exit 1
fi
fi
# 3. 创建数据目录(避免权限问题)
echo ” 正在创建数据存储目录:$MYSQL_DATA_DIR”
sudo mkdir -p $MYSQL_DATA_DIR
sudo chmod 775 $MYSQL_DATA_DIR
sudo chown $USER:$USER $MYSQL_DATA_DIR # 赋予当前用户权限
# 4. 拉取MySQL镜像(指定版本更稳定)
echo ” 正在拉取MySQL镜像:mysql:$MYSQL_VERSION”
docker pull mysql:$MYSQL_VERSION
if [ $? -ne 0 ]; then
echo “❌ 镜像拉取失败,尝试换国内源(如阿里云):”
docker pull registry.cn-hangzhou.aliyuncs.com/dockerhub-mirror/mysql:$MYSQL_VERSION
if [ $? -ne 0 ]; then
echo “❌ 国内源拉取也失败,请检查网络!”
exit 1
fi
fi
# 5. 停止并删除旧容器(避免端口冲突)
if docker ps -a | grep -q $CONTAINER_NAME; then
echo ” 发现旧容器$CONTAINER_NAME,正在删除…”
docker stop $CONTAINER_NAME && docker rm $CONTAINER_NAME
fi
# 6. 启动MySQL容器(核心命令,参数详解见下文)
echo ” 正在启动MySQL容器…”
docker run -d
–name $CONTAINER_NAME
-p $MYSQL_PORT:3306
-v $MYSQL_DATA_DIR:/var/lib/mysql
-v $
MYSQL_DATA_DIR/conf:/etc/mysql/conf.d # 挂载配置文件目录
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PWD
-e MYSQL_CHARSET=utf8mb4 # 默认字符集(支持emoji)
-e MYSQL_COLLATION=utf8mb4_unicode_ci
–restart=always # 开机自启
–privileged=true # 解决数据卷权限问题
mysql:$MYSQL_VERSION
# 7. 验证部署结果
echo ” 正在验证MySQL连接(等待3秒…)”
sleep 3
if docker exec -it $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PWD -e “select version();” > /dev/null 2>&1; then
echo “✅ MySQL部署成功!信息如下:”
echo ” 容器名称:$CONTAINER_NAME”
echo ” 访问地址:localhost:$MYSQL_PORT”
echo ” 用户名:root”
echo ” 密码:$MYSQL_ROOT_PWD”
echo ” 数据目录:$MYSQL_DATA_DIR”
else
echo “❌ MySQL连接失败,查看日志:docker logs $CONTAINER_NAME”
exit 1
fi
(二)Step2:执行脚本(3 步搞定)
- 保存脚本:将上述代码保存为deploy_mysql.sh(可通过vim deploy_mysql.sh编辑)
- 赋予权限:
chmod +x deploy_mysql.sh
- 一键执行(无需 sudo,脚本内已处理权限):
./deploy_mysql.sh
(三)Step3:验证部署(3 种方式)
- 容器内验证:
docker exec -it mysql8 mysql -uroot -pRoot@123456
# 成功后会进入MySQL命令行,显示”mysql>”
- 本地客户端连接:
# 安装mysql-client(可选)
sudo apt install mysql-client # Ubuntu
# 连接命令
mysql -h127.0.0.1 -P3306 -uroot -pRoot@123456
- 远程连接(如 Navicat):
- 主机:服务器 IP
- 端口:3306(脚本中配置的端口)
- 用户名:root
- 密码:Root@123456
四、关键解析:脚本核心参数为什么这么设?
|
参数 |
作用 |
避坑点 |
|
-v $DATA_DIR:/var/lib/mysql |
数据卷挂载 |
必须用宿主机路径,否则容器删除数据丢失 |
|
–restart=always |
开机自启 |
避免服务器重启后 MySQL 无法访问 |
|
–privileged=true |
解决数据卷权限问题 |
否则可能出现 “Permission denied” |
|
-e MYSQL_CHARSET |
预设字符集 |
避免后期改字符集导致数据乱码 |
|
-p 3306:3306 |
端口映射 |
宿主机端口冲突时,改前一个(如 3307) |
五、效率碾压:传统方式 VS Docker 脚本对比
|
对比维度 |
传统安装(源码 / RPM) |
Docker + 脚本部署 |
效率提升 |
|
环境依赖处理 |
手动装 10 + 依赖包 |
零依赖(Docker 搞定) |
100% |
|
安装耗时 |
20-30 分钟 |
3-5 分钟 |
80%+ |
|
配置复杂度 |
改 5 + 配置文件 |
脚本参数一键改 |
90% |
|
跨环境复用 |
需重新编译配置 |
脚本复制即用 |
100% |
|
卸载干净度 |
残留配置 / 数据 |
docker rm+删目录 |
100% |
六、避坑指南:90% 人会踩的 3 个坑
- 坑 1:端口被占用
- 症状:Bind for 0.0.0.0:3306 failed: port is already allocated
- 解决:改脚本中MYSQL_PORT为 3307/3308,或查占用进程并杀死:
netstat -tulpn | grep 3306 # 查占用进程
sudo kill -9 进程ID
- 坑 2:数据卷权限报错
- 症状:Permission denied: '/var/lib/mysql'
- 解决:脚本中已加–privileged=true,若仍报错,执行:
sudo chmod 777 /data/mysql # 临时赋权(生产环境可细化权限)
- 坑 3:远程连接失败
- 症状:Navicat 连接提示 “Access denied”
- 解决:MySQL 8.0 默认不允许远程 root 登录,需执行授权命令:
# 进入容器
docker exec -it mysql8 mysql -uroot -pRoot@123456
# 执行授权(允许所有IP访问,生产环境改具体IP)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';
FLUSH PRIVILEGES;
七、扩展优化:生产环境进阶配置
- 自定义 my.cnf:
在/data/mysql/conf目录创建my.cnf,添加性能配置(如缓冲区、连接数):
[mysqld]
max_connections=1000
innodb_buffer_pool_size=1G # 提议设为内存的50%
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
重启容器生效:docker restart mysql8
- 备份脚本:
搭配定时任务(crontab)自动备份数据,创建backup_mysql.sh:
#!/bin/bash
BACKUP_DIR=”/data/backup”
DATE=$(date +%Y%m%d_%H%M%S)
docker exec mysql8 mysqldump -uroot -pRoot@123456 –all-databases > $BACKUP_DIR/mysql_backup_$DATE.sql
echo “备份完成:$BACKUP_DIR/mysql_backup_$DATE.sql”
添加定时任务(每天凌晨 2 点执行):
crontab -e
# 加入一行:0 2 * * * /path/to/backup_mysql.sh
八、总结:Docker 部署 MySQL 的核心价值
用 “Docker + 脚本” 部署 MySQL,本质是将复杂环境封装为标准化容器,用脚本自动化消除人工操作误差。对开发者而言,无需再花几小时排依赖、改配置;对团队而言,脚本可共享,新人入职 5 分钟就能搭好 MySQL 环境,真正实现 “一次编写,处处运行”。
你在 MySQL 部署中遇到过哪些坑?欢迎评论区留言,我会补充针对性解决方案!
















暂无评论内容