Docker安装mysql5.7
使用 Docker 部署 MySQL 5.7 完整教程(入门小白版)本教程将手把手教你使用 Docker 部署 MySQL 5.7 数据库,适合零基础的小白学习。我们会详细讲解每一个命令的作用,并提供优化后的生产环境配置文件。环境要求操作系统:Linux(CentOS、Ubuntu 等)已安装 Docker(如未安装,请先安装 Docker)具备 root 权限或 sudo 权限。
目录
使用 Docker 部署 MySQL 5.7 完整教程
本教程将手把手教你使用 Docker 部署 MySQL 5.7 数据库,适合零基础的小白学习。我们会详细讲解每一个命令的作用,并提供优化后的生产环境配置文件。
环境要求
操作系统:Linux(CentOS、Ubuntu 等)
已安装 Docker(如未安装,请先安装 Docker)
具备 root 权限或 sudo 权限
注意:要设置远程访问、配置数据库大小写不敏感 lower_case_table_names=1
第一步:拉取 MySQL 5.7
首先,我们需要从 Docker Hub 下载 MySQL 5.7 的官方镜像。
docker pull mysql:5.7.23
命令解释:
docker pull:从 Docker Hub 下载镜像的命令
mysql:5.7:指定要下载的镜像名称和版本号
执行后效果:
你会看到下载进度条,等待下载完成即可。
第二步:创建目录结构
为了数据持久化和方便管理,我们需要在宿主机上创建三个目录:
data 目录:存储数据库数据文件
conf 目录:存储配置文件
logs 目录:存储日志文件
2.1 创建目录
mkdir -p /opt/www/mysql57/mysql/data
mkdir -p /opt/www/mysql57/mysql/conf
mkdir -p /opt/www/mysql57/mysql/logs
命令解释:
mkdir:创建目录的命令
-p:如果父目录不存在,则自动创建父目录
/opt/www/mysql57/mysql/:我们选择的存储路径(你可以根据需要修改)
2.2 设置目录权限
chmod -R 700 /opt/www/mysql57/mysql
命令解释:
chmod:修改文件权限的命令
-R:递归修改,包括所有子目录和文件
700:权限设置,表示所有者可读、可写、可执行,其他人无任何权限
2.3 设置目录所有者
注意:此步骤不设置会导致,配置文件无法读取
chown -R 999:999 /opt/www/mysql57/mysql
命令解释:
chown:修改文件所有者的命令
-R:递归修改
999:999:用户 ID 和组 ID(MySQL 官方镜像默认使用 999 作为运行用户)
第三步:创建配置文件
现在我们要创建 MySQL 的配置文件,这个文件非常重要,它决定了数据库的性能和行为。
vim /opt/www/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
#大小写不敏感
lower_case_table_names=1
# 字符集设置
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=123456 \
-p 3306:3306 \
-v /opt/wwwroot/mysql57/mysql/data:/var/lib/mysql \
-v /opt/wwwroot/mysql57/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /opt/wwwroot/mysql57/mysql/logs:/var/log/mysql \
--restart unless-stopped \
mysql:5.7.23
命令详细解释:
docker run:运行容器的命令
-d:后台运行(daemon 模式)
--name mysql57:给容器命名为 mysql57
-e MYSQL_ROOT_PASSWORD=123456:设置 root 用户密码(请务必修改为强密码)
-p 3306:3306:端口映射,宿主机 3306 端口映射到容器 3306 端口
外部连接时使用:服务器IP:3306
-v /opt/www/mysql57/mysql/data:/var/lib/mysql:数据目录挂载
-v /opt/wwwroot/mysql57/mysql/conf/my.cnf:/etc/mysql/my.cnf:配置目录挂载
-v /opt/www/mysql57/mysql/logs:/var/log/mysql:日志目录挂载
--restart unless-stopped:容器自动重启策略(除非手动停止,否则总是重启)
mysql:5.7.23:使用的镜像名称
第五步:验证容器运行状态
5查看容器是否运行
docker ps -a
你应该看到类似这样的输出:
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
xxxxxxxxxxxx mysql:5.7 "docker-entrypoint.s…" Up 10 seconds 0.0.0.0:3306->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 -uroot -p123456
SHOW VARIABLES LIKE 'lower_case_table_names';
输入你设置的密码,成功登录后会看到 mysql> 提示符。
第六步:基础操作命令
查看数据库版本
SELECT VERSION();
查看当前数据库列表
SHOW DATABASES;
创建新数据库
CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
第七步:允许远程访问
创建新用户并授权
-- 创建用户(允许从任何主机连接)
-- 授予 root 用户从任何主机 (%) 连接的权限,并刷新权限。
-- 请确保在实际生产环境中不要使用 root 远程连接,或对其进行更严格的限制。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- 验证
-- 验证 root 用户的 host 是否已更改为 '%'
SELECT Host, User, authentication_string FROM mysql.user WHERE User = 'root';
退出 MySQL
EXIT;
退出容器
exit
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)