1.应用场景

主要用于快速高效地配置MySQL数据库开发/测试环境. 帮助开发/测试项目.

2.学习/操作

1. 文档

Docker Hub  // mysql镜像

Docker 安装 MySQL | 菜鸟教程 // Docker 安装 MySQL 

Docker 教程 | 菜鸟教程  // Docker 教程 -- 其中有涉及docker安装很多其他软件服务 -- 可参考,实践

2.整理输出

Note

补充

Mac上操作也是一样的~

2.1 拉取镜像

docker pull mysql  // 目前最新版本

docker mysql查看初始密码 docker mysql初始化_mysql

docker mysql查看初始密码 docker mysql初始化_docker_02

拉取镜像结果如下:

docker mysql查看初始密码 docker mysql初始化_win10_03

2.2 运行容器

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_04

点击Run, 容器启动失败, 打开log查看信息

docker mysql查看初始密码 docker mysql初始化_win10_05

报错信息:

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 mysql查看初始密码 docker mysql初始化_docker_06

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

解决办法:

打开cmd, 查看容器信息

docker mysql查看初始密码 docker mysql初始化_docker_07

命令行下, 删除刚刚生成的容器MySQL-Server, 重新生成容器

docker rm MySQL-Server

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_08

docker run --name MySQL-Server -e
=my-secret-pw -d mysql:latest // 这里的my-secret-pw仍为平时使用的Mysql密码

这时, 打开Docker for window, 可以看到MySQL正常启动

docker mysql查看初始密码 docker mysql初始化_8.0_09

Mysql容器初步启动成功~  //  后面一些配置,再补充~~~

 

或者

设置变量

MYSQL_ROOT_PASSWORD  your_want_password

这里是123456

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_10

运行如下

docker mysql查看初始密码 docker mysql初始化_win10_11

 客户端连接测试正常

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_12

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命令连接服务器

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_13

查看版本:

select version();

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_14

目前看来MySQL服务运行正常~~~


尝试从主机外[远程连接],容器中的MySQL服务.

比如使用可视化工具[HeidiSQL]连接


docker mysql查看初始密码 docker mysql初始化_8.0_15

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_16

一直出报错无法连接~~~


重新审视上面的操作, 以及打开容器检查信息

docker mysql查看初始密码 docker mysql初始化_8.0_17

可以发现, 执行命令行操作时间, 并没有绑定端口 [即host与容器之间的端口映射]

确认端口操作:

查看容器绑定和映射的端口及Ip地址

docker port 44de1b0b5312(容器ID)

结果如下:

docker mysql查看初始密码 docker mysql初始化_mysql_18

解决问题参见 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容器.

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_19

docker mysql查看初始密码 docker mysql初始化_mysql_20

host主机中, 测试连接容器中的mysql服务

开两个cmd窗口,分别输入如下命令, 然后回车, 输入密码即可

mysql -uroot -P33060 -p 

mysql -uroot -P33061 -p

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_21


使用可视化工具连接测试HeidiSQL

其他工具应是相同~~~ 比如个人认为最好用的Navicat 

docker mysql查看初始密码 docker mysql初始化_win10_22

docker mysql查看初始密码 docker mysql初始化_8.0_23


Navicat

docker mysql查看初始密码 docker mysql初始化_docker_24

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_25

一切正常~~


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

出现如下报错:

docker mysql查看初始密码 docker mysql初始化_8.0_26

简单说

发生这种错误,是由于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. // 这里采用第二种, 同时新建用户的方式去测试~~~

docker mysql查看初始密码 docker mysql初始化_docker mysql查看初始密码_27


命令参考

创建用户  // 只有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数据库下所有数据表

docker mysql查看初始密码 docker mysql初始化_docker_28

验证:

得出 root用户授权新用户, 也需要是mysql_native_password相同的密码验证插件.

docker mysql查看初始密码 docker mysql初始化_docker_29

刷新权限

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();

docker mysql查看初始密码 docker mysql初始化_mysql_30



Code测试连接依然报错, 不论是使用root身份还是新创建的用户Williamning也是如此

原因TBD


寻找原因过程中~~~~

host主机中的mysql是可以正常连接的

docker mysql查看初始密码 docker mysql初始化_8.0_31

docker mysql查看初始密码 docker mysql初始化_win10_32

思考:

目前PHP, MySQL版本均是相同, 配置也几乎完全相同, 测试代码也是一致, 为什么docker中却不能工作呢?

TBD  -----> 缓缓~~😐😐😐


同时, 使用PHP 8.0 作为测试, 也是okay的~~

而且, 是分别测试连接 mysql-server 与 mysql-server-1 均是正常~~~~

只不过 PHP 8.0 支持密码验证方式如下:

docker mysql查看初始密码 docker mysql初始化_8.0_33

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方面的知识, 才行, 不然看似很简单的步骤流程, 想要成功实现结果也是有些坑.

重要的是, 不要完全按照教程文档走而不假思索, 否则就会掉入坑中, 而无法爬出.

生活中很多事情也是这样~~~


后续补充

...

3.问题/补充

1. 查看ip地址

apt-get update 

apt-get install net-tools

ifconfig

docker mysql查看初始密码 docker mysql初始化_8.0_34


2. 添加远程连接用户

Docker 中创建 mysql 容器,并设置远程连接 - 云+社区 - 腾讯云

 // 参考其中部分 --  远程登录用户添加

3. 查看PHP changelog 可以知道如下信息

开始支持在DSN中直接使用username和password

PHP: PHP 7 ChangeLog  

docker mysql查看初始密码 docker mysql初始化_docker_35