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容器测试

  1. 进入MySQL容器
docker exec -it mysql /bin/bash
  1. 登陆mysql, 密码是上面设的 root@12345678
mysql -u root -p

8、客户端连接测试

如果连接不上,则查看宿主机防火墙有没关闭或者是上面暴露端口号配置是否正确。

查看状态: systemctl status firewalld
关闭: systemctl stop firewalld
开机禁用: systemctl disable firewalld
posted @ 2023-12-19 16:17  右手一个柚  阅读(359)  评论(0编辑  收藏  举报