1 参考博文链接如下
2 准备环境
确保你的环境已经安装完docker 和dockercompoose
docker 环境查看
docker -v
docker compoose 环境查看
docker compose version
如果没有安装,请先安装(如果还没有安装 Docker,请参考以往篇博,或者百度也可以)。
dockerhub 官方mysql的镜相的版本
docker pull mysql:8.4.5
可以拉镜相,后续docker compoose启动就很快
https://hub-stage.docker.com/_/mysql/tags?name=8.4.5
3 docker compse 文件
3.1 目录约定
数据和配置目录(可以根据自已的情况来,但需要同yaml里的配置一样)
mkdir -p /data/docker-data/mysql/8.4.5/data/mysql
mkdir -p /data/docker-data/mysql/8.4.5/config
mkdir -p /data/docker-data/mysql/8.4.5/backups
注意文件目录权限避免后续写文件的错误,作者偷赖直接给了最大的权限:
chmod -R 777 /data/docker-data/mysql/8.4.5
3.2 docker compose 文件
# dev-mysql-docker.yml
name: dev-db-mysql
services:
#节点1
mysql:
# zk镜像版本
image: mysql:8.4.5
# 当前容器名
container_name: dev_db_msql
# 当前容器主机名
hostname: dev_db_msql
ports:
# 端口
- "3306:3306"
volumes:
# 数据持久化目录
- mysql_data:/var/lib/mysql
# 配置文件
- ./config/my.cnf:/etc/mysql/conf.d/my.cnf:ro
- ./backups:/backups
- /etc/localtime:/etc/localtime:ro
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: dev_db
MYSQL_USER: dbuser1
MYSQL_PASSWORD: db123456
TZ: "Asia/Shanghai"
# 获取宿主机root权限
privileged: true
# 容器开机自启
restart: unless-stopped
networks:
- backend
# 健康检查配置
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 3
# 资源限制(生产环境必备)
deploy:
resources:
limits:
memory: 256M
cpus: "1.0"
volumes:
mysql_data:
driver: local
driver_opts:
type: none
device: ./data/mysql
o: bind
networks:
# 自定义网络定义
backend:
driver: bridge
3.3 my.cnf
配置文件
my.cnf 在config的目录下
文件内容
###### [client]配置模块 ######
[client]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock
###### [mysql]配置模块 ######
[mysql]
# 设置MySQL客户端默认字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock
###### [mysqld]配置模块 ######
[mysqld]
# 绑定 IP 允许远程访问
bind-address=0.0.0.0
port=3306
user=mysql
# 设置sql模式 sql_mode模式引起的分组查询出现*this is incompatible with sql_mode=only_full_group_by,这里最好剔除ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id = 1
# MySQL8.4以前的密码认证插件如果不设置低版本navicat无法连接,以后不需要了
# default_authentication_plugin=mysql_native_password
# 禁用符号链接以防止各种安全风险
symbolic-links=0
# 允许最大连接数
max_connections=500
# InnoDB 缓冲池大小
innodb_buffer_pool_size=512M
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 0: 表名将按指定方式存储,并且比较区分大小写;
# 1: 表名以小写形式存储在磁盘上,比较不区分大小写;
lower_case_table_names=0
max_allowed_packet=128M
# 设置时区
default-time_zone='+8:00'
这表配置文件权限
chmod +x my.cnf
4 启动 compose
可以查镜相是否拉取完成(docker images),不看也可以,在运行时不存在也会去拉取的
启动
docker compose -f dev-db-mysql-docker.yaml up -d
4.1 MySQL 命令:
进入容器命令:
docker exec -it dev_db_msql bash
docker exec -it dev_db_msql bash
:进入名为mysql
的容器并启动一个 bash shell,允许你在容器内执行命令
mysql -u root -p
mysql -uroot -p:使用 root 用户登录 MySQL。系统会提示你输入密码(在之前的命令中设置为 King1Q2W#F)。
CREATE USER 'admin'@'%' IDENTIFIED BY 'King1Q2W#F';
GRANT ALL ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;
CREATE USER 'admin'@'%' IDENTIFIED BY 'King1Q2W#F';:创建一个名为 admin 的新用户,允许从任何主机(%)连接,并设置其密码为 King1Q2W#F。
admin'@'%'设置 MySQL 远程访问属性
GRANT ALL ON *.* TO 'admin'@'%';:授予 admin 用户对所有数据库和表的所有权限。
FLUSH PRIVILEGES;:刷新权限,使刚才的权限修改生效
4.2 开放 3306 端口
检查防火墙状态:
sudo firewall-cmd --list-ports
或者:
sudo iptables -L -n
如果使用 firewalld,可以这样开放 3306 端口:
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
4.3 连接IDEA测试mysql是否正常
查看自定义配置的一些参数值如max_connections:
show variables like 'max_connections';
到此,docker 安装mysql 8.4.5 已经初步完成了,可以开始使用mysql了。
4.4 停止:
docker compose -f dev-db-mysql-docker.yaml stop