Docker部署MySQL5.7
1、拉取MySQL镜像
docker pull mysql:5.7
2、查看镜像
docker images
3、创建存储MySQL数据信息的目录
在根目录下创建/data/docker/mysql目录,用于挂载存储mysql的数据信息
mkdir /data/docker/mysql -p
4、宿主机创建MySQL配置文件
4.1、创建conf目录
在/data/docker/mysql目录下创建conf文件夹,用于存储mysql的配置文件
mkdir /data/docker/mysql/conf -p
4.2、创建 mysql.cnf
配置文件
在/data/docker/mysql/conf下创建一个名称为mysql.cnf的配置文件,进行mysql的一些配置
4.3、编辑mysql.cnf
配置文件
vim /data/docker/mysql/conf/mysql.cnf
将下面内容粘贴到配置文件中即可
[mysqld]
# 解决使用group by进行分组查询时报错
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 数据库表名忽略大小写设置
lower_case_table_names = 1
4.3.1、场景一
由于MySQL5.7.5后only_full_group_by成为sql_mode的默认选项之一,这可能导致一些sql语句失效,比如在使用group by进行分组查询时报错:
SELECT list is not in GROUP BY clause and contains nonaggregated column 'wk_crm_single.ccbs.status_i
在sql命令行中输入 select @@sql_mode;
这时我们能够看到自己的sql_mode配置,其中如果有ONLY_FULL_GROUP_BY,那它就是group by查询报错的罪魁祸首了。
解决办法: 修改 /etc/mysql/conf.d/mysql.cnf
文件,在文件中 sql_mode =
处删除 ONLY_FULL_GROUP_BY
即可。
如果文件中没有sql_mode =
配置,将下面配置粘贴进去保存即可。
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
4.3.2、场景二
数据库表名忽略大小写设置
添加 lower_case_table_names=1
配置到该配置文件中
lower_case_table_names = 1
5、创建容器
创建MySQL容器,并初始化root用户密码为 root@12345678
docker run -id --name=mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root@12345678 \
-e TZ=Asia/Shanghai \
-e LANG=en_US.UTF-8 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/docker/mysql/conf:/etc/mysql/conf.d \
-v /data/docker/mysql/logs:/var/log/mysql \
-v /data/docker/mysql/data:/var/lib/mysql \
--restart=always \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci
如果想要创建一个新的用户,即在上面那个命令的基础上加上2个配置
-e MYSQL_USER="sgz" \
-e MYSQL_PASSWORD="123456" \
全命令语句如下:
docker run -id --name=mysql -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root@12345678 \
-e MYSQL_USER="sgz" \
-e MYSQL_PASSWORD="123456" \
-e TZ=Asia/Shanghai \
-e LANG=en_US.UTF-8 \
-v /etc/localtime:/etc/localtime:ro \
-v /data/docker/mysql/conf:/etc/mysql/conf.d \
-v /data/docker/mysql/logs:/var/log/mysql \
-v /data/docker/mysql/data:/var/lib/mysql \
--restart=always \
mysql:5.7 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_general_ci
命令配置解释:
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口 ,即将容器的3306端口映射到宿主机的3306端口
-e 代表添加环境变量, MYSQL_ROOT_PASSWORD 是 MySQL中root 用户的登陆密码,即初始化root用户的密码
-v /data/docker/mysql/conf:/etc/mysql/conf.d :MySQL配置目录挂载到宿主机
-v /data/docker/mysql/logs:/var/log/mysql :MySQL日志目录挂载到宿主机
-v /data/docker/mysql/data:/var/lib/mysql:MySQL数据目录挂载到宿主机,这个还是建议挂载,是存储数据的,容器down掉,还能再次挂载获取到数据。
--restart=always :当 Docker 重启时,容器能自动启动,这个必须放在镜像名前面
--character-set-server:为mysql字符集设置 可以不加
-e MYSQL_ROOT_PASSWORD=123456: 初始化 root 用户的密码
-e TZ=Asia/Shanghai :将容器中的时区设置为上海时区(即东8区),Docker容器默认使用UTC时区,与北京时间相差 8 个小时。
-v /etc/localtime:/etc/localtime:ro :修改容器时间和宿主机一致。
6、查看容器
查看正在运行容器:docker ps
查看所有的容器(启动与未启动的容器):docker ps -a
7、登录Mysql容器测试
- 进入MySQL容器
docker exec -it mysql /bin/bash
- 登陆mysql, 密码是上面设的 root@12345678
mysql -u root -p
8、客户端连接测试
如果连接不上,则查看宿主机防火墙有没关闭或者是上面暴露端口号配置是否正确。
查看状态: systemctl status firewalld
关闭: systemctl stop firewalld
开机禁用: systemctl disable firewalld