Docker搭建MySQL与Redis集群教程
使用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配置,可以根据实际需求进行调整。