如何在docker环境部署主从_mysql容器集群

MySQL主从复制需为Master和Slave分别配置my.cnf:Master启用log-bin并设server-id=1;Slave设不同server-id=2、read_only=1。通过Docker部署,启动后创建复制用户、配置CHANGE REPLICATION SOURCE并START REPLICA,最后验证SHOW REPLICA STATUS及数据一致性。

准备两个MySQL配置文件

主从复制依赖不同的配置参数,需为Master和Slave分别准备my.cnf。关键区别在于:

  • Master启用二进制日志:log-bin=mysql-bin,并设置唯一server-id=1
  • Slave关闭binlog(可选),但必须设不同server-id=2,并指定read_only=1
  • 两者都建议加skip-host-cacheskip-name-resolve避免DNS解析问题

启动Master容器

使用自定义配置挂载,并暴露端口(如3306):

docker run -d \
  --name mysql-master \
  -p 3306:3306 \
  -v /path/to/master/my.cnf:/etc/mysql/my.cnf \
  -v /path/to/master/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=testdb \
  --restart=always \
  mysql:8.0

启动后进入容器执行:

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

再查主库状态:SHOW MASTER STATUS;,记下FilePosition值。

启动Slave容器并配置复制

同样挂载专属配置和数据目录,注意server-id不能与Master重复

docker run -d \
  --name mysql-slave \
  -p 3307:3306 \
  -v /path/to/slave/my.cnf:/etc/mysql/my.cnf \
  -v /path/to/slave/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  --restart=always \
  mysql:8.0

进入Slave容器执行:

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='host.docker.internal',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='repl123',
  SOURCE_LOG_FILE='mysql-bin.000001',
  SOURCE_LOG_POS=156;
START REPLICA;

注意:SOURCE_HOST填宿主机IP或host.docker.internal(Docker Desktop可用,Linux需手动添加host);LOG_FILELOG_POS来自上一步SHOW MASTER STATUS结果。

验证主从同步是否生效

在Master建表插入数据:

CREATE TABLE test_replica (id INT);
INSERT INTO test_replica VALUES (1);

立刻在Slave查:

SELECT * FROM test_replica;

若返回相同结果,说明同步成功。还可运行:

SHOW REPLICA STATUS\G

重点检查Replica_IO_RunningReplica_SQL_Running是否均为Yes,且Seconds_Behind_Master为0或稳定增长后归零。