目的,使用docker部署mysql:8.0.24
问题:docker部署新版的mysql,进入容器后无法使用密码登录mysql,也无法ssh登录
原因有可能是mysql8.0使用的默认加密插件是 caching_sha2_password 而非5.6的 mysql_native_password,当你在控制台使用明文密码登录的时候走的是mysql_native_password加密,而数据库记录的是caching_sha2_password加密后的密码,匹配自然不正确。
拉取mysql:8.0.24
sudo docker pull mysql:8.0.24
在任意目录下新建如下目录结果
mysql/
├── conf/
├── db/
├── docker-compose.yml
├── log/
└── mysql-files/
进入mysql目录,修改docker-compose.yml文件的内容
vim docker-compose.yml
添加如下内容
version: '3.1'
services:
mysql:
container_name: "mysql" #容器名
network_mode: "host" #网络模式 -不懂不改
environment:
MYSQL_ROOT_PASSWORD: "12345678" #root 用户密码
MYSQL_USER: 'shu' # 其他用户的用户名
MYSQL_PASS: '12345678' # 其他用户的密码
image: "mysql:8.0.24" #使用的镜像,镜像不存在会自动下载
restart: always # 启动方式always是自动启动
ports:
- 3306:3306 #映射端口,前面的是宿主机端口
volumes: # 环境值
- "/home/shu/Desktop/docker-container/mysql/mysql-files:/var/lib/mysql-files" #新版的mysql需要添加该项配置
- "/home/shu/Desktop/docker-container/mysql/db:/var/lib/mysql"
- "/home/shu/Desktop/docker-container/mysql/conf:/etc/mysql"
- "/home/shu/Desktop/docker-container/mysql/log:/var/log/mysql"
在mysql目录下使用如下命令测试启动是否成功
docker-compose up
日志中如果有error类型的错误就自信百度。我遇到的错误都在上面解决了。
有错误了就先查看允许的实例
root@shu-Ubuntu-18:/home/shu/Desktop/docker-container/mysql# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
165f1abc6d5d mysql:8.0.24 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes mysql
再停止该实例
root@shu-Ubuntu-18:/home/shu/Desktop/docker-container/mysql# docker stop 165f1abc6d5d
165f1abc6d5d
再删除该实例
root@shu-Ubuntu-18:/home/shu/Desktop/docker-container/mysql# docker rm 165f1abc6d5d
165f1abc6d5d
修改完错误后,在使用如下命令后天运行实例
docker-compose up -d
运行实例后可以使用如下命令进入实例中
docker exec -it 336b607cb00f /bin/bash
测试
mysql -uroot -p
我遇到的问题
当我进入实例中使用mysql -uroot -p命令登录mysql时,密码输入正确但是还是提示我
root@shu-Ubuntu-18:/# mysql -ushu -p
Enter password:
ERROR 1045 (28000): Access denied for user 'shu'@'localhost' (using password: YES)
因为在实例里面,无法登录进msyql,一些mysql的配置也很难修改,于是先在docker-compose.yml添加root用户免密登录mysql
version: '3.1'
services:
mysql:
container_name: "mysql" #容器名
network_mode: "host" #网络模式 -不懂不改
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' #允许root用户免密登录
MYSQL_ROOT_PASSWORD: "12345678" #root 用户密码
MYSQL_USER: 'shu' # 其他用户的用户名
MYSQL_PASS: '12345678' # 其他用户的密码
image: "mysql:8.0.24" #使用的镜像,镜像不存在会自动下载
restart: always # 启动方式always是自动启动
ports:
- 3306:3306 #映射端口,前面的是宿主机端口
volumes: # 环境值
- "/home/shu/Desktop/docker-container/mysql/mysql-files:/var/lib/mysql-files" #新版的mysql需要添加该项配置
- "/home/shu/Desktop/docker-container/mysql/db:/var/lib/mysql"
- "/home/shu/Desktop/docker-container/mysql/conf:/etc/mysql"
- "/home/shu/Desktop/docker-container/mysql/log:/var/log/mysql"
重启实例,进入后就可以免密码登录进入mysql
mysql -uroot
登录进入mysql后,修改相关配置
#查看数据库
show databases;
#切换数据库
use mysql;
#设置密码
#PASSWORD EXPIRE NEVER 密码永不过期
#mysql_native_password 加密插件
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456' PASSWORD EXPIRE NEVER;
参考https://blog.csdn.net/sinat_41632924/article/details/113251336
Mysql8之后的版本貌似都默认禁止远程登录,所有在这一并修改好
先使用标准登录方式登录mysql,后面的某些命令需要标准登录方式。
mysql -uroot -p -hlocalhost
登录进入后
依次输入如下命令
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select host, user, authentication_string, plugin from user;
+-----------+------------------+------------------------------------------------------------------------+-----------------------+
| host | user | authentication_string | plugin |
+-----------+------------------+------------------------------------------------------------------------+-----------------------+
| localhost | root | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 | mysql_native_password |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
+-----------+------------------+------------------------------------------------------------------------+-----------------------+
4 rows in set (0.00 sec)
mysql> update user set host='%' where user='root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> select host, user, authentication_string, plugin from user;
+-----------+------------------+------------------------------------------------------------------------+-----------------------+
| host | user | authentication_string | plugin |
+-----------+------------------+------------------------------------------------------------------------+-----------------------+
| % | root | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 | mysql_native_password |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
+-----------+------------------+------------------------------------------------------------------------+-----------------------+
4 rows in set (0.00 sec)
查看user表的root用户Host字段是localhost,说明root用户只能本地登录,现在把他改成远程登录。
执行后还不可以远程登录就参考下面的链接继续做出更改,我是到这一步就可以了。
参考https://blog.csdn.net/qq_32448349/article/details/82428696
上面链接中的如下两行命令可能执行报错,需要使用标准模式登录参考
输入命令 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';