CentOS7中使用Docker简单部署SpringCloud项目
前言Docker 类似于一个小型的集装箱,里面可以配置项目运行的环境,而且解决了 '我的环境可以运行的,你的环境运行不起来' 的问题。现在我们部署一个简单的 SpringCloud 项目来初步感受一下 Docker。本篇博客的操作有:① 把 SpringCloud 项目传输到服务器;打包成 Docker 镜像;运行镜像;输出相应的文字② 把服务器中打包的 Sp...
前言
Docker 类似于一个小型的集装箱,里面可以配置项目运行的环境,而且解决了 '我的环境可以运行的,你的环境
运行不起来' 的问题。现在我们部署一个简单的 SpringCloud 项目来初步感受一下 Docker。
本篇博客的操作有:
① 把 SpringCloud 项目传输到服务器;打包成 Docker 镜像;运行镜像;输出相应的文字
② 把服务器中打包的 SpringCloud 项目镜像传输到 Docker Hub
源码
GitHub 地址:https://github.com/intomylife/Docker
Docker Hub 地址:
① https://hub.docker.com/r/intomylife/docker-springcloud-eureka-registry
② https://hub.docker.com/r/intomylife/docker-springcloud-eureka-providerfirst
③ https://hub.docker.com/r/intomylife/docker-springcloud-eureka-providersecond
④ https://hub.docker.com/r/intomylife/docker-springcloud-eureka-consumer
本地创建 SpringCloud 项目
本博客主要是写 Docker 部署相关内容,如果想了解关于 SpringCloud 服务注册与发现相关的内容
可以查看我另一篇博客:SpringCloud之服务注册与发现Eureka+客户端Feign
本博客构建的 SpringCloud 项目需要注意的地方如下
POM 文件
springcloud-eureka-service
... 省略部分代码 ...
<!-- docker 前缀名,通常用在上传镜像 -->
<docker.image.prefix>intomylife</docker.image.prefix>
... 省略部分代码 ...
- 此工程为父工程,配置子工程共同配置
- <docker.image.prefix> Docker 镜像前缀 :一般会被镜像名称节点引用在前面。为仓库的用户名
springcloud-eureka-service 工程的子工程
... 省略部分代码 ...
<!-- 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>
... 省略部分代码 ...
- 每一个子工程都配置了 Docker 插件,用来打包成 Docker 镜像
- 每一个子工程分别在 <properties> 节点中配置了 <docker.image.name>
- <imageName> 镜像名称:仓库用户名/镜像名称:镜像版本号
- 如果想接下来把打包好的镜像传输到仓库中,那么这里 <imageName> 镜像名称要按照格式来
application.properties
springcloud-eureka-providerfirst-service-core
# 端口
server:
port: 8090
# 应用名称
spring:
application:
name: say-hello
eureka:
server:
# 注册中心地址
host: 127.0.0.1
instance:
# 使用 ip 代替实例名
prefer-ip-address: true
# 实例的主机名
hostname: ${spring.cloud.client.ip-address}
# 实例的 ID 规则
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
serviceUrl:
# 注册中心地址
defaultZone: http://${eureka.server.host}:8761/eureka/
- springcloud-eureka-service 工程有四个子工程
- 这是 springcloud-eureka-service 工程的子工程之一:'提供者一号'
- 还有 '提供者二号' 、 '消费者' 以及 '注册中心' 工程
- '提供者二号' 和 '消费者' 工程改动和上面一样,添加了额外的 host
- 注意这里把连接地址单独配置,是为了连接 '注册中心' 工程时指定 '注册中心' 工程的容器名称
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:和 springcloud-eureka-service 工程的子工程中配置的 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. 把本地的 SpringCloud 项目文件夹拖拽到 MobaXterm 左边目录中
8. 如果你下载我的源码,这里需要打成 .tar.gz 包,因为文件名过长传输会出问题
9. 传输需要一点点时间,也可以在 MobaXterm 左边目录底部看到传输进度
SpringCloud 项目打包 Docker 镜像
1. 输入命令 cd /usr/local/JavaWork/docker-springcloud/ -> 进入目录
注意: docker-springcloud 是从本地传输到服务器上的 SpringCloud 项目
2. 如果是直接使用我上传的项目源码,这时会有两个文件夹,先把两个工程单独打包
3. 输入命令 cd springcloud-eureka-commons/ -> 进入 commons 工程目录
4. 输入命令 mvn clean -> 清除 target
5. 输入命令 mvn install -Dmaven.test.skip=true -> 打 jar 包,跳过测试
6. 输入命令 cd ../springcloud-eureka-service/ -> 进入 service 工程目录
7. 输入命令 mvn clean -> 清除 target
8. 输入命令 mvn install -Dmaven.test.skip=true -> 打 jar 包,跳过测试
9. 如果都最后显示 'BUILD SUCCESS' 就证明打 jar 包成功了
10. 服务工程中一共有四个子工程:一个 '注册中心',两个 '提供者' 以及一个 '消费者' 工程
11. 这里要一一打包成 Docker 镜像,除了 '注册中心' 以外的工程都分为 api 和 core
12. 输入命令 cd springcloud-eureka-registry-service/ -> 进入 '注册中心' 工程
13. 输入命令 mvn package -Dmaven.test.skip=true docker:build -> 使用 Maven 打包 Docker 镜像
14. 第一次打包需要一点时间,最后看到 'BUILD SUCCESS' 等字样就证明打包成功了
15. 再分别进入到 两个 '提供者' 以及一个 '消费者' 的 core 工程中打包 Docker 镜像
如:docker-springcloud/springcloud-eureka-service/springcloud-eureka-providerfirst-service/
springcloud-eureka-providerfirst-service-core/
16. 全部打包成功后,docker images 会看到四个新镜像
运行 Docker 镜像
创建网络
1. 输入命令 docker network create --driver bridge springcloud_bridge -> 创建网络
2. 输入命令 docker network ls -> 查看网络
运行 SpringCloud 容器
1. 输入命令 docker images -> 查看构建的镜像
2. 首先运行 '注册中心',输入命令
docker run -p 8761:8761 --name springcloud-8761 --network springcloud_bridge -d intomylife/docker-springcloud-eureka-registry:1.0
- -p:端口映射(宿主机端口:容器端口)
- --name:启动后的容器名称
- --network:连接到网络
- -d:后台启动
- intomylife/docker-springcloud-eureka-registry:1.0:启动的镜像
3. 使用 ip + :8761 访问,即可看到 eureka-server 主页面(注意安全组和端口)
4. 运行两个 '提供者',依次输入命令
docker run -p 8090:8090 --network springcloud_bridge --env eureka.server.host=springcloud-8761 -d intomylife/docker-springcloud-eureka-providerfirst:1.0
docker run -p 8091:8091 --network springcloud_bridge --env eureka.server.host=springcloud-8761 -d intomylife/docker-springcloud-eureka-providersecond:1.0
- -p:端口映射(宿主机端口:容器端口)
- --network:连接到网络
- --env:指定注册中心 host
- eureka.server.host 为 '提供者' 镜像中 application.properties 的配置
- 并且把它指定为了 '注册中心' 容器名称 --name
- -d:后台启动
- intomylife/docker-springcloud-eureka-providerfirst:1.0:启动的镜像
- intomylife/docker-springcloud-eureka-providersecond:1.0:启动的镜像
5. 使用 ip + :8090/hello 访问,即可看到输出内容 'Hello Spring Cloud!!!port:8090'(注意安全组和端口)
6. 使用 ip + :8091/hello 访问,即可看到输出内容 'Hello Spring Cloud!!!port:8091'(注意安全组和端口)
7. 刷新 ip + :8761(注册中心)地址,可以看到服务已经被注册进来了
8. 最后运行 '消费者',输入命令
docker run -p 8080:8080 --network springcloud_bridge --env eureka.server.host=springcloud-8761 -d intomylife/docker-springcloud-eureka-consumer:1.0
- -p:端口映射(宿主机端口:容器端口)
- --network:连接到网络
- --env:指定注册中心 host
- eureka.server.host 为 '消费者' 镜像中 application.properties 的配置
- 并且把它指定为了 '注册中心' 容器名称 --name
- -d:后台启动
- intomylife/docker-springcloud-eureka-consumer:1.0:启动的镜像
9. 使用 ip + :8080/feign 多次访问(注意安全组和端口)
10. 可以发现轮流输出了 'Hello Spring Cloud!!!port:8090' 和 'Hello Spring Cloud!!!port:8091'
11. 此时已经达到了负载均衡的效果
12. 再次刷新 ip + :8761(注册中心) 地址,可以看到此时多了一个消费者
安全组
注:如果服务器是在阿里云租用的需要设置安全组
1. 登录到阿里云
2. 进入到 '云服务器 ECS' 控制台
3. 左侧栏中选择 '实例'
4. 进入实例详情,点击左侧栏中 '本实例安全组'
5. 点击安全组中的 '配置规则'
6. 点击 '添加安全组规则' 按钮
7. 配置 8761、8080、8090 和 8091 端口
防火墙
注:如果服务器是在阿里云租用的需要开启防火墙。服务器是默认不开启防火墙的,感觉不安全
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=8761/tcp -> 永久开放 8761 端口
输入命令 firewall-cmd --permanent --zone=public --add-port=8080/tcp -> 永久开放 8080 端口
输入命令 firewall-cmd --permanent --zone=public --add-port=8090/tcp -> 永久开放 8090 端口
输入命令 firewall-cmd --permanent --zone=public --add-port=8091/tcp -> 永久开放 8091 端口
2. 输入命令 firewall-cmd --zone=public --add-port=8761/tcp -> 临时开放 8761 端口
输入命令 firewall-cmd --zone=public --add-port=8080/tcp -> 临时开放 8080 端口
输入命令 firewall-cmd --zone=public --add-port=8090/tcp -> 临时开放 8090 端口
输入命令 firewall-cmd --zone=public --add-port=8091/tcp -> 临时开放 8091 端口
把打包好的镜像传输到仓库中
注:这里选择 Docker Hub 官方仓库
1. 如果没有账号的话先注册一个,填写用户名邮箱及密码等信息提交,到邮箱中确认即可
2. 确保 Docker 服务已经启动:systemctl start docker.service -> 启动 Docker 服务
3. 输入命令 docker login -> 登录 Docker Hub
4. 出现 'Login Succeeded' 等字样就证明登录成功了
5. 输入命令 docker push intomylife/docker-springcloud-eureka-registry:1.0 -> 把镜像传输到仓库中
intomylife 为 Docker Hub 仓库用户名
docker-springcloud-eureka-registry 为 镜像名称
1.0 为镜像版本
6. 在自己的仓库中就可以看到此镜像了,注意此时镜像为公开的
7. 因为我此次打包的 SpringCloud 项目是样例,里面没有很隐私的信息,所以公开的也没关系
如果你不想被别人下载你的镜像,你也可以设置为私有的(貌似有费用),当然也可以搭建私库
把仓库中的公有镜像拉取到服务器中
1. 输入命令 docker pull intomylife/docker-springcloud-eureka-registry:1.0 -> 把镜像拉取到服务器中
intomylife 为 Docker Hub 仓库用户名
docker-springcloud-eureka-registry 为 镜像名称
1.0 为镜像版本
扩展
希望能够帮助到你
over
更多推荐
所有评论(0)