1.前提
已经安装docker
docker -v
2.下载MYSQL IMAGE
如果想下载8.0.31
docker pull mysql:8.0.31
如果想下载5.7
docker pull mysql:5.7
如果想下载8.4
docker pull mysql:8.4
如果想下载最新版本
docker pull mysql:latest
确认一下下载的image
[root@docker-hub ~]# docker image ls
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
hello-world:latest f7931603f70e 16.2kB 3.96kB U
mysql:5.7 4bc6bc963e6d 684MB 138MB
mysql:8.0.31 3d7ae561cf60 729MB 161MB U
mysql:8.4 b306273d4d36 1.07GB 236MB
mysql:latest 569c4128dfa6 1.27GB 278MB
[root@docker-hub ~]#
3.运行mysql docker
3.1 建立响应的目录
mkdir -p ~/docker/mysql/{conf,data,log,binlog}
chown -R 999:999 ~/docker/mysql # MySQL 容器内默认用户 UID=999
chmod -R 755 ~/docker/mysql
3.2 创建配置文件
vim ~/docker/mysql/conf/my.cnf
..
[mysqld]
# 字符集(避免乱码)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 连接配置
max_connections = 500 # 最大连接数(根据CPU核数调整:4核→200-500,8核→500-1000)
wait_timeout = 60 # 空闲连接超时(60秒,避免连接泄露)
interactive_timeout = 60
back_log = 100 # 连接队列长度(应对突发流量)
# 日志配置(排查问题必备)
slow_query_log = ON # 开启慢查询日志
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1 # 执行>1秒的SQL记录为慢查询
log_queries_not_using_indexes = OFF # 不记录“未用索引的小查询”(避免日志过大)
log_error = /var/log/mysql/error.log # 错误日志(排查启动/崩溃问题)
# 8核16g
innodb_buffer_pool_size = 10G # 内存的60%-70%(16GB→10G)
innodb_buffer_pool_instances = 8 # 8核→8实例
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M # 日志缓冲(应对写密集)
innodb_flush_log_at_trx_commit = 1
innodb_read_io_threads = 8
innodb_write_io_threads = 8
max_connections = 1000 # 高并发场景调大
open_files_limit = 65535 # 避免文件句柄不足
table_open_cache = 4096 # 表缓存(应对多表查询)
3.3 DOCKER run 首次启动
docker run -d \ # -d 后台启动
--name mysql-prod \ # --name 容器名字
-p 3306:3306 \ # -p 3306 映射端口
-e MYSQL_ROOT_PASSWORD=sztech_4U \ # 初始root密码
-e MYSQL_INITDB_SKIP_TZINFO=1 \ # 跳过时区初始化(避免报错)
-v ~/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \ # 挂载上面的配置文件
-v ~/docker/mysql/data:/var/lib/mysql \ # 持久化数据(关键!避免容器删除后数据丢失)
-v ~/docker/mysql/log:/var/log/mysql \ # 持久化日志(方便本地查看)
-v ~/docker/mysql/binlog:/var/binlog/mysql \ # 持久化binlog(主从复制/恢复用)
--cpus=8 \ # 限制使用8核CPU(避免抢占其他服务资源)
--memory=12G \ # 限制使用16GB内存(留4GB给系统)
--restart=always \ # 容器崩溃自动重启
--privileged=true \ # 授予权限(避免挂载目录权限问题)
mysql:8.0.31 # 镜像版本(建议用8.0,性能和安全性更优)
4.查看容器运行
docker ps
[root@docker-hub ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
253a9fb087fa mysql:8.0.31 "docker-entrypoint.s…" 2 hours ago Up 59 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql-prod
[root@docker-hub ~]#
5.停止容器
[root@docker-hub ~]# docker stop mysql-prod
6.重启容器
[root@docker-hub ~]# docker start mysql-prod
7.登录MYSQL容器
[root@docker-hub ~]# docker exec -it mysql-prod mysql -uroot -psztech_4U
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.31 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
8.修改root密码
mysql> alter user 'root'@'localhost' identified by 'newpass';
mysql> flush privileges;
mysql> alter user 'root'@'%' identified by 'newpass';
mysql> flush privileges;
9.删除容器
docker rm mysql-prod
之后,可以把对应的数据文件,配置文件都删除。
10.修改参数配置
临时修改
mysql> set global innodb_buffer_pool_size=2147483648;
mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 2147483648 |
+-------------------------+------------+
1 row in set (0.00 sec)
mysql>
11.永久修改
找到配置文件
[root@docker-hub ~]# docker inspect -f '{{.HostConfig.Binds}}' mysql-prod
[/root/docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf /root/docker/mysql/data:/var/lib/mysql /root/docker/mysql/log:/var/log/mysql]
修改配置文件
vim /root/docker/mysql/conf/my.cnf
...
innodb_buffer_pool_size = 2048M
...
之后,重启容器并生效
docker stop mysql-prod
docker start mysql-prod
|