使用docker部署mysql最佳实践
拉取镜像
docker pull mysql:5.7
创建目录及配置
MySQL配置说明
mysql版本:5.7.36
日志目录:/var/log/mysql
数据目录:/var/lib/mysql
配置目录:/etc/mysql
创建目录
mkdir -p /home/mysql/{data,conf,log}
创建配置文件
cat > /home/mysql/conf/my.cnf <<'EOF'
[client]
# 设置客户端默认使用的字符集为utf8mb4
default-character-set=utf8mb4
[mysql]
# 设置MySQL命令行工具的默认字符集为utf8mb4
default-character-set=utf8mb4
[mysqld]
skip-host-cache
# 禁用dns解析
skip-name-resolve
# 忽略客户端字符编码设置,禁用客户端/服务器握手期间的字符集检查。
这样,客户端不需要与服务器协商字符集,而是直接使用服务器配置的字符集
skip-character-set-client-handshake
# 在每个新连接初始化时,设置连接的排序规则为utf8mb4_general_ci。这确保了连接时使用的默认排序规则
init_connect='SET collation_connection = utf8mb4_general_ci'
# 在每个新连接初始化时,设置连接的字符集为utf8mb4。
这确保了连接时使用的默认字符集
init_connect='SET NAMES utf8mb4'
# 设置MySQL服务器的默认字符集为utf8mb4
character-set-server=utf8mb4
# 在 MySQL 5.7 版本中,默认排序规则为 utf8mb4_general_ci或者手动改为utf8mb4_unicode_ci
# 在 MySQL 8.0 版本中,默认排序规则为 utf8mb4_0900_ai_ci,是utf8mb4_unicode_ci的一个子集。
# 设置MySQL服务器的默认排序规则为utf8mb4_general_ci
# utf8mb4排序规则排序规则说明:https://zhuanlan.zhihu.com/p/638258584
collation-server=utf8mb4_general_ci
# 设置东八区时区
default-time-zone='+08:00'
# 容器内部存数据的目录
datadir=/var/lib/mysql
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=1000
default-storage-engine=InnoDB
# 默认身份认证插件
default_authentication_plugin=mysql_native_password
# MySQL表名小写,且不区分大小写
lower-case-table-names=1
EOF
运行容器
docker run -p 3306:3306 --name mysql --restart=always --privileged=true \
-v /home/mysql/conf/my.cnf:/etc/my.cnf \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/log:/var/log/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=blog \
-e TZ=Asia/Shanghai \
-d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --lower_case_table_names=1
参数说明
-p 3306:3306 指定宿主机端口与容器端口映射关系。
–name mysql:创建的容器名称
–restart=always:总是跟随docker启动
–privileged=true:获取宿主机root权限
-v /home/mysql/conf/my.cnf:/etc/my.cnf # 将宿主机的/home/mysql/conf/my.cnf 文件挂载到容器的/etc/my.cnf文件,作为MySQL的启动配置文件。
-v /home/mysql/data:/var/lib/mysql # 将宿主机的/home/mysql/data目录挂载到容器的/var/lib/mysql目录,用于存储MySQL的数据文件。
-v /home/mysql/log:/var/log/mysql # 将宿主机的/home/mysql/log目录挂载到容器的/var/log/mysql目录,用于存储MySQL的日志文件。
-v /etc/localtime:/etc/localtime:ro:让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读
-e MYSQL_ROOT_PASSWORD=root 指定mysql环境变量,root用户的密码为root。
-e TZ=Asia/Shanghai 设置系统时区。
-e MYSQL_DATABASE=blog:创建一个名为 blog 的数据库,可以不设置(如已存在则跳过创建)
-d mysql:5.7 后台运行mysql容器,版本是5.7。
–character-set-server=utf8mb4 设置 MySQL 的字符集为utf8mb4,这个参数可以确保 MySQL 能够正确地处理 Unicode 字符
–collation-server=utf8mb4_general_ci MySQL使用utf8mb4_general_ci排序规则
–lower_case_table_names=1 MySQL表名小写,且不区分大小写
MySQL数据管理
进入容器并登录MySQL
# 进入容器
docker exec -it mysql /bin/bash
# 登录mysql
mysql -uroot -proot
# 进入mysql数据库
use mysql;
# 以上命令可合并为一条命令
docker exec -it mysql mysql -uroot -proot mysql
基本信息查看
# 查看mysql版本
select @@version;
# 查看用户列表
select host, user, plugin, authentication_string, password_expired from user;
# 查看数据库时区配置:
select @@global.time_zone,@@session.time_zone;
SHOW VARIABLES LIKE '%time_zone%';
# 查看数据库字符集配置:
SHOW VARIABLES LIKE 'character%';
#创建新表时将使用的默认存储引擎
# 查询数据库事务的隔离级别:mysql 默认REPEATABLE-READ
SELECT @@tx_isolation;
数据库创建
# 创建数据库
# create database 数据库名 set 编码方式 collate 排序规则
CREATE DATABASE test_db character SET utf8mb4 COLLATE utf8mb4_general_ci;
# 查看所有数据库
SHOW DATABASES;
# 查看某个数据库的创建信息
# show CREATE database 数据库名字;
SHOW CREATE DATABASE test_db ;
# 修改数据库信息
# alter database 数据库名 character set 编码方式
# 把test_db数据库的字符集修改为utf8;
ALTER DATABASE test_db character SET utf8;
# 删除数据库
# drop database 数据库名字;
DROP DATABASE test_db;
# 查看当前使用的数据库
select database();
# 切换数据库
# use 数据库名;
use mysql;
账户及授权
use mysql;
# 使root用户对所有远程ip开放链接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
# 创建用户
# create user 用户名@IP identified by 密码;
# 上面命令中的identified by可换成IDENTIFIED WITH mysql_native_password BY
# 指定IP才能登陆,如果IP为%则表示任意IP均可登陆
# 添加远程登录用户
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
# 用户授权
# grant 权限1,权限2,........,权限n on 数据库名.表名 to 用户名@IP; 给指定用户授予指定指定数据库和表的指定权限
# 授予test用户在test_db数据库中的所有表上执行SELECT, INSERT, UPDATE权限
GRANT SELECT, INSERT, UPDATE ON test_db.* TO 'test'@'%';
#grant all on . to 用户名@IP 给指定用户授予所有数据库所有权限
# 授予所有数据库所有权限给root用户
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
# 查看用户权限
# SHOW GRANTS FOR 用户名@IP;
SHOW GRANTS FOR 'test'@'%';
#撤销用户权限
# REVOKE 权限1,权限2,........,权限n on 数据库名.* from 用户名@IP;
REVOKE SELECT ON *.* FROM 'test'@'%' ;
#删除用户
# DROP USER 用户名@IP;
DROP USER test@localhost;
# 使权限生效
FLUSH PRIVILEGES;
初始数据导入
# 复制本地/path/your_data.sql文件到mysql容器的/tmp/your_data.sql中
docker cp /path/your_data.sql mysql:/tmp/your_data.sql
# 方法一:执行导入初始数据脚本到容器mysql中
# 进入mysql容器
docker exec -it mysql /bin/bash
# 登录mysql
mysql -uroot -proot
# 切换到your_database数据库
use your_database;
# 导入数据库脚本
source /tmp/your_data.sql;
# 方法二:以上命令可合并为一条命令执行
docker exec -it mysql mysql -uroot -proot your_database < /tmp/your_data.sql;
从容器导入导出数据
# 导入数据
docker exec -it mysql容器ID或名称 -uMySQL用户 -pMySQL密码 导入数据库名称 < 本机导入脚本.sql
# 导出数据
docker exec -it mysql容器ID或名称 mysqldump -uMySQL用户 -pMySQL密码 导出数据库名称 > 本机导出脚本.sql
防火墙配置
如果开启了防火墙则需配置开放MySQL使用的3306端口,如未开启防火墙则跳过下述内容
# 查看防火墙的状态
firewall-cmd --state
# 开放MySQL使用的3306端口
#–-zone 作用域
#–-add-port=3306/tcp 添加端口,格式为:端口号/通讯协议
#--permanent 标志用于使更改永久生效,如果不使用,更改将在下次重启后失效。
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重载防火墙配置以使更改生效(无论是添加还是移除,都需要重启一遍防火墙才能生效)
firewall-cmd --reload
注意:
如果是云服务器(例:阿里云、腾讯云、华为云等),服务器在防火墙开放端口的同时还需在云服务中控台配置安全组开放相关端口,才能使最终链路打通链接。