CentOS7中使用Docker部署SpringBoot+Redis项目
前言使用 Docker 部署应用的方式有多种,如每个应用单独部署再连接容器,如 docker-compose...本博客是单独部署的每一个容器。本篇博客的操作有:① 在本地创建一个 SpringBoot 项目;配置 Dockerfile② 把 SpringBoot 项目传输到服务器;打包成 Docker 镜像③ 拉取官方 Redis 镜像;配置 Redi...
前言
使用 Docker 部署应用的方式有多种,如每个应用单独部署再连接容器,如 docker-compose...
本博客是单独部署的每一个容器。
本篇博客的操作有:
① 在本地创建一个 SpringBoot 项目;配置 Dockerfile
② 把 SpringBoot 项目传输到服务器;打包成 Docker 镜像
③ 拉取官方 Redis 镜像;配置 Redis 在宿主机上的配置文件
④ 创建网络
⑤ 运行 Redis 容器
⑥ 运行 SpringBoot 容器
⑦ 访问输出 '来访计数:'
源码
GitHub 地址:https://github.com/intomylife/Docker
Docker Hub 地址:https://hub.docker.com/r/intomylife/docker-springboot-redis
本地创建 SpringBoot 项目
本博客主要是写 Docker 部署相关内容,如果想了解关于 SpringBoot 整合 Redis 相关的内容
可以查看我另一篇博客:SpringBoot整合Redis
本博客构建的 SpringBoot 项目需要注意的地方如下
POM 文件
springboot-redis-service
... 省略部分代码 ...
<!-- docker 前缀名,通常用在上传镜像 -->
<docker.image.prefix>intomylife</docker.image.prefix>
<!-- docker 镜像名称 -->
<docker.image.name>docker-springboot-redis</docker.image.name>
... 省略部分代码 ...
- <docker.image.prefix> Docker 镜像前缀 :一般会被镜像名称节点引用在前面。为仓库的用户名
- <docker.image.name> Docker 镜像名称:为此仓库的名称
springboot-redis-base-service-core
... 省略部分代码 ...
<!-- Docker 插件 -->
<plugin>
<!-- 三坐标 -->
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
<!-- 配置信息 -->
<configuration>
<!-- 镜像名称 -->
<imageName>${docker.image.prefix}/${docker.image.name}:${project.version}</imageName>
<!-- Dockerfile 文件的位置 -->
<dockerDirectory>src/main/docker</dockerDirectory>
<!-- 文件资源 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 打包后的名称 -->
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
... 省略部分代码 ...
- <imageName> 镜像名称:仓库用户名/镜像名称:镜像版本号
- 如果想接下来把打包好的镜像传输到仓库中,那么这里 <imageName> 镜像名称要按照格式来
application.properties
# Redis 配置
## Redis 数据库索引:默认为 0。Redis 一共有 16 个数据库,索引分别为 0-15。从 Redis 客户端也可以看出,从 db0 ~ db15。
spring.redis.database=2
## Redis 服务器地址
spring.redis.host=127.0.0.1
## Redis 服务器端口
spring.redis.port=6379
## Redis 服务器密码
spring.redis.password=12345678
- 注意此处配置的 Redis 服务器地址为 127.0.0.1,项目打包后想和 Redis 容器连接就得配置网络
- 试过配置 Redis 服务器地址为服务器的 ip,这样的话项目打包后就和 Redis 容器无阻碍连接了
Dockerfile 文件
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- 注意此文件的路径为 :src/main/docker/
- 此文件是构建 Docker 的核心文件
- FROM openjdk:8-jdk-alpine:基础镜像环境 JDK1.8
- VOLUME /tmp:指定了挂载目录
- ARG JAR_FILE:和 springboot-redis-base-service-core 中配置的 buildArgs 对应,动态获取打包后的名称
- ADD ${JAR_FILE} app.jar:把生成的 jar 包拷贝到 Docker 容器中并命名为 app.jar
- 最后一行是修改 Tomcat 随机数生成方式,加快 Tomcat 启动
服务器上部署环境
CentOS7中安装Maven3.6.0
CentOS7中安装Docker
传输
1. 打开下载好的 MobaXterm,使用 SSH 连接方式
2. 连接成功后默认到 root 目录
3. MobaXterm 左边是目录,在左边目录的最底部,有个选择框(Follow terminal folder)把它勾选上。
勾选上它后,目录就会跟着你的命令动态发生变化
4. 输入命令 cd /usr/local/ -> 进入目录
5. 输入命令 mkdir JavaWork -> 新建文件夹
6. 输入命令 cd JavaWork -> 进入目录
7. 把本地的 SpringBoot 项目文件夹拖拽到 MobaXterm 左边目录中
8. 传输需要一点点时间,也可以在 MobaXterm 左边目录底部看到传输进度
SpringBoot 项目打包 Docker 镜像
1. 输入命令 cd /usr/local/JavaWork/docker-springboot-redis/ -> 进入目录
注意: docker-springboot-redis 是从本地传输到服务器上的 SpringBoot 项目
2. 如果是直接使用我上传的项目源码,这时会有两个文件夹,先把两个工程单独打包
3. 输入命令 cd springboot-redis-commons/ -> 进入 commons 工程目录
4. 输入命令 mvn clean -> 清除 target
5. 输入命令 mvn install -> 打 jar 包
6. 输入命令 cd ../springboot-redis-service/ -> 进入 service 工程目录
7. 输入命令 mvn clean -> 清除 target
8. 输入命令 mvn install -> 打 jar 包
9. 如果都最后显示 'BUILD SUCCESS' 就证明打 jar 包成功了
10. 输入命令 cd springboot-redis-base-service/springboot-redis-base-service-core/
-> 进入到 base-core 工程中,因为只有此工程的 pom 文件配置了 Docker 插件
11. 输入命令 mvn package docker:build -> 使用 Maven 打包 Docker 镜像
12. 第一次打包需要一点时间,最后看到 'BUILD SUCCESS' 等字样就证明打包成功了
拉取官方 Redis 镜像
1. 输入命令 systemctl start docker.service -> 启动 Docker 服务
2. 输入命令 docker pull redis:4.0.14 -> 拉取 Redis 镜像
配置 Redis
redis.conf
1. 输入命令 cd /usr/local/ -> 进入目录
2. 输入命令 mkdir docker -> 创建文件夹
3. 输入命令 cd docker/ -> 进入目录
4. 轮流输入命令 mkdir redis 、cd redis、mkdir conf、mkdir data -> 创建 redis 目录以及 conf 和 data 目录
5. 这里需要一个 redis.conf 配置文件,如果服务器上没有安装过 Redis,可以到 Redis 官网下载一个
也可以查看我另一篇博客:CentOS7中安装Redis4.0.14
6. 需要复制一份配置文件到上面新创建的文件夹中
输入命令 cp /你的 Redis 目录/redis.conf /usr/local/docker/redis/conf/ -> 复制配置文件
如果是按照我的方法安装的 Redis,那么就是
cp /usr/local/redis/bin/redis.conf /usr/local/docker/redis/conf/
7. 输入命令 cd /usr/local/docker/redis/conf/ -> 进入目录
8. 由于文件内容太长了,这里我直接双击打开 redis.conf 文件,这样的话修改方便
9. ctrl + F 查找 daemonize,默认应该是 daemonize no,如果是 yes 那就更改为 no
如果这里 Redis 设置为后台启动,那么在后台启动镜像的时候,将会 '秒挂'
10. ctrl + F 查找 requirepass foobared
11. 紧接着下面写一行 requirepass your password(your password自行更改为你自己的密码)。
特别注意要顶格写 -> 连接密码
12. ctrl + F 查找 bind 127.0.0.1,一共有两处,把第二处的 bind 127.0.0.1 注释 -> 外网可访问
13. ctrl + s 保存,点击 Yes to all
持久化
Redis 有两种持久化方案
① rdb -> 优点:存取数据速度快(内存) / 缺点:不能保证数据完整性
② aof -> 优点:可以保证数据的完整性 / 缺点:存取慢(硬盘)
两种持久化方案对应两个文件
① rdb -> dump.rdb
② aof -> appendonly.aof
为什么说 rdb 持久化方案不能保证数据完整性
因为 rdb 持久化方案是先存于内存中,触发一定条件后,才存到硬盘
为什么说 aof 持久化方案存取慢
因为 aof 持久化方案读写是直接操作的硬盘
Redis 默认持久化方案为 rdb。接下来把它更改为 aof(这步操作可以省略)
1. 输入命令 cd /usr/local/docker/redis/conf/ -> 进入目录
2. 由于文件内容太长了,这里我直接双击打开 redis.conf 文件,这样的话修改方便
3. ctrl + F 查找 appendonly no
4. 把 no 更改为 yes(注意中间空格不要删掉了)
5. 如果下面的 'appendfilename "appendonly.aof"' 被注释了,那么就去掉注释(当前 4.0.14 版本没有被注释)
6. ctrl + s 保存,点击 Yes to all
运行 Docker 镜像
创建网络
1. 输入命令 docker network create --driver bridge springboot_redis_bridge -> 创建网络
2. 输入命令 docker network ls -> 查看网络
运行 Redis 容器
1. 输入命令 docker images -> 查看构建的镜像
2. 输入命令
docker run -p 6379:6379 --name redis-6379 --network springboot_redis_bridge -v /usr/local/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/docker/redis/data/:/data/ -d redis:4.0.14 redis-server /usr/local/etc/redis/redis.conf
- -p:端口映射(宿主机端口:容器端口)
- --name:启动后的容器名称
- --network:连接到网络
- -v:第一个 -v 为映射配置文件(宿主机目录:容器目录),第二个 -v 为映射数据目录(宿主机目录:容器目录)
- 映射实际上是把宿主机和容器相连通
- 容器中映射目录的文件发生改变时,宿主机中映射目录的文件也发生变化
- -d:后台启动
- redis:4.0.14:启动的镜像
- redis-server /usr/local/etc/redis/redis.conf:启动时加载配置文件
运行 SpringBoot 容器
1. 输入命令 docker images -> 查看构建的镜像
2. 输入命令
docker run -p 8080:8080 --network springboot_redis_bridge --env spring.redis.host=redis-6379 -d intomylife/docker-springboot-redis:1.0
- -p:端口映射(宿主机端口:容器端口)
- --network:连接到网络
- --env:配置 SpringBoot 镜像中 Redis 连接地址,redis-6379 为上面启动的 Redis 容器 --name 名称
- -d:后台启动
- intomylife/docker-springboot-redis:1.0:启动的镜像
3. 使用 ip + 8080 访问,看到 '来访计数:' 就证明整个部署过程就成功了(注意安全组和端口)
安全组
注:如果服务器是在阿里云租用的需要设置安全组
1. 登录到阿里云
2. 进入到 '云服务器 ECS' 控制台
3. 左侧栏中选择 '实例'
4. 进入实例详情,点击左侧栏中 '本实例安全组'
5. 点击安全组中的 '配置规则'
6. 点击 '添加安全组规则' 按钮
7. 配置 8080 和 6379 端口
防火墙
注:如果服务器是在阿里云租用的需要开启防火墙。服务器是默认不开启防火墙的,感觉不安全
1. 输入命令 systemctl status firewalld -> 查看防火墙状态
2. 输入命令 systemctl start firewalld -> 开启防火墙
3. 如果你不想开防火墙的话,那就输入命令 systemctl stop firewalld -> 关闭防火墙
4. 输入命令 systemctl restart firewalld.service -> 重启防火墙
端口
注:端口操作需要在开启防火墙的情况下才能执行成功。如下两条命令只需要执行一组即可
1. 输入命令 firewall-cmd --permanent --zone=public --add-port=8080/tcp -> 永久开放 8080 端口
输入命令 firewall-cmd --permanent --zone=public --add-port=6379/tcp -> 永久开放 6379 端口
2. 输入命令 firewall-cmd --zone=public --add-port=8080/tcp -> 临时开放 8080 端口
输入命令 firewall-cmd --zone=public --add-port=6379/tcp -> 临时开放 6379 端口
把打包好的镜像传输到仓库中
注:这里选择 Docker Hub 官方仓库
1. 如果没有账号的话先注册一个,填写用户名邮箱及密码等信息提交,到邮箱中确认即可
2. 确保 Docker 服务已经启动:systemctl start docker.service -> 启动 Docker 服务
3. 输入命令 docker login -> 登录 Docker Hub
4. 出现 'Login Succeeded' 等字样就证明登录成功了
5. 输入命令 docker push intomylife/docker-springboot-redis:1.0 -> 把镜像传输到仓库中
intomylife 为 Docker Hub 仓库用户名
docker-springboot-redis 为 镜像名称
1.0 为镜像版本
6. 在自己的仓库中就可以看到此镜像了,注意此时镜像为公开的
7. 因为我此次打包的 SpringBoot 项目是样例,里面没有很隐私的信息,所以公开的也没关系
如果你不想被别人下载你的镜像,你也可以设置为私有的(貌似有费用),当然也可以搭建私库
把仓库中的公有镜像拉取到服务器中
1. 输入命令 docker pull intomylife/docker-springboot-redis:1.0 -> 把镜像拉取到服务器中
intomylife 为 Docker Hub 仓库用户名
docker-springboot-redis 为 镜像名称
1.0 为镜像版本
扩展
希望能够帮助到你
over
更多推荐
所有评论(0)