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 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. // 这里采用第二种, 同时新建用户的方式去测试~~~
命令参考创建用户 // 只有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的~~ 而且, 是分别测试连接 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方面的知识, 才行, 不然看似很简单的步骤流程, 想要成功实现结果也是有些坑. 重要的是, 不要完全按照教程文档走而不假思索, 否则就会掉入坑中, 而无法爬出. 生活中很多事情也是这样~~~
后续补充 ... |