Docker安装MySQL8.0

Docker安装MySQL8.0

拉取最新版mysql镜像
docker pull mysql

查看镜像
docker images -a

运行容器
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

1
2
3
–name: 容器名,此处命名为mysql
-e: 配置信息,此处配置mysql的root用户的登录密码
-p: 端口映射,此处映射 主机3306端口 到 容器的3306端口

如果要建立目录映射

1
2
3
4
5
6
7
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:latest
-v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录

检查容器是否正确运行
docker container ls | docker ps -a

进入容器

1
2
docker exec -it mysql bash
mysql -uroot -p123456

宿主机链接容器的mysql(远程连接mysql)
我们在创建容器的时候已经将容器的3306端口和主机的3306端口映射到一起,所以我们应该访问:

1
2
3
4
host: 127.0.0.1
port: 3306
user: root
password: 123456

如果你的容器运行正常,但是无法访问到MySQL,一般有以下几个可能的原因:

caching_sha2_password问题
为了提供更安全的密码加密MySQL8.0的首选默认认证插件是,caching_sha2_password而不是mysql_native_password

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> use mysql;
mysql> select host, user, plugin from user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| % | root | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | mysql_native_password |
+-----------+------------------+-----------------------+

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

或者

1
2
3
4
5
6
7
docker exec -it mysql bash
mysql -uroot -p123456

配置 mysql.cnf 配置默认身份验证插件
/etc/mysql/
[mysqld]
default_authentication_plugin = mysql_native_password

防火墙阻拦

开放端口:
systemctl status firewalld
firewall-cmd --zone=public --add-port=3306/tcp -permanent
firewall-cmd --reload

关闭防火墙:
systemctl stop firewalld

需要进入docker本地客户端设置远程访问账号

1
2
3
4
docker exec -it mysql bash
mysql -uroot -p123456

grant all privileges on *.* to root@'%' identified by "password";

mysql使用mysql数据库中的user表来管理权限,修改user表就可以修改权限(只有root账号可以修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use mysql;

select host, user, plugin from user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| % | root | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | mysql_native_password |
+-----------+------------------+-----------------------+

grant all privileges on *.* to root@'%' identified by "password";


flush privileges;