Docker部署MySQL8主从复制完整指南
在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: 显示YesSlave_SQL_Running: 显示Yes
如果两项均为 Yes,说明主从同步已成功建立。
排错说明:
如果任何一项为 No,或出现 Error,请查看对应的 Last_Error 信息。常见原因包括主库IP连通性失败、账号密码错误、或指定的日志位置有误。排查时可直接查看 SHOW SLAVE STATUS 中的错误描述,这比查阅通用的百度资料更具针对性。
总结
通过上述步骤,可以在 Docker 容器内稳定地实现 MySQL8 的主从复制架构。关键在于正确编写配置文件以确保 server-id 的唯一性与日志的开启,以及在从库阶段准确填入主库的当前日志位点。
以上就是Docker部署MySQL8主从复制的详细过程,更多关于MySQL高可用配置的参考资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









