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
使用说明
- 将上述文件分别保存到对应目录
- 对于MySQL集群:
O 构建镜像: docker-compose -f mysql-compose.yml build
O 启动服务: docker-compose -f mysql-compose.yml up -d
- 对于Redis集群:
O 构建镜像: docker-compose -f redis-compose.yml build
O 启动服务: docker-compose -f redis-compose.yml up -d
O 然后执行集群创建命令
注意事项
- 生产环境中应该使用更复杂的密码
- MySQL主从配置可能需要根据实际日志位置调整
- Redis集群至少需要3个主节点和3个从节点才能正常工作
- 数据卷用于持久化数据,防止容器重启后数据丢失
- 网络配置确保容器间可以互相通信
以上配置提供了基本的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命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)