当前位置: 首页 > news >正文

Docker 部署 MySQL 5.7

使用 Docker 部署 MySQL 5.7 完整教程(入门小白版)

前言

本教程将手把手教你使用 Docker 部署 MySQL 5.7 数据库,适合零基础的小白学习。我们会详细讲解每一个命令的作用,并提供优化后的生产环境配置文件。

环境要求

  • 操作系统:Linux(CentOS、Ubuntu 等)
  • 已安装 Docker(如未安装,请先安装 Docker)
  • 具备 root 权限或 sudo 权限

第一步:拉取 MySQL 5.7 镜像

首先,我们需要从 Docker Hub 下载 MySQL 5.7 的官方镜像。

docker pull mysql:5.7

命令解释:

  • docker pull:从 Docker Hub 下载镜像的命令
  • mysql:5.7:指定要下载的镜像名称和版本号

执行后效果:
你会看到下载进度条,等待下载完成即可。


第二步:创建目录结构

为了数据持久化和方便管理,我们需要在宿主机上创建三个目录:

  • data 目录:存储数据库数据文件
  • conf 目录:存储配置文件
  • logs 目录:存储日志文件

2.1 创建目录

mkdir -p /opt/wwwroot/mysql57/mysql/data
mkdir -p /opt/wwwroot/mysql57/mysql/conf
mkdir -p /opt/wwwroot/mysql57/mysql/logs

命令解释:

  • mkdir:创建目录的命令
  • -p:如果父目录不存在,则自动创建父目录
  • /opt/wwwroot/mysql57/mysql/:我们选择的存储路径(你可以根据需要修改)

2.2 设置目录权限

chmod -R 700 /opt/wwwroot/mysql57/mysql

命令解释:

  • chmod:修改文件权限的命令
  • -R:递归修改,包括所有子目录和文件
  • 700:权限设置,表示所有者可读、可写、可执行,其他人无任何权限

2.3 设置目录所有者

chown -R 999:999 /opt/wwwroot/mysql57/mysql

命令解释:

  • chown:修改文件所有者的命令
  • -R:递归修改
  • 999:999:用户 ID 和组 ID(MySQL 官方镜像默认使用 999 作为运行用户)

第三步:创建配置文件

现在我们要创建 MySQL 的配置文件,这个文件非常重要,它决定了数据库的性能和行为。

vim /opt/wwwroot/mysql57/mysql/conf/my.cnf

命令解释:

  • vim:文本编辑器(也可以用 nano 或其他编辑器)
  • 如果不熟悉 vim,按 i 进入编辑模式,编辑完成后按 Esc,然后输入 :wq 保存退出

优化后的配置文件内容

将以下内容复制粘贴到配置文件中:

