Skip to content

Docker 安装 MySQL 8(个人镜像)

由于官方镜像默认时区、字符集编码、密码验证方式等不适合,因此提供了自定义的个人镜像。

Dockerfile 介绍

mysql 8.0 镜像 时区:上海 东八区时区;编码:utf8mb4

官方镜像:https://hub.docker.com/_/mysql

官方 Github: https://github.com/docker-library/mysql/blob/4af273a07854d7e4b68c5148b8e23b86aa8706e2/8.0/Dockerfile

创建容器

txt
docker run \
--name mysql \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-e MYSQL_DATABASE=appmaster \
-e MYSQL_USER=appmaster \
-e MYSQL_PASSWORD=appmaster \
-v /var/lib/mysql/:/var/lib/mysql/ \
-d registry.cn-hangzhou.aliyuncs.com/mengweijin/mysql:latest

参数说明

-e MYSQL_ROOT_PASSWORD=root:指定 root 用户的密码为 root

-v /var/lib/mysql/:/var/lib/mysql/:挂载卷/var/lib/mysql/

可选参数

-e MYSQL_DATABASE=app_master \:创建一个名为 app_master 的数据库

-e MYSQL_USER=appmaster \:指定 app_master appmaster ,该用户对当前数据库拥有所有权限

-e MYSQL_PASSWORD=appmaster \:指定 app_master 数据库的 appmaster 用户的密码为 appmaster

创建数据库、用户并授权

创建数据库:
mysql> create database test_database;

创建用户(joe):
mysql> CREATE USER 'joe'@'%' IDENTIFIED BY '123456';
或者只能本地主机登录方式创建:
mysql> CREATE USER 'joe'@'localhost' IDENTIFIED BY '123456';

授权:
mysql> grant all privileges on test_database.* to 'joe'@'localhost' identified by '123456';

刷新权限:
mysql> flush privileges;

编码说明:当前镜像使用 utf8 编码

注意:当前镜像修改了默认身份验证插件为 mysql_native_password 以兼容客户端工具的连接。

mysql5.8 开始将 caching_sha2_password 作为默认的身份验证插件。该 caching_sha2_password 和 sha256_password 认证插件提供比 mysql_native_password 插件更安全的密码加密,并 caching_sha2_password 提供了比更好的性能 sha256_password。由于这些优越的安全性和性能特性,caching_sha2_password 它是 MySQL 8.0 首选的身份验证插件,而且也是默认的身份验证插件而不是 mysql_native_password。此更改会影响服务器和 libmysqlclient 客户端库;目前来说和经常使用的客户端软件兼容性不好。

在 MySQL 5.7 中,默认的身份验证插件是 mysql_native_password!

即,mysql5.8 版本及以后的版本中,由于 navicat 等客户端工具只支持 mysql_native_password 验证插件,不支持 caching_sha2_password 验证插件,当使用 navicat 等客户端工具无法连接 mysql5.8 版本及以后的版本,为了解决这个问题:

(1)配置/etc/mysql/conf.d/mysql.cnf,这将放弃提供的改进的身份验证安全性 caching_sha2_password

[mysqld]
    default_authentication_plugin=mysql_native_password

(2)也可以修改用户的方式解决,如:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';