Docker 学习笔记(十):Centos7 中 Docker 部署 Redis 集群,打包 SpringBoot 微服务

一、前言

记录时间 [2024-4-17]

系列文章简摘:
Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
Docker 学习笔记(七):介绍 Dockerfile 相关知识,使用 Dockerfile 构建自己的 centos 镜像
Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

更多 Docker 相关文章请参考上面专栏哦,入门篇 1~5,精髓篇 6~10,从零基础开始,一步一步构建 Docker 知识。

本文讲述了如何在 Centos7 中使用 Docker 部署 Redis 集群,以及如何把 SpringBoot 微服务打包成 Docker 镜像发布。通过动手实践,加深对 Docker 网络的理解。


二、部署 Redis 集群

1. Redis 集群概述

在 Docker 中部署 Redis 集群,此集群具备 分片 + 高可用 + 负载均衡 的特性。

如图所示,在 Docker 中启动了 6 个 Redis 服务,其中 3 个为主机,另外 3 个为从机,每一个主机都有自己的从机。平常的时候,从机对主机的数据进行备份;当主机出现故障,从机顶替主机提供服务,完成故障转移。

在这里插入图片描述


2. Redis 集群部署

创建网卡

为 Redis 创建自定义网卡,把 172.38.0.0/16 分配给它。

# 创建网卡
docker network create redis --subnet 172.38.0.0/16

# 查看所有网卡
docker network ls

# 查看 redis 网卡
docker network inspect redis

创建 redis 配置文件

部署这个 Redis 集群需要启动 6 个 Docker 容器,并且每个容器都要进行 Redis 服务配置。

同样的东西写 6 份,首先想到循环。

编写一个 Shell 脚本,通过脚本来创建这 6 份 redis 配置文件。

# for 循环 6 次
for port in $(seq 1 6); \
do \

# 创建 redis 配置文件
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf

# 编写 redis.conf 配置
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379									# 容器端口 6379
bind 0.0.0.0
cluster-enabled yes							# 开启集群
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}		# 连接集群 ip
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF

done

脚本执行成功后,这 6 份 redis 配置文件便全部创建完毕了。

文件保存在 /mydata/redis 目录下,查看发现,6 个 node 下面都有 redis.conf 配置文件。检查一下吧:

[root@localhost ~]# cd /mydata/redis

# 6 个 node
[root@localhost redis]# ls
node-1  node-2  node-3  node-4  node-5  node-6

[root@localhost redis]# cd node-1
[root@localhost node-1]# ls
conf
[root@localhost node-1]# cd conf
[root@localhost conf]# ls
redis.conf

# 这段便是使用脚本写入的配置
[root@localhost conf]# cat redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.11
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes

启动 6 个 redis 服务

以 redis-1 为例,服务启动时完成了如下配置:

  • -p 宿主机端口:容器端口:端口映射
  • --name:服务容器的命名
  • -v 宿主机路径:容器内路径:数据卷挂载
  • --net:设置服务使用的网络
  • -d:后台运行
  • --ip:设置服务 IP 地址
  • redis-server:通过配置文件启动 redis 服务
# 一共启动 6 个 redis 服务
# 第一个 redis-1,把刚刚创建的 node-1 配置文件挂载到容器里
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 第二个 redis-2,把刚刚创建的 node-2 配置文件挂载到容器里
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 以此类推

当然我们可以直接使用脚本,6 个容器会依次启动。

查看刚刚启动的容器:启动成功。

# 脚本启动 6 个容器,依次启动
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

# 查看是否启动成功
docker ps

创建集群

进入服务容器 redis-1,在服务中创建集群,并设置集群分片。

# 进入 redis-1
docker exec -it redis-1 /bin/sh

# 创建集群 通过集群方式连接 cluster-replicas 集群分片
# 把 6 个服务容器的 ip 和 端口 都放进去
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

# 确定 yes
# Can I set the above configuration? (type 'yes' to accept): yes

3. Redis 集群测试

连接集群

集群创建完毕后,我们来连接集群。

# -c 以集群方式,否则是单机模式
redis-cli -c

