[toc]
MySQL容器笔记
ubuntu 24 安装MySQL容器
MySQL容器中的这几个文件和目录都需要挂载到宿主机中,以便后续修改和查看。
- /shuyx/docker/mysql/data 目录,是MySQL容器的数据目录,关联mysql容器的/var/lib/mysql目录
- /shuyx/docker/mysql/log 目录,是MySQL容器的日志目录,关联mysql容器的/var/log/mysql目录
- /shuyx/docker/mysql/conf.d 目录,是MySQL容器的配置目录,关联mysql容器的/etc/mysql/conf.d目录
/etc/mysql/conf.d目录的作用?
/etc/mysql/conf.d是 MySQL 官方预留的自定义配置目录。核心作用如下:
- 配置加载优先级:MySQL 启动时,会先加载默认配置(/etc/mysql/my.cnf配置文件),再加载conf.d目录下所有.cnf后缀的文件,自定义配置会覆盖默认配置。
- 运维友好性:容器化场景下,挂载该目录到宿主机后,你无需进入容器,直接在宿主机修改.cnf配置文件,重启容器即可生效,避免修改容器内核心配置导致的混乱。
- 隔离性:自定义配置和 MySQL 默认配置分离,重建容器时,只需保留conf.d目录的配置文件,就能复用所有自定义规则(比如字符编码、连接数等)。
简单说:conf.d目录就是 MySQL 给用户留的 “配置入口”,专门用来放自定义规则,不碰系统默认配置,是最佳实践。
安装过程
① 先在宿主机中创建目录,用于存放MySQL容器的配置文件和目录。
# 该目录用于存储MySQL容器中的配置、数据、日志目录等。
mkdir /shuyx/docker/mysql
mkdir /shuyx/docker/mysql/data
mkdir /shuyx/docker/mysql/log
mkdir /shuyx/docker/mysql/conf.d这些目录都是在宿主机的/shuyx/docker目录下。也可以自定义为其他路径。
② 创建并运行Nginx容器,有两种写法
命令行写法
# --name myMysql 容器名称为myMysql
# -p 33306:3306 宿主机的33306端口映射到容器的3306端口
# -e MYSQL_ROOT_PASSWORD=123456 设置mysql root用户的密码为123456
# -e TZ=Asia/Shanghai 设置mysql容器的时区为东八区
# mysql:8.0.20 是mysql镜像名,指定生成该容器的镜像
docker run -d --name myMysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e TZ=Asia/Shanghai -v /shuyx/docker/mysql/conf.d:/etc/mysql/conf.d -v /shuyx/docker/mysql/log:/var/log/mysql -v /shuyx/docker/mysql/data:/var/lib/mysql mysql:8.0.20
# 查询容器是否运行
docker ps
# 查询容器日志,看是否成功启动。
docker logs myMySQL- 正式环境中,数据库密码建议使用强密码,避免使用弱密码。
- 如果是在云服务器上部署Mysql容器,记得在云服务器的防火墙上开通对应端口。
docker-compose.yml 写法
创建docker-compose.yml文件,并编写如下内容。
# services 配置。用于定义每个服务(即容器)的配置信息,包括服务名称、镜像、端口映射、环境变量等。
services:
mysql-service:
image: mysql:8.0.20
# 容器启动命令,设置utf8字符集
environment:
- MYSQL_ROOT_PASSWORD=123456 # 设置 root 用户密码
- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
volumes:
- '/shuyx/docker/mysql/conf.d:/etc/mysql/conf.d'
- '/shuyx/docker/mysql/data:/var/lib/mysql'
- '/shuyx/docker/mysql/log:/var/log/mysql'
ports:
- "33306:3306"然后再docker-compose.yml文件所在目录执行如下命令启动mysql容器
# 启动mysql容器
docker-compose up -d
# 查询容器是否运行
docker ps③ 使用navicat等数据库连接工具,连接mysql容器。

