Skip to content
🗂️ 文章分类: 数据库  
🏷️ 文章标签: MySql  Docker  
📝 文章创建时间: 2026-02-14
🔥 文章最后更新时间:2026-02-14

[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容器的配置文件和目录。

sh
# 该目录用于存储MySQL容器中的配置、数据、日志目录等。
mkdir /shuyx/docker/mysql
mkdir /shuyx/docker/mysql/data
mkdir /shuyx/docker/mysql/log
mkdir /shuyx/docker/mysql/conf.d

这些目录都是在宿主机的/shuyx/docker目录下。也可以自定义为其他路径。

② 创建并运行Nginx容器,有两种写法

命令行写法

sh
# --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文件,并编写如下内容。

yaml
# 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容器

sh
# 启动mysql容器
docker-compose up -d
# 查询容器是否运行
docker ps

③ 使用navicat等数据库连接工具,连接mysql容器。

mysql_2026-02-14_171430_208.png

创建自定义配置文件

先确保mysql容器的conf.d目录已经挂载到宿主机中(比如/shuyx/docker/mysql/conf.d),然后在该目录下创建自定义配置文件。

① 先创建一个自定义配置文件my.cnf,后缀必须是.cnf。

my.cnf 内容如下:

ini
[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 容器使配置生效

sh
# 重启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镜像文件。最新版或某个版本

shell
# 下载mysql 8.0.20版本的镜像
docker pull mysql:8.0.20
# 查询镜像
docker images

步骤③:创建并启动mysql容器

shell
# 创建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容器中

shell
# 进入到容器中
docker exec -it myMySQL /bin/bash
# 进入到mysql命令行模式
mysql -uroot -p123456

mysql_20231223222722.png

解决docker中的mysql容器的中文字符编码问题

  1. 先进入到mysql容器的mysql终端中,容器名称为myMySQL
shell
# 先进入到容器终端
docker exec -it myMySQL /bin/bash
# 登录进入到mysql终端
mysql -uroot -p123456
# 查询mysql的字符集
mysql> show variables like 'character%';
mysql> show variables like 'collation%';

docker_20231012012413.png

如图所示,由于在mysql容器中的字符编码不是utf8。因此我们需要重新设置mysql的字符编码。由于上面创建mysql容器的时候设置了容器数据卷。因此可以直接在宿主机的conf.d目录中创建my.cnf配置文件即可。

  1. 在conf.d目录中创建my.cnf配置文件。并添加字符编码配置。

不同版本的mysql的修改字符编码的方式不同。下面是mysql 8.0.20版本的配置写法。

shell
[mysqld]
init-connect="SET collation_connection=utf8mb4_0900_ai_ci"
init_connect="SET NAMES utf8mb4"
skip-character-set-client-handshake
  1. 重新启动mysql容器,让配置文件生效。
shell
# 重启容器,
docker restart myMySQL

# 注意如果配置文件错误,会导致容器重启失败。此时可以查询docker容器日志来寻找原因。
# 查询mysql01容器的日志信息
docker logs myMySQL
  1. 如图所示,字符编码改为了utf8mb4。

mysql_20231223233542.png

docker mysql主从集群

在docker中创建两个mysql容器,组成mysql集群,从而实现mysql主从复制。

  1. 先创建主从mysql容器的目录
shell
# 先创建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
  1. 先在mysql容器的配置目录中创建配置文件my.cnf

主my.cnf配置文件如下

shell
[mysqld]
#主服务器唯一ID
server-id=120
#启用二进制日志,名称可以随便取(关键)
log-bin=mysql-bin
#设置logbin格式
binlog_format=STATEMENT

从my.cnf配置文件如下

shell
[mysqld]
#从服务器唯一ID
server-id=130
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin   
#启用中继日志
relay-log=mysql-relay
  1. 创建并启动主从mysql容器
shell
# 创建并启动主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
  1. 进入到主mysql容器中,创建主从复制用户
shell
# 进入到主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;

docker_20231021193711.png

  1. 进入到从mysql容器中,开始进行主从复制同步。
shell
# 进入到从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;

docker_20231021194006.png

当Slave_IO_Running和Slave_YES_Running都是yes的时候表示同步同步正常。