MySQL 8.0 - Docker安装 - Win10 - 学习/实践

20 篇文章 1 订阅
15 篇文章 0 订阅

1.应用场景

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

2.学习/操作

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

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

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

后续补充

...

3.问题/补充

1. 查看ip地址

apt-get update 

apt-get install net-tools

ifconfig

2. 添加远程连接用户

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

LNMP-CentOS-Yum_william_n的博客-CSDN博客 // 参考其中部分 --  远程登录用户添加

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

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

PHP: PHP 7 ChangeLog  

4.参考

Docker Hub  // mysql镜像

https://blog.csdn.net/william_n/article/details/105145877 // MySQL 8.0 安装[含Docker安装] - Win10

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

Docker(33)- 如何修改 docker 容器的端口映射 - 小菠萝测试笔记 - 博客园  // Docker(33)- 如何修改 docker 容器的端口映射

https://blog.csdn.net/william_n/article/details/105145877 // host本机安装

后续补充

...

很抱歉,但是根据提供的引用内容,这些是关于在Ubuntu上安装nvidia-docker的指南,而不是在Windows 10上安装nvidia-docker。如果您想在Windows 10上安装nvidia-docker,您可以参考NVIDIA官方文档提供的指南。您可以在https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker上找到有关在Windows上安装nvidia-docker的详细说明。 #### 引用[.reference_title] - *1* [win10下载WSL,安装docker、ubuntu,移动到d盘,并安装nvidia-docker](https://blog.csdn.net/weixin_43877044/article/details/123778621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [win10安装wsl2及nvidia-docker遇到的一些个问题](https://blog.csdn.net/wi162yyxq/article/details/108900242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Windows子系统WSL2 (ubuntu安装 docker、nvidia-docker)](https://blog.csdn.net/wsp_1138886114/article/details/128201910)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值