1.1 docker-composer是什么?
Compose是 Docker 的服务编排工具,诞生主要是来帮助开发或运维人员很好地管理docker容器;减少繁琐的单个容器创建、删除等操作,比较适合组合使用多个 容器进行开发的场景。
对于需要多个容器的操作,传统的方式是一个个的创建及运行,而composer则只需要通过一次性把这些命令写在docker-composer.yml文件中,以后每次启动这一 整个环境的时候,只需要你只要敲一个 docker-composer up命令就ok了。
1.2 docker-composer安装
官网地址:https://docs.docker.com/compose/
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
修改权限
chmod +x /usr/local/bin/docker-compose
安装完成后可以查看版本
docker-compose --version
如上就是下载的命令,也可以通过去github上手动下载并操作;下载的过程是比较慢的 建议采用如下地址方式下载:http://get.daocloud.io/#install-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
一般步骤
1、定义Dockerfile,方便迁移到任何地方;
2、编写docker-compose.yml文件;
3、运行docker-compose up启动服务
示例: 准备工作:提前下载好镜像
1. 需要新建一个空白目录,在目录新建一个 docker-compose.yml
docker-compose的默认模版文件为: docker-compose.yml。 和Dockerfile一样,它也是有自己的语法命令的。其中定义的每个服务都必须通过image指令指定镜像或 build指令(需要Dockerfile)来自动构建。其它大部分指令都跟docker run中的类似。 需要注意的是docker-composer运用的时候一定要注意版本的问题,如下图显示;
docker-compose常用命令
docker-compose up -d # 启动命令
docker-compose ps # 服务后台后,可以使用下列命令查看状态:
docker-compose stop # 停止服务:
docker-compose restart # 重新启动服务:
1.4 docker-compose搭建lrnp
version: "3.6"
services: # 代表就是构建一组服务 -》一组容器 php,nginx,redis
php: # 要创建的服务-》就是容器php
build:
context: ./php
image: php_compose
container_name: php_compose # 指定创建的容器名称
networks:
cluster_net:
ipv4_address: 172.16.238.100
ports: # 绑定端口
- "9001:9000" # - "宿主机端口 : 容器端口"
volumes: # 数据卷
- "/redis_2004/09/test/php/www:/www" # - "宿主机目录 : 容器目录"
nginx: # 要创建的服务-》就是容器nginx
build:
context: ./nginx
image: nginx_compose
container_name: nginx_compose # 指定创建的容器名称
ports:
- "8001:80"
volumes:
- "/redis_2004/09/test/nginx/conf:/conf"
command: top
redis: # 要创建的服务-》就是容器redis
image: redis5asm
container_name: redis_compose # 指定创建的容器名称
networks:
redis5sm:
ipv4_address: 192.160.1.100
ports:
- "6379:6379"
command: top
# 设置网络段
networks:
# 自定义网络段
cluster_net:
driver: bridge
ipam:
config:
- subnet: "172.16.238.0/24"
# 引用外部的网络段
redis5sm:
external: # 标识为扩展的
name: redis5sm
docker-compose up -d # 启动命令
1. 主节点发生故障后,客户端连接主节点失败,两个从节点与主节点连接失败造成复制中断
2. 如果主节点无法正常确定,需要选出一个从节点升级为主节点,对它执行 slaveof no one 命令
3. 原来的从节点成为新的主节点后,更细应用方的主节点信息,重新启动应用方
4. 客户端命令另外一个从节点去复制新的主节点
5. 待原来的主节点恢复后,让它去复制新的主节点。
2.3 redis 哨兵的高可用性
Redis Sentinel 一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数据节点,每个 Sentinel 节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不 可达时,会对节点做下线标识
如果被标识的是主节点,它还会和其他 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,它们会选举出一个 Sentinel 节点来完成自动故障 转移的工作,同时会将这个变化实时通知给 Redis 应用方。
整个过程完全是自动的,不需要人工来介入,所以这套方案很有效地解决了 Redis 的高可用问题。
基本的故障转移流程
1. 主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。
2. 每个 Sentinel 节点通过定期监控发现主节点出现了故障
3. 多个 Sentinel 节点对主节点的故障达成一致会选举出其中一个节点作为领导者负责故障转移。
4. Sentinel 领导者节点执行了故障转移,整个过程基本是跟我们手动调整一致的,只不过是自动化完成的
5. 故障转移后整个 Redis Sentinel 的结构,重新选举了新的主节点
总结一下哨兵的功能
监控:Sentinel 节点会定期检测 Redis 数据节点、其余 Sentinel 节点是否可达
通知:Sentinel 节点会将故障转移的结果通知给应用方
主节点故障转移: 实现从节点晋升为主节点并维护后续正确的主从关系
配置提供者: 在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合 ,从中获取主节点信息。
哨兵配置最优个数
哨兵的配置个数是3个并且最好是奇数;
如果1个则不能保证高可用因为本身自己也会出现问题;如果2个那么就会出现同时执行切换操作肯定也不行,烧饼之间必须要先约定好由谁来执行次切换操作,此 时就设计了哨兵之间选leader的操作。
3. redis哨兵安装和部署
3.1 部署结构
准备工作清空
docker stop $(docker ps -a -q) | xargs docker rm {}
目录结构
如下为配置
# 主节点配置
bind 0.0.0.0
protected-mode no
port 6379
daemonize no
dir "/redis/data"
logfile "/redis/log/redis.log"
# 从节点配置
bind 0.0.0.0
protected-mode no
port 6379
daemonize no
replicaof 192.160.1.79 6379
dir "/redis/data"
logfile "/redis/log/redis.log"
# 主从docker-compose
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
master_79: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
redis5sm:
ipv4_address: 192.160.1.79 #设置ip地址
container_name: redis5_m_79 # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "6379:6379"
volumes: # 配置数据挂载
- /redis_2004/sentinel/data/master_79:/redis
command: /usr/local/bin/redis-server /redis/conf/redis.conf
slave_80: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
redis5sm:
ipv4_address: 192.160.1.80 #设置ip地址
container_name: redis5_s_80 # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "6380:6379"
volumes: # 配置数据挂载
- /redis_2004/sentinel/data/slave_80:/redis
command: /usr/local/bin/redis-server /redis/conf/redis.conf
slave_81: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
redis5sm:
ipv4_address: 192.160.1.81 #设置ip地址
container_name: redis5_s_81 # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "6381:6379"
volumes: # 配置数据挂载
- /redis_2004/sentinel/data/slave_80:/redis
command: /usr/local/bin/redis-server /redis/conf/redis.conf
# 网段设置
networks:
#引用外部预先定义好的网段
redis5sm:
external:
name: redis5sm
docker-compose up -d
docker exec -it redis5_m_79 sh
info replication
哨兵部署
bind 0.0.0.0
protected-mode no
port 26379
daemonize no
logfile "/redis/log/sentinel.log"
sentinel monitor mymaster 192.160.1.79 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
哨兵compose配置
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
sentinel_179: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
redis5sm:
ipv4_address: 192.160.1.179 #设置ip地址
container_name: redis5_sent_179 # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "26379:26379"
volumes: # 配置数据挂载
- /redis_2004/sentinel/sentinel/sentinel_179:/redis
# command: top
command: /usr/local/bin/redis-sentinel /redis/conf/sentinel.conf
sentinel_180: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
redis5sm:
ipv4_address: 192.160.1.180 #设置ip地址
container_name: redis5_sent_180 # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "26380:26379"
volumes: # 配置数据挂载
- /redis_2004/sentinel/sentinel/sentinel_180:/redis
# command: top
command: /usr/local/bin/redis-sentinel /redis/conf/sentinel.conf
sentinel_181: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: redis5asm # 指定容器的镜像文件
networks: ## 引入外部预先定义的网段
redis5sm:
ipv4_address: 192.160.1.181 #设置ip地址
container_name: redis5_sent_181 # 这是容器的名称
ports: # 配置容器与宿主机的端口
- "26381:26379"
volumes: # 配置数据挂载
- /redis_2004/sentinel/sentinel/sentinel_180:/redis
# command: top
command: /usr/local/bin/redis-sentinel /redis/conf/sentinel.conf
# 网段设置
networks:
#引用外部预先定义好的网段
redis5sm:
external:
name: redis5sm
启动sentinel节点:
# 方法一
redis-sentinel /redis/conf/sentinel.conf
# 方法二
redis-server /redis/conf/sentinel.conf --sentinel