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
相关推荐
这个DBA有点耶8 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
leeyi11 小时前
把软件装进不能上网的机房——一套建好了、还没上过战场的交付工程(第101篇)
docker·aigc·agent
YIAN13 小时前
Docker + Nginx 核心原理扫盲:从环境隔离到反向代理,运维面试必考点
后端·docker·面试
IT大白鼠15 小时前
Docker 实战 ELKF 日志监控:容器日志全栈收集分析方案
运维·docker·容器
九皇叔叔1 天前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
愤怒的苹果ext1 天前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
小张同学a.1 天前
Docker 容器实战 1—— docker 基础与镜像构建
linux·运维·docker·容器
NJCloud1 天前
Docker 容器技术入门:部署、核心概念与基础命令
运维·docker·容器
2601_962072331 天前
docker自建rustdesk-server远程桌面
运维·docker·容器
超兔一体云1 天前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql