堪称最优秀的Docker可视化管理工具——Portainer你真的会用吗?
共 16277字,需浏览 33分钟
·
2024-04-16 00:00
阅读本文大概需要 10 分钟。
来自:blog.csdn.net/shark_chili3007/article/details/123366179
前言
安装Portainer
编写docker-compose文件
version: "3"
services:
portainer:
image: portainer/portainer:latest
container_name: portainer
ports:
- "9000:9000"
volumes:
- /app/portainer/data:/data
- /var/run/docker.sock:/var/run/docker.sock
初始化并配置容器
docker-compose -f portainer.yml up
“ https://www.portainer.io/take-5
docker-compose -f portainer.yml up -d
实践-基于Portainer安装redis-sentinel部署
介绍
-
当主节点更新数据之后,从节点数据也会进行同步。 -
当我们将主节点手动停止之后,哨兵就会选举出新的master继续进行工作。
安装步骤
主从复制部署
version: '3'
services:
# 主节点
master:
image: redis
# 主节点名称
container_name: redis-master
# 设置redis登录密码、从节点连接主节点的密码
command: redis-server --requirepass xxxx--masterauth xxxx
ports:
# 对外暴露端口号为16379
- 16379:6379
# 从节点
slave1:
image: redis
container_name: redis-slave-1
ports:
# 对外暴露端口号为16380
- 16380:6379
# 启动redis 从属于容器名为 redis-master的redis,端口号为容器端口号而不是对外映射端口号,设置连接密码,连接主节点的密码
command: redis-server --slaveof redis-master 6379 --requirepass xxxx--masterauth xxxxx
# 从节点2
slave2:
image: redis
container_name: redis-slave-2
ports:
- 16381:6379
command: redis-server --slaveof redis-master 6379 --requirepass xxxxx --masterauth xxxxx
docker-compose -f redis-cluster.yml up
docker exec -it
容器id bash/sh命令,有了portainer之后,我们进入容器的操作就变得非常简单了。
创建redis-sentinel专用网络驱动
-
host: 使用docker宿主机网络 -
bridge: 该网络支持在同一个宿主机上的各个容器实例之间的通信。bridge网络是一个独立的网络空间,在网络空间内部的各个容器实例能够直接通信。 -
none: 是一个完全隔离的自治网络,甚至与Docker宿主机的网络都不通,必须手工配置网卡后才能够使用。加入到该网络的容器实例,往往要在后续设置中加入到其他的第三方网络。 -
overlay: 该类型的网络适用于Docker宿主机集群中的各个独立的容器实例之间通信。 -
macvlan: 该类型的网络适用于容器实例需要与宿主机的MAC地址直接通信,无需端口映射,也无需NAT,容器实例的eth0直接与宿主机的物理网卡通信。容器实例可以被赋予公共IP,并从宿主机外部直接访问。
创建哨兵
version: '3'
services:
sentinel1:
image: redis
# 容器名称
container_name: redis-sentinel-1
ports:
# 端口映射
- 26379:26379
# 启动redis哨兵
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
# 哨兵1的sentinel.conf和宿主文件位置映射
- /app/cloud/redis/sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- /app/cloud/redis/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- /app/cloud/redis/sentinel/sentinel3.conf:/usr/local/etc/redis/sentinel.conf
# 重点,将3个哨兵加入到redis-sentinel和主从节点建立联系
networks:
default:
external:
name: redis-sentinel
app/cloud/redis/sentinel/
文件夹下创建3个哨兵的配置文件sentinel.conf。
port 26379
dir /tmp
# master节点在bridge网络中的ip值
sentinel monitor redis-master 172.20.0.2 6379 2
# master节点密码
sentinel auth-pass redis-master xxxxx
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes
docker-compose -f redis-sentinel.yml up
测试可用性
Spring Boot集成Redis Sentinel
修改哨兵配置文件
port 26379
dir /tmp
# master节点ip
sentinel monitor redis-master 外网ip 16379 2
# master节点密码
sentinel auth-pass redis-master 密码
sentinel down-after-milliseconds redis-master 30000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 180000
sentinel deny-scripts-reconfig yes
Spring Boot应用集成依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lettuce pool 缓存连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
注册中心配置redis参数
@Bean
@ConditionalOnMissingBean(RedisConnectionFactory.class)
public LettuceConnectionFactory redisConnectionFactory(ClientResources clientResources)
throws UnknownHostException {
....略
//创建连接工厂
return createLettuceConnectionFactory(clientConfig);
}
private LettuceConnectionFactory createLettuceConnectionFactory(LettuceClientConfiguration clientConfiguration) {
//有sentinel则创建sentinel配置工厂
if (getSentinelConfig() != null) {
return new LettuceConnectionFactory(getSentinelConfig(), clientConfiguration);
}
//有cluster配置则取cluster创建cluster连接工厂
if (getClusterConfiguration() != null) {
return new LettuceConnectionFactory(getClusterConfiguration(), clientConfiguration);
}
//默认配置
return new LettuceConnectionFactory(getStandaloneConfig(), clientConfiguration);
}
private static Map<String, Object> asMap(String master, Set<String> sentinelHostAndPorts) {
........略
Map<String, Object> map = new HashMap<>();
//spring.redis.sentinel.master 决定master的值
map.put(REDIS_SENTINEL_MASTER_CONFIG_PROPERTY, master);
........略
return map;
}
spring:
redis:
# master有密码则需要配置master认证面膜
password: xxxxx
sentinel:
master: redis-master
# 多个节点用,分开,例如节点1ip:26379,节点2ip:26379
nodes: 节点ip:26379
password: xxxx
# lettuce连接池配置信息
lettuce:
pool:
max-idle: 10
max-active: 20
min-idle: 5
max-wait: 10000ms
编码测试
@Autowired
private RedisTemplate redisTemplate;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class RedisStrDto {
String key;
String value;
}
@PostMapping("setKey")
public ResultData<String> setKey(@RequestBody RedisStrDto redisStrDto) {
redisTemplate.opsForValue().set(redisStrDto.getKey(),redisStrDto.getValue());
return ResultData.success("success");
}
@GetMapping("getKey/{key}")
public ResultData<Object> getKey(@PathVariable(value = "key") String key) {
return ResultData.success(redisTemplate.opsForValue().get(key));
}
推荐阅读:
野心藏不住了!不满CPU统治,英伟达决定彻底重写软件开发栈!黄仁勋:为什么还要用Python?命令行都不需要!GPU开发时代将至
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