1.下载镜像
bash
docker pull mysql:5.7
2.目录结构
bash
opt文件夹下
mysqltest/
├── master/
│ ├── conf/my.cnf
│ └── data/
├── slave/
│ ├── conf/my.cnf
│ └── data/
└── docker-compose.yml
3.创建目录
bash
mkdir -p /opt/mysqltest/master/{conf,logs,data}
mkdir -p /opt/mysqltest/slave/{conf,logs,data}
4.创建主库配置文件my.conf
bash
cat > /opt/mysqltest/master/conf/my.cnf << EOF
[mysqld]
#每个mysql的server-id必须为不重复的值
server-id=1
#开启二进制日志
log-bin=mysql-bin
binlog_format=ROW
#超过30天的log删除
expire_logs_days=7
binlog-ignore-db=mysql
# 可选:只同步指定库
# binlog-do-db=test_db
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 性能相关
innodb_flush_log_at_trx_commit=1
sync_binlog=1
#禁止 MySQL 对客户端连接进行 DNS 反向解析
skip-name-resolve
EOF
5.创建备库配置文件my.cnf
bash
cat > /opt/mysqltest/slave/conf/my.cnf << EOF
[mysqld]
server-id=2
relay-log=relay-bin
read-only=1
# 可选
# replicate-do-db=test_db
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
skip-name-resolve
EOF
6.创建docker-compose文件
bash
cat > ~/mysql_test.yml << EOF
services:
mysql-master:
image: mysql:5.7
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_USER: repl
MYSQL_PASSWORD: repl123
volumes:
- /opt/mysqltest/master/conf:/etc/mysql/conf.d
- /opt/mysqltest/master/logs:/logs
- /opt/mysqltest/master/data:/var/lib/mysql
ports:
- "3307:3306"
networks:
- mysql-net
restart: always
mysql-slave:
image: mysql:5.7
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: root123
volumes:
- /opt/mysqltest/slave/conf:/etc/mysql/conf.d
- /opt/mysqltest/slave/logs:/logs
- /opt/mysqltest/slave/data:/var/lib/mysql
ports:
- "3308:3306"
networks:
- mysql-net
restart: always
depends_on:
- mysql-master
networks:
mysql-net:
driver: bridge
EOF
#赋予执行权限
chmod +x mysql_test.yml
7.启动
bash
docker-compose -f mysql_test.yml up -d
8.在master创建复制账号
bash
docker exec -it mysql-master mysql -uroot -proot123
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
记录以下两个值(非常重要):
File:如 mysql-bin.000001
Position:如 502
9.slave配置主从同步
bash
docker exec -it mysql-slave mysql -uroot -proot123
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=502;
START SLAVE;
SHOW SLAVE STATUS\G
✅ 关键字段必须正常:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
备注:
如果不使用docker compose方式,第六第七步替换为如下docker run指令
bash
#搭建网桥
docker network create mysql-net
#运行主库
docker run -d \
--name mysql-master \
--network mysql-net \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_USER=repl \
-e MYSQL_PASSWORD=repl123 \
-v /opt/mysqltest/master/conf:/etc/mysql/conf.d \
-v /opt/mysqltest/master/logs:/logs \
-v /opt/mysqltest/master/data:/var/lib/mysql \
--restart always \
mysql:5.7
#运行从库
docker run -d \
--name mysql-slave \
--network mysql-net \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-v /opt/mysqltest/slave/conf:/etc/mysql/conf.d \
-v /opt/mysqltest/slave/logs:/logs \
-v /opt/mysqltest/slave/data:/var/lib/mysql \
--restart always \
mysql:5.7