Docker MySQL搭建一主一从

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
相关推荐
AIgorithmGEEK5 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
Lost_the_wind5 小时前
MySQL学习笔记四
mysql
像风一样自由20205 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
江湖有缘9 小时前
Docker实战 | 使用Docker部署rmoments社交平台
jvm·docker·oracle
geovindu9 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__10 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧
2501_9318037510 小时前
MySQL 锁机制详解
数据库·mysql
.Hypocritical.13 小时前
MySQL |常用 SQL 语句与 pymysql 函数
mysql
NineData13 小时前
MySQL 到 Doris 实时数据同步:订单、用户和日志数据入仓方案
数据库·mysql
灯澜忆梦14 小时前
【docker】#4 | Docker 自定义镜像与 Dockerfile
运维·docker·容器