这两年 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 | mkdir -p /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 | update mysql.user set authentication_string=password('newPassword') where user='root'; |
¶三、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 | SELECT * FROM student GROUP BY name; |
需要修改为:
1 | SELECT name, age FROM student GROUP BY name, age; |
不过这样可能会缺失想要的信息。我们可以进入数据库执行 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 |