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
配置文件说明
关键参数解释:
-
字符集设置:使用
utf8mb4,支持完整的 Unicode 字符(包括 emoji) -
连接数设置:
max_connections = 1000:最大支持 1000 个并发连接- 根据服务器配置调整
-
InnoDB 缓冲池:
innodb_buffer_pool_size = 1G:这是最重要的参数- 建议设置为服务器物理内存的 50%-70%
- 示例:8GB 内存服务器可设置为 4G-5G
-
日志刷新策略:
innodb_flush_log_at_trx_commit = 2:每秒刷新一次- 如果对数据安全要求极高,改为
1(每次事务提交都刷新)
-
慢查询日志:
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
第八步:性能优化建议
根据服务器配置调整参数
-
服务器内存 2GB:
innodb_buffer_pool_size = 512M max_connections = 500 -
服务器内存 4GB:
innodb_buffer_pool_size = 2G max_connections = 1000 -
服务器内存 8GB:
innodb_buffer_pool_size = 4G max_connections = 2000 -
服务器内存 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
第十步:安全加固建议
-
修改 root 密码为强密码:至少 16 位,包含大小写字母、数字和特殊字符
-
禁止 root 远程登录:
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); FLUSH PRIVILEGES; -
删除匿名用户:
DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES; -
删除 test 数据库:
DROP DATABASE IF EXISTS test; -
配置防火墙:只允许特定 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 数据库。
关键要点回顾:
- 使用数据卷挂载实现数据持久化
- 合理配置参数提升性能
- 定期备份数据
- 注意安全加固
- 根据服务器配置调整参数
下一步学习建议:
- 学习 MySQL 索引优化
- 学习主从复制配置
- 学习数据库监控工具
- 学习 SQL 调优技巧
如有问题,欢迎留言交流!
参考资料
- MySQL 官方文档
- Docker 官方文档
- MySQL Docker Hub
