前端学习 Docker 之旅(四)—— 安装 MySQL 并启动、连接,修改时区

  这两年 Docker 比较火,很多大厂都在使用。这里记录一下 Cent OS 中使用 Docker 安装 MySQL 并启动、连接的过程。

  建议切换 root 用户进行以下操作

一、安装 MySQL

1、查找镜像

在 Docker Hub 官网查找自己需要的版本 https://hub.docker.com/_/mysql?tab=tags

2、下载镜像

我选择的是 5.7 版本:

1
docker pull mysql:5.7

3、创建项目文件夹并进入

  仅限服务器端本地创建一个文件夹用来存放 MySQL 的配置文件、日志以及数据等(也就是挂载目录,作用是将此目录中的文件或文件夹覆盖掉容器内部的文件或文件夹)

1
2
mkdir -p /mnt/docker/mysql
cd /mnt/docker/mysql

二、运行 MySQL

1、使用镜像创建容器并运行

1
docker run -p 6033:3306 -d --name mysql-5.7 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

指令解释:

  • -p 表示端口映射,-p 宿主机 port:容器 port
  • -d 表示后台运行并返回容器 id,只有在父进程即 docker 进程退出的时候才会去把容器退出,除非你使用了--rm选项。如果你在运行容器时将-d--rm两个选项一起使用,那么容器会在退出或者后台进程停止的的时候自动移除掉(只要一个情况便会自动移除镜像)
  • --name 表示给容器指定的名称
  • -v $PWD/conf:/etc/mysql/conf.d 表示将主机上当前目录下的 conf/my.cnf 文件挂载到容器的 /etc/mysql/my.cnf
  • -v $PWD/logs:/logs 表示将主机上当前目录下的 logs 目录挂载到容器的 /logs
  • -v $PWD/data:/var/lib/mysql 表示将主机上当前目录下的 data 目录挂载到容器的 /var/lib/mysql
  • -e MYSQL_ROOT_PASSWORD=123456 表示初始化 root 用户的密码

注意
  本地 Docker 安装 MySQL 时可以不使用 -v 挂载文件夹,如下:

1
docker run -p 3306:3306 -d --name mysql-5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

2、进入容器

1
docker exec -it mysql-5.7 bash

3、进入 MySQL

1
mysql -uroot -p123456

4、可能用到的命令

1
mysql_upgrade -u root -p --force

5、mysql 修改密码

需要先进入 MySQL 再执行:

1
2
update mysql.user set authentication_string=password('newPassword') where user='root';
flush privileges;

三、Linux 修改时间及时区

1、查看本机时间

1
date

  在 Linux 中与时间相关的文件有:/etc/localtime/etc/timezone

2、修改本机时间

1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

  在/usr/share/zoneinfo下存放着不同时区格式的时间文件,执行以上命令,可以将本机时间调整至目标时区的时间格式。但是调整了时间格式,本机所属的时区是保持不变的!

3、修改本机时区

  在 Linux 中,有一些程序会自己计算时间,不会直接采用带有时区的本机时间格式,会根据 UTC 时间和本机所属的时区等计算出当前的时间,new 出来的时间还是 UTC 时间,所以必须得修正本机的时区。

1
echo 'Asia/Shanghai' >/etc/timezone

四、MySQL 配置

1、修改时间

1
select now();

执行 yum install vim -y 然后执行 vim /etc/my.cnf[mysqld] 区域中加上 default-time_zone = '+8:00'

1
docker restart mysql-5.7

2、最大连接数

1
SHOW VARIABLES LIKE 'max_connections';

3、当前连接数

1
SHOW STATUS LIKE 'Threads_connected';

4、设置最大连接数

1
SET GLOBAL max_connections = 1000;

五、部分问题

eggjs 中连接 MySQL 的 docker 容器报错

  eggjs 连接 MySQL 的 docker 容器,报错:Client does not support authentication protocol requested by server; consider upgrading MySQL client

解决办法

  MySQL 中执行如下语句:

1
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';

% 表示允许来自任何 ip 的连接
localhost 表示允许本机的连接

only_full_group_by (不建议)

  在 MySQL 5.7 后,默认开启了 SQL_MODE 严格模式,对数据进行严格校验。如果代码中含有 group by 聚合操作,那么 select 中的列,除了使用聚合函数之外的,如 max()、min() 等,都必须出现在 group by 中。比如以下语句就会报错:

1
2
SELECT * FROM student GROUP BY name;
SELECT name, age FROM student GROUP BY name;

  需要修改为:

1
2
SELECT name, age FROM student GROUP BY name, age;
SELECT name FROM student GROUP BY name;

  不过这样可能会缺失想要的信息。我们可以进入数据库执行 select @@global.sql_mode; 查询 sql_mode 的值,编辑/etc/my.cnf,将 sql_mode 的值修改为去除 ONLY_FULL_GROUP_BY 后的值,然后重启 MySQL 即可。

1
docker exec -it mysql-5.7 bash

  vim /etc/my.cnf,添加一行,保存后重启 mysql。

1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1
docker restart mysql-5.7
以上

随笔标题:前端学习 Docker 之旅(四)—— 安装 MySQL 并启动、连接,修改时区

随笔作者:刘先玉

发布时间:2020年02月06日 - 12:04:22

最后更新:2020年12月15日 - 14:21:12

原文链接:https://liuxianyu.cn/article/docker-c.html