Docker软件安装

MySQL安装

⚠️实战版

​ 新建mysql容器实例

1
2
3
4
5
6
docker run -d -p 3306:3306 --privileged=true 
-v /zzyyuse/mysql/log:/var/log/mysql
-v /zzyyuse/mysql/data:/var/lib/mysql
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456 
--name mysql mysql:5.7

​ 新建my.cnf,修改mysql字符编码

​ 通过容器卷同步给mysql容器实例

1
2
3
4
5
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

​ 重新启动mysql容器实例再重新进入并查看字符编码

1
SHOW VARIABLES LIKE 'character%'

​ 再新建库新建表再插入中文测试

Redis安装

⚠️安装redis

​ 拉取redis镜像到本地

​ 在CentOS宿主机下新建目录/app/redis

​ mkdir -p /app/redis

​ 将一个redis.conf (默认出厂的原始redis.conf) 文件模板拷贝进/app/redis目录下

​ /app/redis目录下修改redis.conf文件

​ 使用redis6.0.8镜像创建容器(也叫运行镜像)

1
2
3
4
5
6
docker run  -p 6379:6379 
--name myr3 --privileged=true
-v /app/redis/redis.conf:/etc/redis/redis.conf
-v /app/redis/data:/data
-d redis:6.0.8
redis-server /etc/redis/redis.conf

​ 测试redis-cli连接上来

​ 请证明docker启动使用了我们自己指定的配置文件

​ 修改前

​ 修改后

​ 记得重启服务

​ 测试redis-cli连接上来第2次

安装mysql主从复制

新建主服务器容器实例3307

1
2
3
4
5
docker run -p 3307:3306 --name mysql-master 
-v /mydata/mysql-master/log:/var/log/mysql
-v /mydata/mysql-master/data:/var/lib/mysql
-v /mydata/mysql-master/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入/mydata/mysql-master/conf目录下新建my.cnf,修改完配置后重启master实例。(详见Docker软件安装)

⚠️启动不起来删除文件每行后多余的空格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##my.cnf文件内容
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

进入mysql-master容器

1
2
docker exec -it mysql-master /bin/bash
mysql -uroot -proot

master容器实例内创建数据同步用户

1
2
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';   //创建用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; //给用户授权

新建从服务器容器实例3308

1
2
3
4
5
docker run -p 3308:3306 --name mysql-slave
-v /mydata/mysql-slave/log:/var/log/mysql
-v /mydata/mysql-slave/data:/var/lib/mysql
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

进入/mydata/mysql-slave/conf目录下新建my.cnf,修改完配置后重启slave实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

修改完配置后重启slave实例

在主数据库中查看主从同步状态

1
show master status;

image-20220718182751169

进入mysql-slave容器

在从数据库中配置主从复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
change master to master_host='127.0.0.1',
master_user='slave',
master_password='123456',
master_port=3307,
master_log_file='mall-mysql-bin.000001',
master_log_pos=617,
master_connect_retry=30;


## 主从复制命令参数说明
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

在从数据库中查看主从同步状态

1
show slave status \G;   //(\G 竖排显示,类似键值对)

image-20220718183550749

在从数据库中开启主从同步

1
start slave;

查看从数据库状态发现已经同步

image-20220718184430067

配置Redis 3主3从集群

新建6个docker容器redis实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381 

docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382

docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383

docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384

docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385

docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386


//命令分步解释
docker run
创建并运行docker容器实例
--name redis-node-6
容器名字
--net host
使用宿主机的IP和端口,默认
--privileged=true
获取宿主机root用户权限
-v /data/redis/share/redis-node-6:/data
容器卷,宿主机地址:docker内部地址
redis:6.0.8
redis镜像和版本号
--cluster-enabled yes
开启redis集群
--appendonly yes
开启持久化
--port 6386
redis端口号

进入容器redis-node-1并为6台机器构建集群关系

1
2
3
4
5
//注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址 

redis-cli --cluster create 192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386 --cluster-replicas 1

//--cluster-replicas 1 表示为每个master创建一个slave节点

选择一个节点进入,查看集群状态

1
2
cluster info
cluster nodes

节点扩容

新建6387、6388两个节点+新建后启动+查看是否8个节点

1
2
3
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387

docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

进入6387容器实例内部

将新增的6387节点(空槽号)作为master节点加入原集群

1
2
3
4
5
6
将新增的6387作为master节点加入集群

redis-cli --cluster  add-node  自己实际IP地址: 6387  自己实际IP地址: 6381

6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387见见6381Master从而找到组织加入集群

检查集群情况第1次

1
redis-cli --cluster check 真实ip地址:6381 

重新分派槽号

1
2
命令 : redis-cli --cluster reshard IP地址:端口号 
redis-cli --cluster reshard 192.168.111.147:6381

image-20220718204501325image-20220718204534824

检查集群情况第2次

​ 槽号分派说明

  • 为什么6387是3个新的区间,以前的还是连续?

    重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

 image-20220718204816519

为主节点6387分配从节点6388

1
2
3
命令:redis-cli  --cluster add-node  ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
 
redis-cli --cluster add-node 192.168.111.147:6388 192.168.111.147:6387 --cluster-slave --cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451-------这个是6387的编号,按照自己实际情况

检查集群情况第3次

image-20220718205016801

节点缩容

image-20220718205213657

检查集群情况获得6388的节点ID,将6388删除

1
2
3
4
5
6
##检查
redis-cli --cluster check 192.168.111.147:6382
##删除
命令:redis-cli --cluster  del-node  ip:从机端口 从机6388节点ID

redis-cli --cluster  del-node  192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8

将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

1
redis-cli --cluster reshard 192.168.111.147:6381 

image-20220718205838179image-20220718205918372

检查集群情况第二次

  • 4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端
image-20220718210019366

将6387删除

1
命令:redis-cli --cluster del-node ip:端口 6387节点ID

检查集群情况

1
redis-cli --cluster check 192.168.111.147:6381 
image-20220718210151710

ElasticSearch安装

⚠️

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
chmod -R 777 /mydata/elasticsearch/ 保证权限

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-e bootstrap.memory_lock=true \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

可视化界面(版本统一)

1
2
3
4
docker pull kibana
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 \
-d kibana:7.4.2
http://192.168.56.10:9200 一定改为自己虚拟机的地址

nginx安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -p 80:80 --name nginx -d nginx:1.10
随便启动一个nginx实例,只是为了复制出配置

将容器内的配置文件拷贝到当前目录:docker container cp nginx:/etc/nginx .
别忘了后面的点

修改文件名称:mv nginx conf 把这个 conf 移动到/mydata/nginx 下
终止原容器:docker stop nginx
执行命令删除原容器:docker rm $ContainerId
创建新的nginx,执行以下命令

docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/config:/etc/nginx \
-d nginx:1.10

RabbitMQ安装

1
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

注:

  • 4369 – erlang发现口
  • 5672 –client端通信口
  • 15672 – 管理界面ui端口
  • 25672 – server间内部通信口

zipkin安装

1
2
3
4
docker run -d -p 9411:9411 openzipkin/zipkin

生产环境下,数据持久化到本地
docker run -env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200 openzipkin/zipkin-dependencies

image-20220908115346721

image-20220908115408957