[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
default-character-set = utf8mb4[mysqld]
# ==== 基础设置 ====
port = 3306
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
pid-file = /var/run/mysqld/mysqld.pid
user = mysql# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'# SQL 模式(严格模式,避免数据异常)
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO# 默认存储引擎
default_storage_engine = InnoDB# 时区设置(东八区)
default-time-zone = '+8:00'# ==== 网络与连接设置 ====
# 最大连接数
max_connections = 1000# 最大错误连接次数
max_connect_errors = 100# 最大数据包大小(避免大数据导入失败)
max_allowed_packet = 512M# 连接超时设置
wait_timeout = 28800
interactive_timeout = 28800
net_read_timeout = 120
net_write_timeout = 120# 跳过域名解析(提升连接速度)
skip-name-resolve# 跳过外部锁定
skip-external-locking# 打开文件数限制
open_files_limit = 65535# ==== 缓存与性能优化 ====
# 表缓存数量
table_open_cache = 2048# 线程缓存
thread_cache_size = 64# 线程栈大小
thread_stack = 256K# 临时表大小
tmp_table_size = 128M
max_heap_table_size = 128M# 排序缓冲区
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 2M# 查询缓存(MySQL 5.7 建议关闭,性能较差)
query_cache_type = OFF
query_cache_size = 0# ==== InnoDB 存储引擎优化 ====
# InnoDB 缓冲池大小(建议设置为物理内存的 50%-70%)
# 这里设置为 1G,请根据服务器内存调整
innodb_buffer_pool_size = 1G# 每个表独立表空间
innodb_file_per_table = 1# 日志文件大小
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M# 日志刷新策略(2 = 每秒刷新一次,性能较好,安全性略低)
innodb_flush_log_at_trx_commit = 2# 锁等待超时时间
innodb_lock_wait_timeout = 50# 脏页比例
innodb_max_dirty_pages_pct = 90# IO 线程数
innodb_read_io_threads = 4
innodb_write_io_threads = 4# ==== 二进制日志(用于主从复制和数据恢复)====
log-bin = mysql-bin
binlog_format = MIXED
server-id = 1
expire_logs_days = 10
binlog_cache_size = 32K# ==== 慢查询日志 ====
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 0# ==== 错误日志 ====
log-error = /var/log/mysql/error.log# ==== MyISAM 引擎设置(如果使用)====
key_buffer_size = 128M
myisam_sort_buffer_size = 64M[mysqldump]
quick
max_allowed_packet = 512M[mysql]
no-auto-rehash
default-character-set = utf8mb4[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 4M
read_buffer = 4M
write_buffer = 4M[mysqlhotcopy]
interactive-timeout

配置文件说明

关键参数解释:
  1. 字符集设置:使用 utf8mb4,支持完整的 Unicode 字符(包括 emoji)

  2. 连接数设置

    • max_connections = 1000:最大支持 1000 个并发连接
    • 根据服务器配置调整
  3. InnoDB 缓冲池

    • innodb_buffer_pool_size = 1G:这是最重要的参数
    • 建议设置为服务器物理内存的 50%-70%
    • 示例:8GB 内存服务器可设置为 4G-5G
  4. 日志刷新策略

    • innodb_flush_log_at_trx_commit = 2:每秒刷新一次
    • 如果对数据安全要求极高,改为 1(每次事务提交都刷新)
  5. 慢查询日志

    • long_query_time = 2:执行超过 2 秒的查询会被记录
    • 用于性能优化和问题排查

第四步:启动 MySQL 容器

现在万事俱备,我们可以启动 MySQL 容器了。

docker run -d \--name mysql57 \-e MYSQL_ROOT_PASSWORD='Your_Secure_Password_123' \-p 3309:3306 \-v /opt/wwwroot/mysql57/mysql/data:/var/lib/mysql \-v /opt/wwwroot/mysql57/mysql/conf:/etc/mysql/conf.d \-v /opt/wwwroot/mysql57/mysql/logs:/var/log/mysql \--restart unless-stopped \mysql:5.7

命令详细解释:

  • docker run:运行容器的命令
  • -d:后台运行(daemon 模式)
  • --name mysql57:给容器命名为 mysql57
  • -e MYSQL_ROOT_PASSWORD='Your_Secure_Password_123':设置 root 用户密码(请务必修改为强密码
  • -p 3309:3306:端口映射,宿主机 3309 端口映射到容器 3306 端口
    • 为什么用 3309?避免与宿主机可能存在的 MySQL 冲突
    • 外部连接时使用:服务器IP:3309
  • -v /opt/wwwroot/mysql57/mysql/data:/var/lib/mysql:数据目录挂载
  • -v /opt/wwwroot/mysql57/mysql/conf:/etc/mysql/conf.d:配置目录挂载
  • -v /opt/wwwroot/mysql57/mysql/logs:/var/log/mysql:日志目录挂载
  • --restart unless-stopped:容器自动重启策略(除非手动停止,否则总是重启)
  • mysql:5.7:使用的镜像名称

第五步:验证容器运行状态

5.1 查看容器是否运行

docker ps

你应该看到类似这样的输出:

CONTAINER ID   IMAGE       COMMAND                  STATUS         PORTS                    NAMES
xxxxxxxxxxxx   mysql:5.7   "docker-entrypoint.s…"   Up 10 seconds  0.0.0.0:3309->3306/tcp   mysql57

5.2 查看容器日志

docker logs mysql57

如果看到类似 ready for connections 的信息,说明启动成功。

5.3 进入容器内部

docker exec -it mysql57 bash

命令解释:

  • docker exec:在运行的容器中执行命令
  • -it:交互式终端
  • mysql57:容器名称
  • bash:执行 bash 命令

进入容器后,可以使用 MySQL 客户端连接:

mysql -uroot -p

输入你设置的密码,成功登录后会看到 mysql> 提示符。


第六步:基础操作命令

查看数据库版本

SELECT VERSION();

查看当前数据库列表

SHOW DATABASES;

创建新数据库

CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

创建新用户并授权

-- 创建用户(允许从任何主机连接)
CREATE USER 'dbuser'@'%' IDENTIFIED BY 'StrongPassword123!';-- 授予所有权限
GRANT ALL PRIVILEGES ON test_db.* TO 'dbuser'@'%';-- 刷新权限
FLUSH PRIVILEGES;

退出 MySQL

EXIT;

退出容器

exit

第七步:常用管理命令

停止容器

docker stop mysql57

启动容器

docker start mysql57

重启容器

docker restart mysql57

删除容器(注意:会删除容器,但数据在宿主机保留)

docker rm -f mysql57

查看容器详细信息

docker inspect mysql57

第八步:性能优化建议

根据服务器配置调整参数

  1. 服务器内存 2GB

    innodb_buffer_pool_size = 512M
    max_connections = 500
    
  2. 服务器内存 4GB

    innodb_buffer_pool_size = 2G
    max_connections = 1000
    
  3. 服务器内存 8GB

    innodb_buffer_pool_size = 4G
    max_connections = 2000
    
  4. 服务器内存 16GB 及以上

    innodb_buffer_pool_size = 8G
    max_connections = 3000
    

修改配置后重启生效

# 1. 修改配置文件
vim /opt/wwwroot/mysql57/mysql/conf/my.cnf# 2. 重启容器
docker restart mysql57# 3. 验证配置是否生效
docker exec -it mysql57 mysql -uroot -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

第九步:数据备份与恢复

备份数据库

# 备份单个数据库
docker exec mysql57 mysqldump -uroot -p'Your_Password' test_db > /opt/backup/test_db_$(date +%Y%m%d).sql# 备份所有数据库
docker exec mysql57 mysqldump -uroot -p'Your_Password' --all-databases > /opt/backup/all_db_$(date +%Y%m%d).sql

恢复数据库

# 恢复数据库
docker exec -i mysql57 mysql -uroot -p'Your_Password' test_db < /opt/backup/test_db_20241112.sql

第十步:安全加固建议

  1. 修改 root 密码为强密码:至少 16 位,包含大小写字母、数字和特殊字符

  2. 禁止 root 远程登录

    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
    FLUSH PRIVILEGES;
    
  3. 删除匿名用户

    DELETE FROM mysql.user WHERE User='';
    FLUSH PRIVILEGES;
    
  4. 删除 test 数据库

    DROP DATABASE IF EXISTS test;
    
  5. 配置防火墙:只允许特定 IP 访问 3309 端口


常见问题排查

问题1:容器无法启动

# 查看详细日志
docker logs mysql57# 常见原因:
# - 端口被占用:修改 -p 参数
# - 目录权限问题:检查权限设置
# - 配置文件语法错误:检查 my.cnf

问题2:无法连接数据库

# 检查容器是否运行
docker ps# 检查端口是否监听
netstat -tuln | grep 3309# 检查防火墙规则
firewall-cmd --list-all# 开放端口(CentOS)
firewall-cmd --permanent --add-port=3309/tcp
firewall-cmd --reload

问题3:性能缓慢

# 查看慢查询日志
docker exec mysql57 tail -f /var/log/mysql/mysql-slow.log# 检查当前连接数
docker exec mysql57 mysql -uroot -p -e "SHOW STATUS LIKE 'Threads_connected';"# 检查缓冲池使用情况
docker exec mysql57 mysql -uroot -p -e "SHOW STATUS LIKE 'Innodb_buffer_pool%';"

总结

恭喜你!现在你已经成功使用 Docker 部署了一个生产级别的 MySQL 5.7 数据库。

关键要点回顾:

  1. 使用数据卷挂载实现数据持久化
  2. 合理配置参数提升性能
  3. 定期备份数据
  4. 注意安全加固
  5. 根据服务器配置调整参数

下一步学习建议:

  • 学习 MySQL 索引优化
  • 学习主从复制配置
  • 学习数据库监控工具
  • 学习 SQL 调优技巧

如有问题,欢迎留言交流!


参考资料

  • MySQL 官方文档
  • Docker 官方文档
  • MySQL Docker Hub
http://www.dtcms.com/a/601613.html

相关文章:

  • 【图像处理基石】如何对图像畸变进行校正?
  • Step by Step Configuration Of DataGuard Broker for Oracle 19C
  • 阿里云服务器网站备案工程造价材料信息网
  • 做底单的网站wordpress oauth
  • mkcert 自签证书以及 jssip
  • 新出土的古陶瓷碎片的图片并根据碎口尝试进行拼接用什么模型算法比较合适?古陶瓷碎片拼接算法选型
  • 网站建设人员需求化妆品网站的建设方案
  • Flink原理与实战(java版)#第2章 Flink的入门(第一节大数据架构的演变)
  • Python好玩的算法库
  • 银河麒麟V10下使用virt-manager安装Windows虚拟机
  • 插值——牛顿插值
  • 【稳定性】system_app_anr@1760693457221.txt和anr_2025-10-17-17-30-35-009有什么区别
  • 网站建设 教材 推荐免费网站提供
  • Java ee初阶——定时器
  • 【JavaEE初阶】网络层-IP协议
  • tomcat/idea打包部署报错,RUN 可以 DEBUG 不行
  • 地方网站还有得做吗永嘉做网站
  • 防滑齿位置与牙根断裂风险的相关性分析
  • Lua学习记录(1) --- Lua中的条件分支语句和循环语句
  • 铸铁实验平台概述
  • 微电网的“智能大脑”:ACCU-100M如何实现光储充一体化协调控制?
  • 算法 day 52
  • seo优化排名易下拉试验2022年seo还值得做吗
  • (Mysql)MySQL 查询执行顺序总结
  • Plaxis自动化建模与Python应用全解:从环境搭建到高级案例实战
  • 网络推广网站排名免费的行情软件网站不用下载
  • 建设网站困难的解决办法推荐营销型网站建设
  • 护航青春心 ——VR青少年心理健康体验系统的温柔守护
  • 20251112给荣品RD-RK3588开发板跑Rockchip的原厂Android13系统时适配gmac0
  • 网站支付页面怎么做的咸宁手机网站建设