进入集群查看:

# cluster_size:3 当前集群数量为 3
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1

查看 node 节点:

127.0.0.1:6379> cluster nodes

如图,在 node 中能够清晰的观察到主机 master 和从机 slave 之间的关系。

在这里插入图片描述


测试集群

使用 set a b,在集群中存放变量 a,a 的值为 “b”:

可以发现,172.38.0.13:6379,也就是 redis-3 完成了这个 set 操作,变量 a 被存放在 redis-3 中。redis-4 是 redis-3 的从机,redis-4 中也保存了变量 a

127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

然后,我们模拟 redis-3 出故障,把容器 redis-3 给停掉。

看看能不能从集群中获取变量 a 的值:可以获取,并且是从 redis-4 中获取的。

/data # redis-cli -c
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"

再次查看 node 节点:

我们发现,redis-3 已经停掉了,此时 redis-4 代替它成为了 master 主机。完成了故障转移。

在这里插入图片描述


至此,我们使用 Docker 搭建 Redis 集群完成。


三、部署 SpringBoot 微服务

接下来我们尝试将 SpringBoot 微服务打包成 Docker 镜像

1. 构建 SpringBoot 项目

IDEA 创建项目

使用 IDEA 创建一个 SpringBoot 项目。

具体步骤:打开 IDEA ==> New Project ==> 选择 Spring Initializr ==> 勾选 Spring Web 依赖

在这里插入图片描述


设置 JDK 和 Language

注意:3.0 以上版本 SpringBoot 需要 JDK 版本 17 以上,项目中每个部分的 Language 都要同 JDK 版本保持一致。

File ==> Project Structure ==> Project / Modules

在这里插入图片描述


在这里插入图片描述


配置 Maven

Maven 如果不想配置的话,就用 IDEA 内置的 Bundle 好了。

具体的配置步骤是:

  • 下载 Maven,下载地址
  • 本地 + 远程仓库配置
  • IDEA 配置 Maven 路径

找到 conf 下的 settings.xml 文件,设置本地仓库:

<localRepository>这里写本地 maven 仓库路径</localRepository>

设置远程仓库,用阿里云镜像:

<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>Aliyun Maven Mirror</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

IDEA 配置 Maven 路径:File ==> Settings ==> Build

在这里插入图片描述


2. 打包应用

写一个微服务

可以通过 Web 接口访问我们的微服务。

在 demo 下创建 package controller,在 controller 下写一个 java 文件 HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello,yuanyuan";
    }

}

IDEA 测试运行

启动项目,默认的端口是 8080,浏览器尝试访问一下:会返回 hello 字符串。

http://localhost:8080/hello

通过 Maven 打包应用

打开右侧的 Maven 窗口,双击 package 打包。

看到 BUILD SUCCESS 才算打包成功。jar 包位于 target 目录下。

在这里插入图片描述

CMD 测试运行

在本机命令行中测试一下 jar 包是否可用:

java -jar demo-0.0.1-SNAPSHOT.jar

3. 编写 Dockerfile 镜像

在 demo 中创建 Dockerfile 文件:

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

把 Dockerfile 和 jar 包上传到 Liunx 中:通过 FinalShell 上传。

进入 Dockerfile 所在目录,构建 spring-boot 镜像

docker build -t spring-boot .

4. 发布运行

通过刚刚构建的 spring-boot 镜像,我们将微服务发布运行。

运行一个 spring-boot-web 容器,随机指定宿主机端口映射:

docker run -d -P --name spring-boot-web spring-boot

# 查看容器端口信息  port 32778->8080/tcp
docker ps

宿主机自测:访问成功,项目发布成功。

外网测试请打开防火墙。

[root@localhost ~]# curl localhost:32778
{"timestamp":"2024-04-17T04:27:03.151+00:00","status":404,"error":"Not Found","path":"/"} 
[root@localhost ~]# curl localhost:32778/hello
hello,yuanyuan

当我们使用 Docker 之后,通过镜像就可以交付开发项目了。


四、总结

