1. 文档
Docker Hub // mysql镜像
Docker 安装 MySQL | 菜鸟教程 // Docker 安装 MySQL
Docker 教程 | 菜鸟教程 // Docker 教程 -- 其中有涉及docker安装很多其他软件服务 -- 可参考,实践
2.整理输出 Note 补充
Mac上操作也是一样的~
2.1 拉取镜像 docker pull mysql // 目前最新版本 拉取镜像结果如下: 2.2 运行容器
点击Run, 容器启动失败, 打开log查看信息
报错信息:
2021-01-16 13:27:15+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
即 MySQL 8.0 数据库未初始化,且未指定密码选项, 需要指定上面的三者之一
查看官方文档, 找到解决办法 // 官方文档是一定要看的~~~
Docker Hub
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
解决办法:
打开cmd, 查看容器信息
命令行下, 删除刚刚生成的容器MySQL-Server, 重新生成容器
docker rm MySQL-Server
docker run --name MySQL-Server -e
=my-secret-pw -d mysql:latest // 这里的my-secret-pw仍为平时使用的Mysql密码
这时, 打开Docker for window, 可以看到MySQL正常启动
Mysql容器初步启动成功~ // 后面一些配置,再补充~~~
或者
设置变量
MYSQL_ROOT_PASSWORD your_want_password
这里是123456
运行如下
客户端连接测试正常
2.3 初步测试容器
MySQL :: MySQL 8.0 Reference Manual :: 4.5.1 mysql — The MySQL Command-Line Client // More information about the MySQL command line client can be found in the MySQL documentation
进入容器, 使用mysql命令连接服务器
查看版本:
select version();
目前看来MySQL服务运行正常~~~
尝试从主机外[远程连接],容器中的MySQL服务.
比如使用可视化工具[HeidiSQL]连接
一直出报错无法连接~~~
重新审视上面的操作, 以及打开容器检查信息
可以发现, 执行命令行操作时间, 并没有绑定端口 [即host与容器之间的端口映射]
确认端口操作:
查看容器绑定和映射的端口及Ip地址
docker port 44de1b0b5312(容器ID)
结果如下:
解决问题参见 2.4 配置容器
2.4 配置容器
首先, 配置端口映射, 使得可以远程连接容器MySQL服务
参考文档: Docker(33)- 如何修改 docker 容器的端口映射 - 小菠萝测试笔记 - 博客园 // Docker(33)- 如何修改 docker 容器的端口映射
简单说:
方式有两种, 一种是删除容器, 重新生成, 简单粗暴
方式二: 进入容器, 指定目录, 修改配置, 比较繁琐.
上面的总结不全面, 各有优缺点.
这里仅仅是为了测试, 所以暂采用第一种方式:
删除容器 // 这里通过Docker for window删除了所有的测试MySQL容器
命令参考:
删除容器
docker rm MySQL-Server
...
生成容器:
docker run --name mysql-server -v D:\wamp\projects-learning\mysql-8.0\data:/var/lib/mysql -p 33060:3306 -e MYSQL_ROOT_PASSWORD=Wn=2021. -d mysql:latest
docker run --name mysql-server-1 -v D:\wamp\projects-learning\mysql-8.0\data001:/var/lib/mysql -p 33061:3306 -e MYSQL_ROOT_PASSWORD=Wn=2021. -d mysql:latest
这里生成了两个MySQL容器.
host主机中, 测试连接容器中的mysql服务
开两个cmd窗口,分别输入如下命令, 然后回车, 输入密码即可
mysql -uroot -P33060 -p
mysql -uroot -P33061 -p
使用可视化工具连接测试HeidiSQL
其他工具应是相同~~~ 比如个人认为最好用的Navicat
Navicat
一切正常~~
Note:
开发/测试环境中直接使用root用户, 虽然好像没什么.
但是还是推荐新建用户, 同时给予合适的权限,
参见: 下方 问题/补充 -- 2
如果是生产环境一定不要使用root权限去操作. 下面的项目中使用也是如此~~~
2.5 项目中测试使用容器中MySQL服务 测试语言
PHP 7.4
扩展
PDO
代码
testPDO.php
<?php
class Model extends PDO { public function __construct() { $dbms = 'mysql'; //数据库类型 $host = 'localhost'; //数据库主机名 $dbName = 'test'; //使用的数据库 $username = 'root'; //数据库连接用户名 $passwd = 'Nxf=2020'; //对应的密码 $dsn = "$dbms:host=$host;dbname=$dbName"; try{ parent::__construct($dsn, $username, $passwd); echo 'Success connected!'; }catch(PDOException $exception){ var_dump($exception->getMessage()); } } }
$model = new Model;
// $sql = "SELECT * FROM test"; // foreach ($model->query($sql) as $row) { // print $row['id'] . "\t"; // print $row['title'] . "\t"; // print $row['author'] . "\n"; // }
// 输出结果:// 数据表的数据只有: 1 test William // 1 test William
出现如下报错: 简单说
发生这种错误,是由于MySQL 8默认使用了新的密码验证插件:caching_sha2_password,
而之前的PHP版本[PHP 7.4.0 才开始支持在DSN中直接使用username和password]中所带的mysqlnd无法支持这种验证。
解决这个问题,有两种办法。
一种办法是: 改用PHP版本, 支持MySQL 8的新验证插件。
两外一种是: 在MySQL 8中创建(或修改)使用caching_sha2_password插件的账户,使之使用mysql_native_password. // 这里采用第二种, 同时新建用户的方式去测试~~~
参考: SHA2密码验证引起的PHP错误:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client - 有欲 - 博客园 命令参考 创建用户 // 只有root权限才可以~~~ TBD
CREATE USER 'williamning'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Wn=2021.';
授权 --- 出现报错[ERROR 1410 (42000): You are not allowed to create a user with GRANT], TBD----------------------> 原因应该是root用户也需要是mysql_native_password相同的密码验证插件 模板 GRANT ALL PRIVILEGES ON 数据库名.数据表名 TO 'nxf2019'@'%' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON test.* TO 'williamning'@'%' WITH GRANT OPTION; // 这里授权test数据库下所有数据表 验证: 得出 root用户授权新用户, 也需要是mysql_native_password相同的密码验证插件. 刷新权限
FLUSH PRIVILEGES;
修改用户
ALTER USER 'williamning'@'localhost' IDENTIFIED WITH mysql_native_password ALTER USER 'williamning'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Wn=2021.'; // Wn=2021. 是 new_password // 刷新权限 FLUSH PRIVILEGES;
采用前一种方式,账户的密码将被清除;BY子句将为账户设置新的密码。
最后刷新权限:
CREATE USER 'williamning'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Wn=2021.';
补充: 查看/确认PHP版本是否支持caching_sha2_password密码验证插件 打印 phpinfo(); Code测试连接依然报错, 不论是使用root身份还是新创建的用户Williamning也是如此 原因TBD 寻找原因过程中~~~~ host主机中的mysql是可以正常连接的 思考: 目前PHP, MySQL版本均是相同, 配置也几乎完全相同, 测试代码也是一致, 为什么docker中却不能工作呢? TBD -----> 缓缓~~😐😐😐 同时, 使用PHP 8.0 作为测试, 也是okay的~~ 详情参见: PHP 扩展 - 开启扩展[如: PHP 8.0 开启PDO, bcmath] - Windows/docker - 学习/实践_william_n的博客-CSDN博客 而且, 是分别测试连接 mysql-server 与 mysql-server-1 均是正常~~~~ 只不过 PHP 8.0 支持密码验证方式如下: 2.6 总结, 如何快速实例化一个MySQL容器
命令:
git bash
模板: // 不能直接执行 docker run \ --name container-name \
-v /my/own/datadir:/var/lib/mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=my_root_pd \ -d mysql:tag
参考: // 可执行 docker run \ --name mysql-server \
-v D:\wamp\projects-learning\mysql-8.0\data:/var/lib/mysql \ -p 33060:3306 \ -e MYSQL_ROOT_PASSWORD=Wn=2021. \ -d mysql:latest
CMD
模板: // 不能执行 docker run --name container-name -v /my/own/datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my_root_pd -d mysql:tag参考: // 可执行 docker run --name mysql-server -v D:\wamp\projects-learning\mysql-8.0\data:/var/lib/mysql -v -p 33060:3306 -e MYSQL_ROOT_PASSWORD=Wn=2021. -d mysql:latest
3. 思考
docker中的MySQL服务搭建, 与在host主机中并没有什么大的区别
不过还是要懂一些docker方面的知识, 才行, 不然看似很简单的步骤流程, 想要成功实现结果也是有些坑.
重要的是, 不要完全按照教程文档走而不假思索, 否则就会掉入坑中, 而无法爬出.
生活中很多事情也是这样~~~
后续补充 ... |
发布评论