Docker + 脚本一键部署 MySQL

一、痛点切入:传统 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 步搞定)

  1. 保存脚本:将上述代码保存为deploy_mysql.sh(可通过vim deploy_mysql.sh编辑)
  1. 赋予权限
chmod +x deploy_mysql.sh
  1. 一键执行(无需 sudo,脚本内已处理权限):
./deploy_mysql.sh

(三)Step3:验证部署(3 种方式)

  1. 容器内验证
docker exec -it mysql8 mysql -uroot -pRoot@123456

# 成功后会进入MySQL命令行,显示”mysql>”

  1. 本地客户端连接
# 安装mysql-client(可选)

sudo apt install mysql-client # Ubuntu

# 连接命令

mysql -h127.0.0.1 -P3306 -uroot -pRoot@123456

  1. 远程连接(如 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. 坑 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

  1. 坑 2:数据卷权限报错
    • 症状:Permission denied: '/var/lib/mysql'
    • 解决:脚本中已加–privileged=true,若仍报错,执行:
sudo chmod 777 /data/mysql # 临时赋权(生产环境可细化权限)
  1. 坑 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;

七、扩展优化:生产环境进阶配置

  1. 自定义 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

  1. 备份脚本

搭配定时任务(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 部署中遇到过哪些坑?欢迎评论区留言,我会补充针对性解决方案!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
多吃脆骨丸的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容