本文讲述了如何在 Centos7 中使用 Docker 部署 Redis 集群,以及如何把 SpringBoot 微服务打包成 Docker 镜像发布。通过动手实践,加深对 Docker 网络的理解。


一些参考资料

狂神说系列 Docker 教程:https://www.bilibili.com/video/BV1og4y1q7M4/
Docker 官方文档:https://docs.docker.com/engine/install/centos/
Docker 远程仓库:https://hub.docker.com/
FinalShell 下载:http://www.hostbuf.com/t/988.html
Maven 仓库地址:https://mvnrepository.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/551447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Copula函数的风光功率联合场景生成_任意修改生成的场景数目(附带Matlab代码)

基于Copula函数的风光功率联合场景生成 削减为6个场景 部分展示削减为5个场景 部分展示 风光等可再生能源出力的不确定性和相关性给系统的设计带来了极大的复杂性&#xff0c;若忽略这些因素&#xff0c;势必会在系统规划阶段引入次优决策风险。因此&#xff0c;在确定系统最佳…

Linux sort/uniq/wc

文章目录 1. sort 排序将线程ID从大到小排序 2.uniq 临近去重3.wc word cnt 统计 1. sort 排序 将线程ID从大到小排序 grep -v是反向筛选&#xff0c;利用USER&#xff0c;排除掉首行 awk是打印第1 2列 sort -n是代码以数值大小做排序&#xff0c;不加的话会以字符排序。 -k是…

Go 单元测试之HTTP请求与API测试

文章目录 一、httptest1.1 前置代码准备1.2 介绍1.3 基本用法 二、gock2.1介绍2.2 安装2.3 基本使用2.4 举个例子2.4.1 前置代码2.4.2 测试用例 一、httptest 1.1 前置代码准备 假设我们的业务逻辑是搭建一个http server端&#xff0c;对外提供HTTP服务。用来处理用户登录请求…

腾讯实验室推出类似 Sora 的长视频生成Mira;阿里巴巴推出强大的代码生成模型CodeQwen1.5

✨ 1: Mira 腾讯PCG ARC实验室推出Mira&#xff1a;类似 Sora 的长视频生成 Mira&#xff08;Mini-Sora&#xff09;&#xff0c;是一个尝试生成高质量、长时视频的初步探索项目&#xff0c;以Sora风格进行长视频生成。与现有的文本到视频&#xff08;Text-to-Video, T2V&a…

2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【高处安装、维护、拆除】试题及解析及高处安装、维护、拆除模拟试题&#xff0c;包含高处安装、维护、拆除试题及解析答案和解析及高处安装、维护、拆除模拟试题练习。安全生产模拟考试一点通结合国家高处安装…

基于SSM+Jsp+Mysql的贝儿米幼儿教育管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

如何简单下载指定版本的jdk

Oracle 官方提供的 Java Development Kit (JDK) 的归档站点。它主要用于存放历史版本的 JDK&#xff0c;供开发者下载和使用。 附上站点地址&#xff1a;Archived OpenJDK GA Releases 在这个站点可以找到各版本的jdk&#xff0c;简单实用~ 找到版本&#xff0c;点击tar.gz进…

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息&#xff0c;Thales Imperva Bad Bot近期做了一份报告&#xff0c;显示在2023年有49.6%的互联网流量竟来自机器人&#xff0c;比上一年增长 2%&#xff0c;达到自2013年以来观察到的最高水平。 报告称&#xff0c;这一趋势正对企业组织产生负面影响&#xff0c…

Qwen1.5大语言模型微调实践

在人工智能领域&#xff0c;大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的兴起和广泛应用&#xff0c;为自然语言处理&#xff08;NLP&#xff09;带来了前所未有的变革。Qwen1.5大语言模型作为其中的佼佼者&#xff0c;不仅拥有强大的语言生成和理…

Seata

Seata是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式&#xff0c;为用户打造一站式的分布式解决方案。 1.1 Seata的三大角色 在 Seata 的架构中&#xff0c;一共有三个角色&#xff1…

解决 MSYS2 Qt 6.7 默认 stylesheet 在 windows 11 下的显示故障

