Docker部署MySQL主从:手把手教你在Docker中快
前置准备
使用 Docker部署MySQL主从 前,请确保你已具备以下条件:
- 一台安装好Docker的服务器(CentOS / Ubuntu 均可)。如果还没装,执行以下命令快速安装:
curl -fsSL https://get.docker.com | bash -s docker
sudo systemctl start docker
sudo systemctl enable docker- 开放必要的端口:主库用 3306,从库也要用(或者映射到不同宿主机端口,比如 3307)。
- 两个MySQL容器或两个独立的容器网络:建议先创建自定义网络,方便容器间通信。
docker network create mysql-replication- 简单的Linux命令基础(会复制粘贴命令即可)。
分步操作
1. 拉取MySQL镜像
我们使用官方MySQL 8.0镜像,稳定且文档齐全。
docker pull mysql:8.02. 启动主库容器
docker run -d \
--name mysql-master \
--network mysql-replication \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
mysql:8.0说明:--name指定容器名,--network加入自定义网络,-p映射端口,-e设置root密码。
3. 配置主库(开启二进制日志、设置server-id)
进入主库容器,修改MySQL配置文件:
docker exec -it mysql-master bash在容器内,编辑 /etc/mysql/my.cnf(或 /etc/my.cnf),在 [mysqld] 段添加以下内容:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW保存退出后,重启主库容器:
docker restart mysql-master回到宿主机,然后创建用于复制的用户:
docker exec -it mysql-master mysql -uroot -proot123在MySQL命令行执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- 记下 File 和 Position 值4. 启动从库容器
docker run -d \
--name mysql-slave \
--network mysql-replication \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
mysql:8.05. 配置从库(设置server-id、指向主库)
同样进入从库容器修改配置文件:
docker exec -it mysql-slave bash在 /etc/mysql/my.cnf 中添加:
[mysqld]
server-id = 2
relay-log = relay-log重启从库:
docker restart mysql-slave然后在从库中执行 CHANGE MASTER TO 命令:
docker exec -it mysql-slave mysql -uroot -proot123CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl123',
MASTER_LOG_FILE='mysql-bin.000001', -- 使用上一步查到的 File
MASTER_LOG_POS=xxx; -- 使用上一步查到的 Position
START SLAVE;
6. 检查复制状态
SHOW SLAVE STATUS\G;重点观察以下两项是否为 Yes:
Slave_IO_Running: YesSlave_SQL_Running: Yes
避坑指南
Slave_IO_Running: Connecting:通常是网络不通或用户名密码错误。检查MASTER_HOST是否写对(容器名或IP);主库是否允许远程连接(%)。Slave_SQL_Running: No:一般是SQL执行错误(如主从数据冲突)。可通过SHOW SLAVE STATUS\G查看Last_Errno和Last_Error具体信息。解决方法:跳过错误或用STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE;临时跳过。生产环境慎重。- server-id重复:主从的server-id必须不同(整数1-2^32-1),否则无法建立连接。
- MySQL 8.0默认认证插件是caching_sha2_password,可能导致从库无法连接。建议在创建复制用户时指定
IDENTIFIED WITH mysql_native_password:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123';效果验证
- 在主库创建一个测试数据库并插入数据:
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT,name VARCHAR(20));
INSERT INTO users values(1,'Alice');- 在从库检查:
SHOW DATABASES; -- 应该能看到 testdb
USE testdb;
SELECT * FROM users; -- 应该返回 (1, 'Alice')- 如果数据一致,说明 Docker部署MySQL主从 配置成功。
高频问题解答
Q1:如何重置整个主从关系?
- 在从库执行
STOP SLAVE; RESET SLAVE ALL;,再重新执行CHANGE MASTER TO和START SLAVE。
Q2:主库或从库容器重启后是否需要重新配置?
- 如果容器使用了数据卷持久化配置文件和binlog,重启后主从关系会自动恢复。否则可能需要重新执行
CHANGE MASTER TO(取决于是否保存了二进制日志位置)。建议使用-v挂载宿主机目录持久化数据。
Q3:怎样实现主主复制(双向同步)?
- 原理类似,但需要两个库都开启binlog、设置不同的server-id,并互相授权复制用户。配置更复杂,建议先掌握单向主从再尝试。
如果你正在处理 Docker部署MySQL主从,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。