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
相关推荐
风翼靓崽2 小时前
centos7以mysql为例自建yum源
数据库·mysql·adb
秋名RG2 小时前
一条 SQL 语句在 MySQL 中的执行过程详解
数据库·sql·mysql
月夏2 小时前
一个汉字存成了 6 个字节:我用 HEX 揪出 MySQL 双重编码
mysql·docker·全栈
jiecy4 小时前
在 ARM 的 UOS 系统里布署 WebDav
arm开发·docker·debian
香蕉大香蕉(06敬畏市场)14 小时前
MySQL 单点详解(07)
java·数据库·mysql·ai·博客·八股
IT规划师16 小时前
百亿数据写入 MySQL:空间降维 × IO 降维 × 工程兜底
mysql·sqlsugar·.net10
废柴程序员_熊熊17 小时前
10 分钟用 Docker 搭一套私有 Gitea:HTTPS、SSH、CI、备份一次配齐
docker
数据库小学妹18 小时前
MySQL NULL陷阱:NOT IN、三值逻辑与NOT EXISTS
数据库·后端·mysql
枫昕柚18 小时前
MySQL 建库命令详解:从 CREATE DATABASE 到create table
数据库·mysql