docker安装mysql8

查找mysql的docker镜像

docker search mysql

拉取镜像

docker pull mysql

查看最新版本号

mysql --version
mysql  Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)

运行

mkdir -p ./mysql/conf 
mkdir -p ./mysql/logs
mkdir -p ./mysql/data

创建./mysql/conf/mysql.cnf 文件,并更新内容如下
[client]     
port=3306   
default-character-set=utf8
[mysql]   
default-character-set=utf8
[mysqld]
max_allowed_packet = 20M
#skip-grant-tables
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

运行命令启动mysql容器
docker run -p 3306:3306 --name msql -v $PWD/mysql/conf/:/etc/mysql/conf.d -v $PWD/mysql/logs:/logs  -v $PWD/mysql/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql


    -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
    -v $PWD/mysql/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
    -v $PWD/mysql/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
    -v $PWD/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
    -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

如果需要远程连接mysql 3306端口,可以设置

  • 建议方式
首先通过查看MySQL的的用户信息
mysql -uroot -p123456
mysql> use user;
mysql> select  host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)
如果host字段均为localhost,意思是只允许本地IP访问,可以执行 
mysql> update mysql.user set host = '%' where user = 'root';
然后执行 
mysql> flush privileges;
让改动生效
例如上面的内容已经满足要求了,但是还是不能远程连接,则是因为MySql 8版本修改了默认的加密规则,用Navicat连接会报错,解决办法为执行如下语句
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
'root'@'%' 中root为用户名,'%'为user表host字段的值。'root123'为用户密码。
然后就远程连接了
  • 不建议使用的方式如下,虽然可以解决,但是通过本地连接会失败
docker exec -it msql /bin/bash
mysql -uroot -p123456
#授权
mysql> GRANT ALL ON *.* TO 'root'@'%';
#刷新
mysql> flush privileges;
#更新加密规则
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
mysql> flush privileges;

我通过navcat运行sql语句的时候出了如下的问题

  • MySQL [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause
docker exec -it msql /bin/bash
mysql -uroot -p123456
#授权
mysql> select @@sql_mode;

将查询出来的内容去掉GROUP字样的字段后如下,并将如下内容放到配置文件里,重启容器
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • mysql -uroot -p 本地连接时 Access denied for user ‘root’@‘localhost’ (using password: YES)
在mysql.cnf配置文件中添加 skip-grant-tables ,重启容器docker restart name
之后
docker exec -it msql /bin/bash
mysql -uroot -p123456
mysql> select @@sql_mode;
修改密码永不过期的
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码' PASSWORD EXPIRE NEVER;
mysql> select @@sql_mode;
其他:
密码有限期的
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码' PASSWORD EXPIRE;

你可能感兴趣的:(docker,mysql,docker)