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
相关推荐
小白男神1 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
分布式存储与RustFS1 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
这个DBA有点耶1 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
玉&心1 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing1 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
程序猿_极客1 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
guo_wen_qiang1 天前
上传本地镜像到harbor中
docker·容器·持续部署
羑悻的小杀马特1 天前
Dockerfile 全景指南:从入门编写dockerfile到生产环境镜像优化实战,一步步带你从啃透制作指令到镜像制作落地!
docker·dockerfile·镜像制作
于平安1 天前
MySQL-触发器
数据库·mysql