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
相关推荐
Wzx1980123 小时前
python沙箱和docker沙箱你选对了吗?
开发语言·python·docker
CodeDevMaster3 小时前
关于PaddleOCR-VL部署与使用说明
docker·llm
少晓年4 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
Ghost Face...5 小时前
龙芯Docker全流程:安装到离线迁移实战
java·docker·eureka
Zhu7585 小时前
使用helm在k8s集群部署MySQL单实例,支持当前所有主版本的最新子版本
mysql·adb·kubernetes
JavaPub-rodert8 小时前
我又把自己的 Go 后台管理系统升级了一遍:文件管理、2GB 上传、私有文件预览、Docker 镜像全安排上了
开发语言·docker·golang·shiyuadmin
爱码少年8 小时前
嗯,腾讯云个人小站Docker镜像下载功能已下线,压力给到阿里云镜像站
docker
灯澜忆梦9 小时前
【MySQL11】进阶篇 | 索引_#3使用规则
数据库·sql·mysql·性能优化
Zhu7589 小时前
在docker环境部署frp
运维·docker·容器