docker 部署 mysql 9.0.1

docker 如何部署 mysql 9 ,请看下面步骤:

1. 先看 mysql 官网

先点进去 8 版本的 Reference Manual 。

选择 9.0 版本的。

点到这里来看, 这里有一些基础的安装步骤,可以看一下。 - Basic Steps for MySQL Server Deployment with Docker

有关使用 Docker 部署 MySQL Server 的更多主题,例如 服务器配置, 持久保存数据和配置, 服务器 错误日志和容器环境变量,请参阅 第 2.5.6.2 节 "有关使用 Docker 部署 MySQL 服务器的更多主题"。

bash 复制代码
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d container-registry.oracle.com/mysql/community-server:tag

OK, 上面是官网的教程,接下来写上我自己的实操。

1. 首先我们要做下载 mysql 9.0.1 的镜像

bash 复制代码
docker pull mysql:9.0.1

2. 然后运行创建 mysql 容器

bash 复制代码
docker run -d \
--name mysql9 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
mysql:9.0.1

查看 mysql 是否正常启动:

bash 复制代码
docker ps

可以看到已经正常启动了。

3. 但我们的目标是要实现挂载mysql的 配置文件 到宿主机以便于修改 和 持久化 mysql 的数据。所以我们要先将 mysql 的 配置文件从容器中拷贝出来。

那么, mysql 9 的配置文件在哪呢?

我们从 dockerhub 仓库中可以看到 mysql 的配置文件在 /etc/mysql/my.cnf 。但是,你进去 mysql 9 的容器中会发现 这个路径找不到 my.cnf 文件。

其实 mysql 官网已经提到了, 在 /etc/my.cnf 。

OK,既然知道了配置文件的路径,那就拷贝出来。

先在宿主机中创建下面文件夹用于存放 mysql 9 的配置文件 以及 将来要存储 mysql 的数据目录。

bash 复制代码
mkdir -p /mydata/mysql/conf  /mydata/mysql/data

从 mysql 9 容器中拷贝配置文件出来:

bash 复制代码
docker cp mysql9:/etc/my.cnf:/mydata/mysql/conf

4. 删除 mysql 9 容器

bash 复制代码
docker stop mysql9
docker rm mysql9

5. 重新创建 mysql9 容器,并实现目录挂在。

bash 复制代码
docker run --name=mysql9 \
--mount type=bind,src=/mydata/mysql/conf/my.cnf,dst=/etc/my.cnf \ 
--mount type=bind,src=/mydata/mysql/data,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-p 3306:3306 \
-d mysql:9.0.1

你知道这两种写法有什么不同吗?请参考这篇文章 - 《docker 的目录挂载的新语法》

--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf

-v /path-on-host-machine/my.cnf:/etc/my.cnf

到此 docker 就成功安装了 mysql 9 了。

那下一步我们要做什么呢? 远程连接 mysql 。 没错,所以继续往下看。

6. 修改配置文件添加允许远程访问配置

编辑 /mydata/mysql/conf/my.cnf

在配置文件中找到 [mysqld] 部分,添加下面属性

bash 复制代码
bind-address = 0.0.0.0

这会允许 MySQL 接受来自任何 IP 地址的连接。

修改完成后,需要重启 mysql 容器。

bash 复制代码
docker restart mysql9

7. 登录到 mysql 中赋予新用户远程访问的权限

注意:下面这段是旧 mysql 的用法了。在 mysql 9 中不能使用这种用法了。

bash 复制代码
# 1. 如果已经有现有用户,修改权限:
GRANT ALL PRIVILEGES ON database.* TO 'root'@'%' IDENTIFIED BY 'root';

FLUSH PRIVILEGES;

上面这种写法在 mysql 9 中运行会报如下错误:

bash 复制代码
mysql>  GRANT ALL PRIVILEGES ON mysql.* TO 'root'@'%' IDENTIFIED BY 'root';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'root'' at line 1

在 MySQL 8.0 和 9.0 版本中,GRANT 语句的语法发生了一些变化,尤其是涉及到用户创建和权限赋予的部分。特别地,MySQL 8.0+ 版本不允许在 GRANT 语句中直接使用 IDENTIFIED BY 来设置密码,密码设置应该通过 CREATE USER 或 ALTER USER 语句进行。

这个错误是因为在 MySQL 9.0.1 中,我们试图在 GRANT 语句中使用 IDENTIFIED BY,而 MySQL 9.0.1 的语法不允许这样做。

正确的做法:

bash 复制代码
# 1. 首先使用 CREATE USER 语句创建一个新用户,并设置密码:
CREATE USER 'username'@'%' IDENTIFIED BY 'password';

# 2. 然后使用 GRANT 语句为该用户授予权限:
GRANT ALL PRIVILEGES ON mysql.* TO 'username'@'%';

# 3. 最后,执行 FLUSH PRIVILEGES 使权限立即生效:
FLUSH PRIVILEGES;

不过我们已经有 root 用户了,不用去创建新用户了,在 mysql 库 下的 user 表可以查看到已有用户。

所以直接执行下面语句就行:

bash 复制代码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;

然后再用 Navicate 去连接,已经可以正常连接上了。

到此本教程已结束。


扩展:

更多 docker 教程可以参考这个人的文章 - Docker 教程(图文讲解),整理的挺好的。

相关推荐
周杰伦的稻香21 小时前
MySQL中常见的慢查询与优化
android·数据库·mysql
yeflx21 小时前
解决Ubuntu22.04宿主机docker容器中nvidia-smi偶发失效问题
运维·docker·容器
·云扬·1 天前
MySQL 常见存储引擎详解及面试高频考点
数据库·mysql·面试
何以不说话1 天前
mysql 的主从复制
运维·数据库·学习·mysql
吉吉611 天前
Docker拉取镜像解决办法
运维·docker·容器
橘子131 天前
MySQL库的操作(二)
数据库·mysql·oracle
·云扬·1 天前
MySQL各版本核心特性演进与主流分支深度解析
数据库·sql·mysql
lpfasd1231 天前
springcloud docker 部署问题排查与解决方案
spring·spring cloud·docker
宋情写1 天前
docker-compose安装Redis
redis·docker·容器
田超凡1 天前
深入理解MySQL_6 Temporary临时表
mysql·java-ee