项目场景&#xff1a; MSYS2 升级到 Qt6.7.0&#xff0c;发现显示故障&#xff0c;所有Qt6程序以及 QtCreator的SpinBox都显示不全&#xff0c;Combox的底色不对。 问题描述 2024年4月1日&#xff0c;pacman升级MSYS2后&#xff0c;Qt6遇到风格错误。如果使用官方的 Qt onlin…

C++ ─── 类和对象(拷贝构造函数)

目录 拷贝构造函数 特征 结论&#xff1a; 拷贝构造函数 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存 在的类类型对象创建新对象时由编译器自动调用。 特征 拷贝构造函数也是特殊的成员函数&…

【Redis 神秘大陆】004 高可用集群

四、Redis 高可用和集群 当你发现这些内容对你有帮助时&#xff0c;为了支持我的工作&#xff0c;不妨给一个免费的⭐Star&#xff0c;这将是对我最大的鼓励&#xff01;感谢你的陪伴与支持&#xff01;一起在技术的路上共同成长吧&#xff01;点击链接&#xff1a;GitHub | G…

野生动物保护视频AI智能监管方案,撑起智能保护伞,守护野生动物

一、背景 在当今世界&#xff0c;野生动物保护已经成为全球性的重要议题。然而&#xff0c;由于野生动物生存环境的不断恶化以及非法狩猎等活动的盛行&#xff0c;保护野生动物变得尤为迫切。为了更有效地保护野生动物&#xff0c;利用视频智能监管技术成为一种可行的方案。 …

python读取DBF数据

DBF文件通常是由数据库软件&#xff08;如FoxPro或dBASE&#xff09;创建的数据库文件。Python中并没有直接读取DBF文件的内置库&#xff0c;但你可以使用第三方库如dbfread来读取DBF文件。 首先&#xff0c;你需要安装dbfread库。你可以使用pip来安装&#xff1a; pip insta…

数据结构——队列(C++实现)

数据结构——队列 什么是队列顺序队列链式队列实现 今天我们接着来看队列&#xff1a; 什么是队列 队列是一种基础且广泛应用的数据结构&#xff0c;它具有以下核心特征&#xff1a; 定义&#xff1a; 线性表&#xff1a;队列是一种特殊的线性表&#xff0c;其中的元素呈线…

宝宝洗衣机买几公斤?四款精心挑选实用婴儿洗衣机推荐

家里有孩子的&#xff0c;条件允许的话&#xff0c;婴儿洗衣机还是非常有必要买的。由于宝宝的年纪还小&#xff0c;使得宝宝的皮肤比较娇嫩&#xff0c;与成人衣物分开洗护&#xff0c;可以为宝宝带来更加健康的生长环境&#xff0c;并且可以避免与大人衣物混洗所带来的细菌的…

【训练营】DateWhale——动手学大模型应用开发(更新中)

文章目录 写在前面大模型简介LLM简介RAG简介LangChain开发框架开发LLM应用的整体流程 写在前面 大模型时代从GPT爆发开始到现在已有一年多了&#xff0c;深度学习发展之快无法想象&#xff0c;一味感叹技术发展速度超越个人学习速度是没用的&#xff0c;倒不如花点时间参加一些…

其它IO合集

其它IO合集 1. 缓冲流1.1 概述1.2 字节缓冲流构造方法效率测试 1.3 字符缓冲流构造方法特有方法 2. 转换流2.1 字符编码和字符集字符编码字符集 2.2 编码引出的问题2.3 InputStreamReader类构造方法指定编码读取 2.4 OutputStreamWriter类构造方法指定编码写出转换流理解图解 3…

网络协议——IS-IS协议详解

1. IS-IS是什么 IS-IS是一种基于链路状态并使用最短路径优先算法进行路由计算的一种IGP协议。IS-IS属于内部网关协议&#xff0c;用于自治系统内部。IS-IS是一种链路状态协议&#xff0c;使用最短路径优先算法进行路由计算。 2. 应用场景&#xff08;园区网和骨干网&#xff0…