拉取 msyql 镜像
docker pull mysql:8.0.18
创建 mysql 8 守护式容器
docker run -di --name=mysql8 -p 3306:3306 -v /usr/local/tmp:/etc/mysql/tmp --privileged=true -e MYSQL_ROOT_PASSWORD=xxx mysql:8.0.18
进入容器
docker exec -it mysql8[容器id] /bin/bash
进入数据库
- mysql -uroot -pxxx
- use mysql;
-
select host,user from user; 让root能远程连接,host修改为"%",如果是的就不用修改了
image.png - 修改host为%的方法 update user set host='%' where user='root';
- 修改host为%的方法 update user set host='%' where user='root';
- navicate for mysql 远程连接
- use mysql;
- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
或者
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; - FLUSH PRIVILEGES;
- 此时使用 navicat for mysql 远程连接,提示认证问题,因为 mysql8 及之后的加密规则与之前版本的不同
- 修改密码为用不过期
- ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
- 修改密码并指定加密规则为 mysql_native_password
- ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
- 刷新权限
- FLUSH PRIVILEGES;
- 这样navicat for mysql就可以远程连接数据库了;
- docker commit 容器id 指定要创建的镜像名:版本号
- mysql8 创建用户
- 创建用户的操作已经不支持grant的同时创建用户的方式,需先创建用户再进行授权
mysql> grant all on *.* to 'admin'@'%' identified by 'admin123';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'admin123'' at line 1
mysql> create user 'admin'@'%' identified by 'admin123';
Query OK, 0 rows affected (0.06 sec)
mysql> grant all on *.* to 'admin'@'%' ;
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
- 修改密码,注意 'admin'@'%' 这是是 % 还是 localhost 根据用户表 host 决定
alter user 'admin'@'%' IDENTIFIED WITH mysql_native_password by 'admin123456'
MySQL 解决source 命令导入数据库 乱码
- mysql -u root -pxxx --default-character-set=utf8
- use dbname
- source /etc/my.sql
配置文件解决 myql 导入中文乱码
- 进入容器
docker exec -it mysql8 /bin/bash - 修改字MySQL字符集
如果没有 vim 命令,执行以下操作- 执行命令,作用是激活和更新源
apt-get update
这个过程可能比较漫长,不过没关系有解决办法,先不要执行以上命令,如果执行了 ctrl+C 结束执行,修改
/etc/apt/sources.list 文件
image.png
在宿主机任意目录下创建 sources.list 文件,我这里是在 root/callcenter/files 目录下,直接使用 vi sources.list 命令没有会自动创建文件,贴入以下代码,换成国内源地址,保存退出
- 执行命令,作用是激活和更新源
deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
- 执行命覆盖新容器中的 sources.list 文件
docker cp /root/callcenter/files/sources.list mysql:8/etc/apt/sources.list - 重启容器 docker restart mysql8
做完以上操作无误,这个时候执行 apt-get update 命令,更新速度杠杠的
- apt-update 激活后,执行安装 vim 命令
- apt-get install vim
等待安装完成后,就可以使用 vim 命令了
vim /etc/mysql/my.cnf
image.png
- 没有修改之前
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
- 在 [mysqld] 上面添加
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
- 在 [mysqld] 下面添加
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
保存退出
- 修改完之后是这样
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
- 重启容器,就不乱码了
docker restart mysql8 - 如果手一抖配置文件里写做了,到值无法启动,没关系,将 mysql8 容器中的配置文件考出来在覆盖回去即可,具体操作,以我这里为例
- 拷贝容器里的文件
docker cp mysql8:/etc/mysql/my.cnf /usr/local
这里的意思是将 mysql8 容器中的 my.cnf 文件拷贝到宿主机 /usr/local 目录下 - 还原文件,修改正确后在覆盖回去
docker cp /usr/local/my.cnf mysql8:/etc/mysql/my.cnf 将文件在覆盖回去
- 拷贝容器里的文件
网友评论