潘逸安的博客

潘逸安

docker搭建mysql8

目录结构

1
2
3
4
5
.
├── conf
│   └── my.cnf
├── data
└── log

conf/my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8mb4_general_ci'
init_connect='SET NAMES utf8mb4'
#服务器默认编码格式
character-set-server=utf8mb4
#服务器默认字符集
collation-server=utf8mb4_general_ci
# 跳过mysql程序起动时的字符参数设置 ,使用服务器端字符集设置
skip-character-set-client-handshake
# 跳过域名解析,只能使用127.0.0.1
skip-name-resolve
secure_file_priv=/var/lib/mysql
default_authentication_plugin= mysql_native_password

docker构建命令

1
2
3
4
5
6
7
8
9
10
11
docker run \
-v /root/docker/mysql/log:/var/log/mysql \
-v /root/docker/mysql/data:/var/lib/mysql \
-v /root/docker/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=rootroot \
-p 3306:3306 \
-u root \
--restart=always \
--privileged=true \
--name mysql \
-d mysql:8

如果mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)

-v /home/vagrant/docker/mysql/conf:/etc/mysql \

改成

-v /home/vagrant/docker/mysql/conf:/etc/mysql/conf.d \

不加 -v /data/mysql/mysql-files:/var/lib/mysql-files \ 会报错误

1
mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory

登录 Docker 中的 Mysql 存在两种情况

第一种(可行)

  1. 使用命令 docker exec -it mysql /bin/bash 进入容器
  2. 使用命令 mysql -uroot -p 按下 enter 再按 enter 直接登录到 Mysql 里面去,因为里面 root 用户对应的密码是空的
  3. 给 root 用户设置密码
1
2
3
4
# 修改用户对应的密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限
flush privileges;
  1. 需要远程连接时,执行如下命令
1
2
CREATE USER 'root'@'%' IDENTIFIED BY '用户密码';
flush privileges;
  1. 创建出来的用户是没有任何创建数据库权限的,需要执行如下命令进行授权
1
2
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;

第二种(不可行)

  1. 在执行生成 mysql 容器的时候,我们设置了 mysql 初始密码的,使用那个密码,即可直接登录到 mysql

说明一下 Mysql 的配置 my.cnf

1
2
3
4
5
6
7
[mysqld]
# 禁止表名大小写验证
lower_case_table_names=1
# 禁用dns解析,所以在mysql的授权表中就不能使用主机名了,只能使用IP
skip-name-resolve
# mysql8的安全机制升级而需要修改的配置,不配置的话将无法登录管理
default_authentication_plugin= mysql_native_password

问题

发现docker容器无法启动,报错如下:

1
2
Failed to access directory for --secure-file-priv. Please make sure 
that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files

windows下:修改my.ini 在[mysqld]内加入secure_file_priv=/var/lib/mysql
linux下:修改my.cnf 在[mysqld]内加入secure_file_priv=/var/lib/mysql