Docker上跑Mysql的配置

ox01

最近在把项目往Docker上迁,些一篇文章来记录一些值得注意的问题。

0x02

在测试环境Docker上跑Msql时,用如下命令根据镜像创建容器.

docker run --name mysql \
 -p 3306:3306 \
 -v $PWD/Docker/mysql:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=root \
 -d mysql:latest

用Navicat连接时,登录会提示2058。

网上找了一圈基本上是,用以下命令

docker exec -it  CONTAINER_ID  bash

进入容器里面修改一次数据库的密码

mysql -uroot -proot #登陆

use mysql; #选择数据库

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密方式

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新用户密码

FLUSH PRIVILEGES; #刷新权限

修改后问题就解决了,可以登录成功;只是这个方法不适合集群部署。也可以直接在创建镜像的时候添加以下参数来解决;

--default-authentication-plugin=mysql_native_password

0x03

因为创建数据库的时候没有选择默认字符集、排序方式,创建表后varchar类型,输入中文时会变成??????,点设计表后发现创建表的默认字符集是latin1,所以中文乱码了,想要在创建容器时添加如下参数来指定默认的字符集。

--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

0x04

本来以为上面的设置已经万事大吉了,结果跑了一段时间后发现数据库的时间不对了,少了8个小时。检查了一下发现时用系统的默认时区,中国是东八区UTC+8。需要在创建容器的时候添加时区映射。

-e TZ="Asia/Shanghai" 

0x05

汇总后创建容器的语句如下:

docker run --name mysql \
-p 3306:3306 \
-e TZ="Asia/Shanghai" \
-v $PWD/Docker/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:latest \
--default-authentication-plugin=mysql_native_password \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci