百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Docker搭建MySQL与Redis集群教程(docker安装mysql集群)

wptr33 2025-06-12 16:40 4 浏览

使用Dockerfile搭建MySQL主从集群和Redis集群

MySQL主从集群搭建

1. 创建MySQL主服务器Dockerfile

dockerfile

# MySQL主服务器Dockerfile

FROM mysql:8.0


# 设置root密码

ENV MYSQL_ROOT_PASSWORD=rootpassword


# 复制主服务器配置文件

COPY my-master.cnf /etc/mysql/conf.d/


# 复制初始化脚本

COPY init-master.sql /docker-entrypoint-initdb.d/


EXPOSE 3306

my-master.cnf 配置文件内容:

ini

[mysqld]

server-id = 1

log_bin = mysql-bin

binlog_format = ROW

binlog_do_db = mydb

init-master.sql 初始化脚本:

sql

CREATE DATABASE IF NOT EXISTS mydb;

CREATE USER 'repl'@'%' IDENTIFIED BY 'replpassword';

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

FLUSH PRIVILEGES;

2. 创建MySQL从服务器Dockerfile

dockerfile

# MySQL从服务器Dockerfile

FROM mysql:8.0


# 设置root密码

ENV MYSQL_ROOT_PASSWORD=rootpassword


# 复制从服务器配置文件

COPY my-slave.cnf /etc/mysql/conf.d/


EXPOSE 3306

my-slave.cnf 配置文件内容:

ini

[mysqld]

server-id = 2

relay-log = mysql-relay-bin

log_bin = mysql-bin

binlog_format = ROW

read_only = 1

3. 使用docker-compose编排MySQL集群

yaml

version: '3.8'


services:

mysql-master:

build:

context: .

dockerfile: Dockerfile.mysql-master

container_name: mysql-master

ports:

- "3306:3306"

volumes:

- mysql-master-data:/var/lib/mysql

environment:

MYSQL_ROOT_PASSWORD: rootpassword

networks:

- mysql-cluster


mysql-slave1:

build:

context: .

dockerfile: Dockerfile.mysql-slave

container_name: mysql-slave1

ports:

- "3307:3306"

volumes:

- mysql-slave1-data:/var/lib/mysql

environment:

MYSQL_ROOT_PASSWORD: rootpassword

depends_on:

- mysql-master

networks:

- mysql-cluster


volumes:

mysql-master-data:

mysql-slave1-data:


networks:

mysql-cluster:

driver: bridge

4. 配置主从复制

启动容器后,进入从服务器容器并执行:

bash

docker exec -it mysql-slave1 mysql -uroot -prootpassword

在MySQL从服务器中执行:

sql

CHANGE MASTER TO

MASTER_HOST='mysql-master',

MASTER_USER='repl',

MASTER_PASSWORD='replpassword',

MASTER_LOG_FILE='mysql-bin.000001',

MASTER_LOG_POS=0;


START SLAVE;

Redis集群搭建

1. 创建Redis节点Dockerfile

dockerfile

FROM redis:6.2


COPY redis.conf /usr/local/etc/redis/redis.conf


CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]


EXPOSE 6379

redis.conf 配置文件内容:

ini

port 6379

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

2. 使用docker-compose编排Redis集群

yaml

version: '3.8'


services:

redis-node1:

build:

context: .

dockerfile: Dockerfile.redis

container_name: redis-node1

ports:

- "6379:6379"

volumes:

- redis-node1-data:/data

networks:

- redis-cluster


redis-node2:

build:

context: .

dockerfile: Dockerfile.redis

container_name: redis-node2

ports:

- "6380:6379"

volumes:

- redis-node2-data:/data

networks:

- redis-cluster


redis-node3:

build:

context: .

dockerfile: Dockerfile.redis

container_name: redis-node3

ports:

- "6381:6379"

volumes:

- redis-node3-data:/data

networks:

- redis-cluster


redis-node4:

build:

context: .

dockerfile: Dockerfile.redis

container_name: redis-node4

ports:

- "6382:6379"

volumes:

- redis-node4-data:/data

networks:

- redis-cluster


redis-node5:

build:

context: .

dockerfile: Dockerfile.redis

container_name: redis-node5

ports:

- "6383:6379"

volumes:

- redis-node5-data:/data

networks:

- redis-cluster


redis-node6:

build:

context: .

dockerfile: Dockerfile.redis

container_name: redis-node6

ports:

- "6384:6379"

volumes:

- redis-node6-data:/data

networks:

- redis-cluster


volumes:

redis-node1-data:

redis-node2-data:

redis-node3-data:

redis-node4-data:

redis-node5-data:

redis-node6-data:


networks:

redis-cluster:

driver: bridge

3. 创建Redis集群

启动容器后,执行以下命令创建集群:

bash

docker exec -it redis-node1 redis-cli --cluster create \

$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node1):6379 \

$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node2):6379 \

$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node3):6379 \

$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node4):6379 \

$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node5):6379 \

$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node6):6379 \

--cluster-replicas 1

使用说明

  1. 将上述文件分别保存到对应目录
  2. 对于MySQL集群:

O 构建镜像: docker-compose -f mysql-compose.yml build

O 启动服务: docker-compose -f mysql-compose.yml up -d

  1. 对于Redis集群:

O 构建镜像: docker-compose -f redis-compose.yml build

O 启动服务: docker-compose -f redis-compose.yml up -d

O 然后执行集群创建命令

注意事项

  1. 生产环境中应该使用更复杂的密码
  2. MySQL主从配置可能需要根据实际日志位置调整
  3. Redis集群至少需要3个主节点和3个从节点才能正常工作
  4. 数据卷用于持久化数据,防止容器重启后数据丢失
  5. 网络配置确保容器间可以互相通信

以上配置提供了基本的Dockerfile和docker-compose配置,可以根据实际需求进行调整。

相关推荐

Linux文件系统操作常用命令(linux文件内容操作命令)

在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...

别小看tail 命令,它难倒了技术总监

我把自己以往的文章汇总成为了Github,欢迎各位大佬star...

lnav:基于 Linux 的高级控制台日志文件查看器

lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...

声明式与命令式代码(声明模式和命令模式)

编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...

linux中的常用命令(linux常用命令和作用)

linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...

如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)

这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...

最通俗易懂的命令模式讲解(命令模式百科)

我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...

互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?

你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...

Linux 常用命令(linux常用的20个命令面试)

日志排查类操作命令...

Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)

if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...

外贸干货|如何增加领英的曝光量和询盘

#跨境电商#...

golang执行linux命令(golang调用shell脚本)

需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...

LINUX磁盘挂载(linux磁盘挂载到windows)

1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...

Linux命令学习——nl命令(linux ln命令的使用)

nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...