使用Docker安装MySQL8以上版本
系统使用的为centos7的linux操作系统,非此操作系统请选择其他文章
一、创建目录
使用命令新建log、data、conf目录
mkdir -p /mydata/mysql/log
mkdir -p /mydata/mysql/data
mkdir -p /mydata/mysql/conf
- data 目录:这通常指的是 MySQL 数据目录,用于存储 MySQL 数据库的实际数据文件。在 Docker 中,MySQL 的数据目录默认为 /var/lib/mysql。通过将宿主机上的一个目录映射到容器中的这个目录,可以实现 MySQL 数据的持久化存储,确保即使容器被删除或重新启动,数据库的数据也不会丢失。
- log 目录:这是 MySQL 的日志目录,用于存储 MySQL 数据库的运行日志文件。在 Docker 中,MySQL 的日志目录默认为 /var/log/mysql。将宿主机上的一个目录映射到容器中的这个目录,可以方便地查看和管理 MySQL 的运行日志,包括错误日志、查询日志等。
- conf 目录:这是 MySQL 的配置文件目录,用于存储 MySQL 的配置文件。在 Docker 中,MySQL 的配置文件通常是 /etc/mysql/my.cnf。通过将宿主机上的一个目录映射到容器中的这个目录,可以提供自定义的 MySQL 配置文件,例如调整缓冲区大小、连接限制、字符集设置等。
二、创建容器
1、获取镜像
使用命令拉取MySQL镜像,不屑版本号默认拉取最新的版本latest,如果需要拉取特定版本号可以到官网https://hub.docker.com/_/mysql/tags进行查看,也可通过拉取最新MySQL镜像命令获取可拉取的版本号列表
# 查看docker版本
docker search mysql
# 拉取最新MySQL镜像
docker pull mysql
# 拉取对应版本MySQL镜像
docker pull mysql:8.0.32
2、查看镜像
docker images
3、创建容器
(1)在 /mydata/mysql/conf/ 目录下创建自定义的 custom.cnf 配置文件。文件名随意,文件格式必须为 .cnf 。
vim /mydata/mysql/conf/custom.cnf
MySQL默认配置文件 /etc/my.cnf 末尾中有这么一行:!includedir /etc/mysql/conf.d/ ,意思是,在 /etc/mysql/conf.d/ 目录下新建自定义的配置文件 custom.cnf也会被读取到,而且还是优先读取的(Docker Hub中的MySQL教程文档有说到)。
(2)添加容器运行的配置参数。
[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake
(3)创建容器并运行。一些参数在【方法一创建容器】里面有说明,这里不再细说。
docker run --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
-name
容器名称-v
参数 -v 是 --volume list 的简写,将指定的文件夹挂载为容器的卷(Volume),用来共享文件(日志文件、配置文件、数据文件)/mydata/mysql/log
日志目录/mydata/mysql/data
数据目录/mydata/mysql/conf
配置文件目录-p 3306:3306
参数 -p 是 --publish list 的简写,将3306端口映射到容器的3306端口,对外提供端口。如果同时启动多个mysql容器,对外端口号可以不同,服务之间不会冲突-e MYSQL_ROOT_PASSWORD=123456
参数 -e 是 --env list 的简写,设置环境变量,将 root 用户的密码变量(MYSQL_ROOT_PASSWORD)设置为 123456-d mysql
参数 -d 是 --detach 的简写,指的是容器运行在后台并打印容器ID。后面的mysql可以加版本号,例如mysql:latest、mysql:8.0.31 等等
3、禁用 root 账户被外部工具连接。
进入到容器里,连接mysql,删除mysql数据库user表中 user=“root”,host="%"的那条记录。因为这条数据会允许 root 账户被允许外部工具(如Navicat或SQLyog)连接,实际上,应该禁止这么做,正确做法是只允许 root 账户本地连接。如果想 root 账户继续被外部工具连接,那就把root密码设置得更复杂,过于简单不安全!
切换到 mysql 数据库:
use mysql;
删除mysql数据库user表中 user=“root”,host="%"的那条记录:
delete user from mysql.user where user='root' and host='%';
刷新权限:
flush privileges;
4、创建新账户供外部工具连接
使用 CREATE 创建账户,例如对应mysql.user表中,字段user为 username,字段host为 % ,账号密码为 password,“%”代表任何主机。使用 GRANT 授予账户特定权限。
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
或
create user 'zyt'@'%' identified by 'dbydc&666';
授予账户特定权限。ALL 和 ALL PRIVILEGES 是一样的,可简写为 ALL 。
GRANT ALL ON *.* TO 'username'@'%' WITH GRANT OPTION;
或
grant all on *.* to 'zyt'@'%' with grant option;
刷新账号权限
FLUSH PRIVILEGES;
或
flush privileges;
设置容器自启动。
docker update --restart=always mysql