创建自定义配置文件
先确保mysql容器的conf.d目录已经挂载到宿主机中(比如/shuyx/docker/mysql/conf.d),然后在该目录下创建自定义配置文件。
① 先创建一个自定义配置文件my.cnf,后缀必须是.cnf。
my.cnf 内容如下:
[client] # 客户端连接时的编码(比如navicat、mysql命令行)
default-character-set = utf8mb4
[mysql] # mysql命令行工具的编码
default-character-set = utf8mb4
[mysqld] # MySQL服务端核心编码(最关键)
# 服务器默认字符集
character-set-server = utf8mb4
# 服务器默认排序规则(适配中文)
collation-server = utf8mb4_unicode_ci
# 跳过字符集检测,加速启动
skip-character-set-client-handshake
# 确保临时表/排序使用utf8mb4
init_connect = 'SET NAMES utf8mb4'
# 支持emoji等4字节字符(避免插入失败)
character-set-client-handshake = FALSE② 重启 MySQL 容器使配置生效
# 重启mysql容器
docker restart myMySQL
# 宿主机终端中执行,下面命令。进入myMySQL容器终端
docker exec -it myMySQL
# 进入mysql容器终端后,执行以下命令进入到mysql命令行模式
$> mysql -uroot -p123456
# 输入密码后,执行以下命令查看字符编码
mysql> SHOW VARIABLES LIKE '%character%';
mysql> SHOW VARIABLES LIKE '%collation%';在windows docker环境中安装MySQL容器
在windows系统中,安装docker环境,并在docker环境中安装mysqL容器。
步骤① 先安装docker环境,自行百度。
步骤② 下载mysql镜像文件。最新版或某个版本
# 下载mysql 8.0.20版本的镜像
docker pull mysql:8.0.20
# 查询镜像
docker images步骤③:创建并启动mysql容器
# 创建mysql容器
# --name="myMySQL" myMySQL是容器的名称
# -d 后台启动
# -e MYSQL_ROOT_PASSWORD=123456 , -e 设置环境变量。此处是设置mysql密码
# -p 33306:3306 , 宿主机的33306端口映射到容器的3306端口
# -v 设置容器数据卷
# /d/DockerVolumes/mysql/log 是宿主机目录 /var/log/mysql 是容器存放日志信息的目录
# /d/DockerVolumes/mysql/data 是宿主机目录 /var/lib/mysql 是容器存放数据库数据的目录
# /d/DockerVolumes/mysql/conf.d 是宿主机目录 /etc/mysql/conf.d 是容器存放配置文件的目录
docker run -d -p 33306:3306 --name="myMySQL" -e MYSQL_ROOT_PASSWORD=123456 -v /d/DockerVolumes/mysql/log:/var/log/mysql -v /d/DockerVolumes/mysql/data:/var/lib/mysql -v /d/DockerVolumes/mysql/conf.d:/etc/mysql/conf.d mysql:8.0.20
# 查询容器日志,看是否成功启动。
docker logs myMySQL由于宿主机的操作系统是windows,因此/d/DockerVolumes/是指D盘中的DockerVolumes目录。如果宿主机操作系统是linux,请自行选择宿主机目录。
步骤④:进入到mysql容器中
# 进入到容器中
docker exec -it myMySQL /bin/bash
# 进入到mysql命令行模式
mysql -uroot -p123456
解决docker中的mysql容器的中文字符编码问题
- 先进入到mysql容器的mysql终端中,容器名称为myMySQL
# 先进入到容器终端
docker exec -it myMySQL /bin/bash
# 登录进入到mysql终端
mysql -uroot -p123456
# 查询mysql的字符集
mysql> show variables like 'character%';
mysql> show variables like 'collation%';
如图所示,由于在mysql容器中的字符编码不是utf8。因此我们需要重新设置mysql的字符编码。由于上面创建mysql容器的时候设置了容器数据卷。因此可以直接在宿主机的conf.d目录中创建my.cnf配置文件即可。
- 在conf.d目录中创建my.cnf配置文件。并添加字符编码配置。
不同版本的mysql的修改字符编码的方式不同。下面是mysql 8.0.20版本的配置写法。
[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake- 重新启动mysql容器,让配置文件生效。
# 重启容器,
docker restart myMySQL
# 注意如果配置文件错误,会导致容器重启失败。此时可以查询docker容器日志来寻找原因。
# 查询mysql01容器的日志信息
docker logs myMySQL- 如图所示,字符编码改为了utf8mb4。

docker mysql主从集群
在docker中创建两个mysql容器,组成mysql集群,从而实现mysql主从复制。
- 先创建主从mysql容器的目录
# 先创建mysql容器映射的目录
mkdir /home/mysql02
# 创建主mysql容器映射的目录
mkdir /home/mysql02/master
mkdir /home/mysql02/master/conf
mkdir /home/mysql02/master/data
mkdir /home/mysql02/master/log
# 创建从mysql容器映射的目录
mkdir /home/mysql02/slave
mkdir /home/mysql02/slave/conf
mkdir /home/mysql02/slave/data
mkdir /home/mysql02/slave/log- 先在mysql容器的配置目录中创建配置文件my.cnf
主my.cnf配置文件如下
[mysqld]
#主服务器唯一ID
server-id=120
#启用二进制日志,名称可以随便取(关键)
log-bin=mysql-bin
#设置logbin格式
binlog_format=STATEMENT从my.cnf配置文件如下
[mysqld]
#从服务器唯一ID
server-id=130
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
#启用中继日志
relay-log=mysql-relay- 创建并启动主从mysql容器
# 创建并启动主mysql容器
docker run -d -p 33306:3306 --name="mysql02-master" -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql02/master/log:/var/log/mysql -v /home/mysql02/master/data:/var/lib/mysql -v /home/mysql02/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
# 创建并启动从mysql容器
docker run -d -p 33307:3306 --name="mysql02-slave" -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql02/slave/log:/var/log/mysql -v /home/mysql02/slave/data:/var/lib/mysql -v /home/mysql02/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7- 进入到主mysql容器中,创建主从复制用户
# 进入到主mysql容器的bash中
docker exec -it mysql02-master /bin/bash
# 登录mysql
mysql -uroot -p
# 创建主从复制用户并授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'master_slave_user'@'%' IDENTIFIED BY 'qwe123456';
# 查询主库的二进制日志的名称和偏移量
mysql> show master status;
- 进入到从mysql容器中,开始进行主从复制同步。
# 进入到从mysql容器的bash中
docker exec -it mysql02-slave /bin/bash
# 登录mysql
mysql -uroot -p
# 执行以下命令,设置主从同步信息
mysql> CHANGE MASTER TO MASTER_HOST='172.19.0.2', #主mysql容器的ip
MASTER_USER='master_slave_user', #用户
MASTER_PASSWORD='qwe123456', #密码
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002', #主mysql二进制日志的名称
MASTER_LOG_POS=2175; #主mysql二进制日志偏移量
# 开始同步
mysql> start slave;
# 查询从机同步状态
mysql> show slave status\G;
当Slave_IO_Running和Slave_YES_Running都是yes的时候表示同步同步正常。
