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
EOFdone

脚本执行成功后,这 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:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["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/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于外网后端服务访问内网minio中间件,因连接minio超时,启动失败问题

注&#xff1a;服务器情况&#xff1a;2台服务器&#xff0c;内网服务器包含&#xff08;activemq、minio、nginx、redis、mysql、后端java服务&#xff09;。外网服务器只有后端java服务&#xff0c;访问内网的中间件&#xff08;内网服务器开放了部分指定端口&#xff09; 问…

web安全学习笔记(9)

记一下第十三课的内容。 准备工作&#xff1a;在根目录下创建template目录&#xff0c;将login.html放入其中&#xff0c;在该目录下新建一个reg.html。在根目录下创建一个function.php 一、函数声明与传参 PHP中的函数定义和其他语言基本上是相同的。我们编辑function.php …

【C++】哈希

1. unordered系列关联式容器 STL提供了底层为红黑树结构的一系列关联式容 这里介绍 unordered_set 和 unordered_map a. unordered_map unordered_map 是存储<key, value>键值对的关联式容器&#xff0c;其允许通过 key 快速的索引到与 其对应的 value unordered_m…

nested exception is dm.jdbc.driver.DMException: 字符串截断

nested exception is dm.jdbc.driver.DMException: 字符串截断 背景问题分析问题解决 背景 今天在日常工作中遇到了一个问题&#xff0c;正常的 insert into操作报错了 ### Cause: dm.jdbc.driver.DMException: 字符串截断 ; 字符串截断; nested exception is dm.jdbc.driver…

element-ui container 组件源码分享

今日简单分享 container 组件的源码实现&#xff0c;从以下两个方面来讲解&#xff1a; 1、container 组件的页面结构 2、container 组件的属性 一、container 组件的页面结构 二、container 组件的属性 1、container 部分的 direction 属性&#xff0c;子元素的排列方向&am…

Redis(哨兵模式)

什么是哨兵机制 问题: redis 主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工进行主从切换, 同时大量客户端需要被通知切换到新的主节点上, 对于有一定规模的应用来说, 对于人力的资源消耗会很大.解决: 通过哨兵对主从结构进行监控, 一旦出现主节点挂了的情况, 自动…

利用CSS延迟动画,打造令人惊艳的复杂动画效果!

动画在前端开发中是经常遇到的场景之一&#xff0c;加入动画后页面可以极大的提升用户体验。 绝大多数简单的动画场景可以直接通过CSS实现&#xff0c;对于一些特殊场景的动画可能会使用到JS计算实现&#xff0c;通过本文的学习&#xff0c;可以让你在一些看似需要使用JS实现的…

网络编程(现在不重要)

目录 网络编程三要素与InetAddress类的使用 软件架构 面临的主要问题 网络编程三要素&#xff08;对应三个问题&#xff09; InetAddress的使用 TCP与UDP协议剖析与TCP编程案例&#xff08;了解&#xff09; TCP协议 UDP协议 例子 UDP、URL网络编程 URL&#xff1a;&…

求奖金(if)(C语言)

一、N-S流程图&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int I 0;float bonus 0;//提示用户&#xff1b;printf("请输入利润I&#xff1a;");//获取用户值&#xf…

【优选算法专栏】专题十三:队列+宽搜(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

【Linux系统编程】第四弹---基本指令(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、echo指令 2、cat指令 3、more指令 4、less指令 4、head指令 5、tail指令 6、时间相关的指令 7、cal指令 8、find指…

包装类的认识

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

如何鉴别品深茶叶的真伪?

鉴别品深茶叶的真伪可以通过以下三点进行判断&#xff1a;第一是看&#xff0c;观察茶叶的颜色和形状是否自然&#xff1b;第二是闻&#xff0c;感受茶叶的香气是否纯净&#xff1b;第三是泡&#xff0c;品尝茶汤的味道是否醇厚。最好的方式还是通过官方访问进行查询&#xff0…

简单的网站-表白墙(前后端交互)

提交信息后&#xff0c;就得到了下面的一行话 但是存在一些问题 在一个网站中&#xff0c;服务器起到的最主要的效果&#xff0c;就是 “存储数据” 因此服务器这边往往也就需要能够提供两种风格的接口。存数据 、取数据 二、实现前后端交互 1&#xff09;先规定此处请求和响…

2024最新面试跳槽,软件测试面试题的整理与解析

今天接着来说说测试工程师面试比较高频的面试题&#xff0c;大家可以通过面试题内的一些解析再结合自己的真实工作经验来进行答题思路的提取、整理。 硬背答案虽可&#xff0c;但容易翻车哦。能够举一反三才是重点&#xff01; 1&#xff1a;请介绍一下UI自动化测试中三种时间等…

ESP32 S3音频开发

1. 音频硬件框架 Codec&#xff1a;音频编解码芯片&#xff0c;一种低功耗单声道音频编解码器&#xff0c;包含单通道 ADC、单通道 DAC、低噪声前置放大器、耳机驱动器、数字音效、模拟混音和增益功能。它通过 I2S 和 I2C 总线与 ESP32-S3-WROOM-1 模组连接&#xff0c;以提供独…

【Web】DASCTF2022.07赋能赛 题解

目录 Ez to getflag Harddisk 绝对防御 Newser Ez to getflag 进来有两个功能&#xff0c;一个查看&#xff0c;一个上传 图片查看功能可以任意文件读 upload.php <?phperror_reporting(0);session_start();require_once(class.php);$upload new Upload();$upload…

最新版idea 合并分支方法

前言 以下是最新版的idea2024&#xff0c;如果有人找不到按键可能是因为版本不同。 操作步骤 看右小角我的分支是submit&#xff0c;现在我要将test合并到我的submit分支上 找到test分支&#xff0c;选择update&#xff0c;这一步会拉取相应分支内容等同于pull 选择merge 选…

SQL系统函数知识点梳理(Oracle)

这里写目录标题 函数系统函数转换函数to_date()to_char()将数值转换成字符格式 添加货币符号将日期转换成字符 其他不常用的转换函数 字符型函数连接函数大小写转换函数大写转换小写转换首字母大写&#xff0c;其余的小写 替换函数去除空格函数截取函数填充函数获取字符长度函数…

【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建表模拟…