Docker部署MySQL8主从复制完整指南

陈默
陈默
发布时间:2026-10-15 | 2人浏览过
原创

在Docker环境中配置MySQL8主从复制涉及多个关键步骤:准备独立的Bridge网络以隔离服务;分别为Master和Slave创建专属的数据挂载目录及配置文件;通过修改my.cnf启用二进制日志并分配唯一的Server ID;在主库中建立专用复制账户并授权;最后在从库中使用CHANGE MASTER TO指令关联主库信息并启动同步进程。

环境准备与网络配置

为了模拟生产环境并便于管理,建议为MySQL主从实例创建一个专用的Bridge网络,防止端口冲突并将容器逻辑隔离。

第1步:创建自定义Bridge网络

目的:为主从容器提供稳定的内部通信网络。

docker network create --driver bridge mysql-master-slave

第2步:创建数据存储目录

目的:将容器内的数据持久化到宿主机,确保重启后数据不丢失,同时方便后续挂载配置文件。

# 主库目录结构
mkdir -p /home/docker/mysql/master/data
mkdir -p /home/docker/mysql/master/conf

# 从库目录结构
mkdir -p /home/docker/mysql/slave1/data
mkdir -p /home/docker/mysql/slave1/conf

编写配置文件 (my.cnf)

风险提示:正确的配置文件是主从复制生效的前提,尤其是 server-id 必须唯一且需开启 log-bin。

第3步:配置主库 (Master) my.cnf

进入 /home/docker/mysql/master/conf/ 目录,创建 my.cnf 文件。核心在于启用二进制日志并设定服务器ID。

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0

# 必填:唯一标识符(整数),建议用1、2等简单数字
server-id=10

# 必填:开启二进制日志
log-bin=mysql-bin

# 可选配置
max_connections=10000
default-time_zone='+8:00'
lower_case_table_names=1

!includedir /etc/mysql/conf.d/

第4步:配置从库 (Slave) my.cnf

进入 /home/docker/mysql/slave1/conf/ 目录,创建 my.cnf 文件。注意 server-id 不能与主库相同。

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0

# 必填:唯一标识符,必须与主库不同
server-id=11

# 从库通常不需要开启Binlog来作为其他库的主库,但如果该从库也作为其他库的主库则需要开启。
# 此处保留以保持通用性,若不需要同步转发可注释掉 log-bin
log-bin=mysql-bin

max_connections=10000
default-time_zone='+8:00'
lower_case_table_names=1

!includedir /etc/mysql/conf.d/

启动主从容器

分别使用准备好的数据和配置文件启动两个容器。此处将主库映射到宿主机 3316 端口,从库映射到 3326 端口,避免冲突。

第5步:启动主数据库 (Master)

操作入口:终端命令行

docker run -d -p 3316:3306 \
--name mysql_master \
--restart=always \
--network mysql-master-slave \
-v /home/docker/mysql/master/data:/var/lib/mysql \
-v /home/docker/mysql/master/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

第6步:启动从数据库 (Slave)

docker run -d -p 3326:3306 \
--name mysql_slave1 \
--restart=always \
--network mysql-master-slave \
-v /home/docker/mysql/slave1/data:/var/lib/mysql \
-v /home/docker/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql

基础权限与安全配置

为了确保能进行远程连接及管理,需要修改加密规则并赋予Root用户远程访问权限。

第7步:配置Root用户权限

说明:分别在 Master 和 Slave 容器中执行以下 SQL 语句。

# 登录容器
exec docker exec -it mysql_master /bin/bash
# 或对于slave
exec docker exec -it mysql_slave1 /bin/bash

# 登录MySQL
mysql -u root -p

# 允许root远程访问所有表
GRANT ALL ON *.* TO 'root'@'%';

# 修改root密码加密插件(兼容旧版客户端)
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

# 刷新权限
FLUSH PRIVILEGES;
exit
exit

配置主从同步关系

第8步:主库创建同步专用账号

出于安全考虑,不建议直接用Root进行同步,应创建一个专门的复制用户。

CREATE USER 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_123456';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;

第9步:获取主库状态

完成判断:记录下 File 文件名和 Position 数值,这两个值将从库配置的核心依据。

SHOW MASTER STATUS;

第10步:从库配置主库连接信息

操作入口:在 Slave 容器中登录 MySQL 执行。
重要参数:需替换为你真实的Master IP地址(如局域网IP)以及上一步查到的File和Position值。

CHANGE MASTER TO 
  MASTER_HOST='192.168.190.133', 
  MASTER_USER='replication_user', 
  MASTER_PASSWORD='repl_123456', 
  MASTER_PORT=3316, 
  MASTER_LOG_FILE='mysql-bin.000003', 
  MASTER_LOG_POS=2838,
  MASTER_CONNECT_RETRY=30;

第11步:启动复制线程

操作:执行 Start Slave。

START SLAVE;
SHOW SLAVE STATUS;

验证同步结果

完成判断:检查 SHOW SLAVE STATUS 的输出:

  • Slave_IO_Running: 显示 Yes
  • Slave_SQL_Running: 显示 Yes

如果两项均为 Yes,说明主从同步已成功建立。

排错说明:
如果任何一项为 No,或出现 Error,请查看对应的 Last_Error 信息。常见原因包括主库IP连通性失败、账号密码错误、或指定的日志位置有误。排查时可直接查看 SHOW SLAVE STATUS 中的错误描述,这比查阅通用的百度资料更具针对性。

总结

通过上述步骤,可以在 Docker 容器内稳定地实现 MySQL8 的主从复制架构。关键在于正确编写配置文件以确保 server-id 的唯一性与日志的开启,以及在从库阶段准确填入主库的当前日志位点。

以上就是Docker部署MySQL8主从复制的详细过程,更多关于MySQL高可用配置的参考资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表