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