参考攻略:
步骤:
一、拉取MySQL镜像
卡了一两天,攻略中指定拉取mysql:8.3.0,但是使用的是阿里云镜像仓库(可能没有这个版本),一直去dockerhub上拉取,然后就一直显示拉取超时。
#MySQL镜像(当没有指定版本号时默认拉取latest)
docker pull mysql
#查看MySQL镜像
docker images mysql
二、在宿主机创建目录
#创建挂载目录
mkdir -p /home/mysql/{conf,data,log}
#创建配置文件
cd /home/mysql/conf
vim my.cnf
#按键盘i键进行输入
[client]
#设置客户端默认字符集utf8mb4
default-character-set=utf8mb4
[mysql]
#设置服务器默认字符集为utf8mb4
default-character-set=utf8mb4
[mysqld]
#配置服务器的服务号,具备日后需要集群做准备
server-id = 1
#开启MySQL数据库的二进制日志,用于记录用户对数据库的操作SQL语句,具备日后需要集群做准备
log-bin=mysql-bin
#设置清理超过30天的日志,以免日志堆积造过多成服务器内存爆满。2592000秒等于30天的秒数
binlog_expire_logs_seconds = 2592000
#解决MySQL8.0版本GROUP BY问题
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
#允许最大的连接数
max_connections=1000
# 禁用符号链接以防止各种安全风险
symbolic-links=0
# 设置东八区时区
default-time_zone = '+8:00'
#按键盘esc键退出输入,输入:wq保存退出
三、启动MySQL容器
-p表示端口映射
--restart=always表示容器退出时总是重启
--name表示容器命名
--privileged=true表示赋予容器权限修改宿主文件权利
-v /home/mysql/log:/var/log/mysql表示容器日志挂载到宿主机
-v /home/mysql/data:/var/lib/mysql表示容器存储文件挂载到宿主机
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf表示容器配置文件挂载到宿主机
-e MYSQL_ROOT_PASSWORD=a12bCd3_W45pUq6表示设置mysql的root用户密码,建议用强密码
-d表示后台运行
docker run \
-p 3306:3306 \
--restart=always \
--name mysql \
--privileged=true \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=a12bCd3_W45pUq6 \
-d mysql
这样虽然能够启动,但是我又遇到了问题,通过docker ps查看运行容器,显示mysql容器一直在重启中……
通过网上搜索才发现问题所在
- 使用docker logs 容器ID 查看对应容器日志信息发现
- 报错信息显示 /var/lib/mysql-files 文件夹目录不存在
- 创建 /var/lib/mysql-files
- 挂载的 /home/mysql/data 会覆盖 /var/lib/mysql,因此可能丢失默认的 /var/lib/mysql-files 目录。可以在宿主机上手动创建并挂载
- 给出解决方法:将/var/lib/mysql-files也挂载出去
- -v /home/mysql/files:/var/lib/mysql-files \
所以最终命令为 但是这么设置的sql密码并没有成功
docker run \
-p 3306:3306 \
--restart=always \
--name mysql \
--privileged=true \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/mysql/files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql
四、设置MySQL数据库密码
#进入mysql容器
docker exec -it [容器id] /bin/bash
#mysql -u root -p 是 MySQL 数据库的命令行工具的启动命令
#用于以 root 用户身份登录到 MySQL 数据库服务器。
#-u [用户名]:指定登录 MySQL 数据库的用户名。 -p:表示提示用户输入密码。
#没有设置成功密码 登录 mysql -u root
mysql -u root -p
#使用数据库
#在 MySQL 命令行中,每条 SQL 语句需要以分号(;)结尾。
#如果你没有在前条语句末尾加上分号,MySQL 会认为命令尚未结束,等待你继续输入。
use mysql;
#查看数据库密码信息
SELECT user, host, authentication_string FROM mysql.user;
#修改root密码
#root@'%' 表示允许 root 用户从任何 IP 地址(% 是通配符,表示所有主机)连接到 MySQL 数据库。
#将 root 用户从任何 IP 地址连接时的密码设置为指定的密码,并确保密码永不过期。
ALTER USER 'root'@'%' IDENTIFIED BY '密码' PASSWORD EXPIRE NEVER;
#修改本地密码
#root@'localhost' 表示只允许 root 用户从本地主机(即运行 MySQL 的服务器本身)连接到数据库。
#将 root 用户从本地主机连接时的密码设置为指定的密码。
ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';
#退出Mysql和容器
exit
#重启服务
docker restart mysql
五、Navicat连接数据库
首选确保阿里云服务器的安全组规则允许从你的本地 IP 地址访问 MySQL 的 3306 端口
但是我放开了之后还是连接不上,通过询问kimi之后发现还需要检查 MySQL 用户权限
默认情况下,MySQL 的 root 用户可能只允许从本地主机登录。需要为远程主机添加用户权限
use mysql;
#这里 % 表示允许从任何 IP 地址连接。出于安全考虑,建议限制为特定 IP 地址。
#首先,使用 CREATE USER 语句创建用户,并设置密码
CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
#然后,使用 GRANT 语句授予用户权限
#GRANT 是 MySQL 中用于授权的命令,用于授予用户特定的权限。
#ALL PRIVILEGES 表示授予用户所有可能的权限,包括但不限于:SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER、GRANT OPTION(允许用户将这些权限授予其他用户)
#*.* 表示所有数据库中的所有表。
#'root':用户名。 '%':允许从任何主机连接。
#WITH GRANT OPTION 允许用户将这些权限授予其他用户。这条语句不仅授予 root 用户所有权限,还允许 root 用户将这些权限授予其他用户。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
#执行 FLUSH PRIVILEGES 以确保权限生效
FLUSH PRIVILEGES;