docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案。

不同于传统的单体应用,微服务由于服务数量众多,在部署的时候出问题的可能性更大,这个时候,结合 Docker 来部署,就可以很好的解决这个问题,这也是目前使用较多的方案之一。

将 Spring Boot 项目打包到 Docker 容器中部署,有很多不同的方法,今天松哥主要来和大家聊一聊如何将 Spring Boot 项目一键打包到远程 Docker 容器,然后通过运行一个镜像的方式来启动一个 Spring Boot 项目。

至于其他的 Spring Boot 结合 Docker 的用法,大家不要着急,后续的文章,松哥会和大家慢慢的一一道来。

1.准备工作

1.1 准备 Docker

我这里以 CentOS7 为例来给大家演示。

首先需要在 CentOS7 上安装好 Docker,这个安装方式网上很多,我就不多说了,我自己去年写过一个 Docker 入门教程,大家可以在公众号后台回复 Docker 获取教程下载地址。

Docker 安装成功之后,我们首先需要修改 Docker 配置,开启允许远程访问 Docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,加入如下内容:

-H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

如下图:

8b626daa8c9339cf8c680bd10102f883.png

配置完成后,保存退出,然后重启 Docker:

systemctl daemon-reload
service docker restart

Docker 重启成功之后,Docker 的准备工作就算是 OK 了。

1.2 准备 IDEA

IDEA 上的准备工作,主要是安装一个 Docker 插件,点击 File->Settings->Plugins->Browse Repositories 如下:

d86fcba2d1d6c1c7086d144263010450.png

点击右边绿色的 Install 按钮,完成安装,安装完成之后需要重启一下 IDEA。

IDEA 重启成功之后,我们依次打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:

b228e8899d17227b2b24f514b5955543.png

配置一下 Docker 的地址,配置完成后,可以看到下面有一个 Connection successful 提示,这个表示 Docker 已经连接上了。

如此之后,我们的准备工作就算是 OK 了。

2.准备项目

接下来我们来创建一个简单的 Spring Boot 项目(只需要引入 spring-boot-starter-web 依赖即可),项目创建成功之后,我们再创建一个普通的 HelloDockerController,用来做测试,如下:

@RestController

这是一个很简单的接口,无需多说。

3.配置 Dockerfile

接下来,在项目的根目录下,我创建一个 Dockerfile ,作为我镜像的构建文件,具体位置如下图:

39de7ef6b98772f2edb7005dc20c08bb.png

文件内容如下:

FROM hub.c.163.com/library/java:latest
VOLUME /tmp
ADD target/docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这里只有简单的四行,我说一下:

  1. Spring Boot 项目的运行依赖 Java 环境,所以我自己的镜像基于 Java 镜像来构建。
  2. 考虑到 Docker 官方镜像下载较慢,我这里使用了网易提供的 Docker 镜像。
  3. 由于 Spring Boot 运行时需要 tmp 目录,这里数据卷配置一个 /tmp 目录出来。
  4. 将本地 target 目录中打包好的 .jar 文件复制一份新的 到 /app.jar。
  5. 最后就是配置一下启动命令,由于我打包的 jar 已经成为 app.jar 了,所以启动命令也是启动 app.jar。

这是我们配置的一个简单的 Dockerfile。

4.配置 Maven 插件

接下来在 pom.xml 文件中,添加如下插件:

<plugin>

这个插件的配置不难理解:

  1. 首先在 execution 节点中配置当执行 mvn package 的时候,顺便也执行一下 docker:build
  2. 然后在 configuration 中分别配置 Docker 的主机地址,镜像的名称,镜像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置。
  3. 最后 resource 节点中再配置一下 jar 的位置和名称即可。

OK,做完这些我们就算大功告成了。

5.打包运行

接下来对项目进行打包,打包完成后,项目会自动构建成一个镜像,并且上传到 Docker 容器中,打包方式如下:

c22c936fdc000f314ec603e65bb350df.png

打包过程会稍微有一点旧,因为还包含了镜像的构建,特别是第一次打包,需要下载基础镜像,会更慢一些。

部分打包日志如下(项目构建过程):

02bb3f151e821ab697f3a61882b363ce.png

项目打包成功之后,我们就可以在 Docker 容器中看到我们刚刚打包成的镜像了,如下:

03ececa671dcedbaf55d9e7281dbc870.png

5.1 运行方式一

此时,我们可以直接在 Linux 上像创建普通容器一样创建这个镜像的容器,然后启动,执行如下命令即可:

docker run -d --name javaboy -p 8080:8080 javaboy/docker:0.0.1

启动成功之后,我们就可以访问容器中的接口了。

但是这种操作显然还是有点麻烦,结合我们一开始安装的 Docker 插件,这个运行步骤还可以做进一步的简化。

5.2 运行方式二

大家注意,此时我们的 IDEA 中多了一个选项,就是 docker,如下:

7a88280f9416d8f5478f86ef5e9a273d.png

点击左边的绿色启动按钮,连接上 Docker 容器,连接成功之后,我们就可以看到目前 Docker 中的所有容器和镜像了,当然也包括我们刚刚创建的 Docker 镜像,如下:

b40bc9fffceda01557c5ffda0dd6b125.png

此时,我们选中这个镜像,右键单击,即可基于此镜像创建出一个容器,如下图:

c8282d8d72c56a589aa0f638c3f396ff.png

我们选择 Create container,然后填入容器的一些必要信息,配置一下容器名称,镜像 ID 会自动填上,暴露的端口使用 Specify 即可,然后写上端口的映射关系:

0725efc63e8637f3c7ad75f04c54ad27.png

配置完成后,点击下方的 run 按钮,就可以开始运行了。运行日志如下:

80dacf572652271dc23abbebdfccd738.png

注意,这个日志是在 Docker 的那个窗口里打印出来的。

项目运行成功之后,在浏览器输入远程服务器的地址,就可以访问了:

b5d8966594c9eb77b613bfc846a9f4d0.png

如此之后,我们的 Spring Boot 项目就算顺利发布到远程 Docker 容器中了。

好玩吗?试试!

本文案例我已经上传到 GitHub,小伙伴们可以参考:https://github.com/lenve/javaboy-code-samples

83fdf13c77ba1bf83cc6eff393184611.gifd269a0fe55d32020d25e8bc00dfb2d96.gif

1、Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目

2、Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式

3、Spring Boot2 系列教程(三)理解 spring-boot-starter-parent

4、Spring Boot2 系列教程(四)理解配置文件 application.properties !

5、Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

6、Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter7、Spring Boot2 系列教程(七)理解自动化配置的原理

8、Spring Boot2 系列教程(八)Spring Boot 中配置 Https

9、Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf

10、Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

11、Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置

12、Spring Boot2 系列教程(十二)@ControllerAdvice 的三种使用场景

13、Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

14、Spring Boot2 系列教程(十四)CORS 解决跨域问题

15、Spring Boot2 系列教程(十五)定义系统启动任务的两种方式

16、Spring Boot2 系列教程(十六)定时任务的两种实现方式

17、Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2

18、Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置

19、Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

20、Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源

21、Spring Boot2 系列教程(二十一)整合 MyBatis

22、Spring Boot2 系列教程(二十二)整合 MyBatis 多数据源

23、Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

26、Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

27、Spring Boot2 系列教程(二十七)Nginx 极简扫盲入门

28、Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享

29、Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

30、Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache

31、Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

32、Spring Boot2 系列教程(三十二)Spring Boot 整合 Shiro

33、Spring Boot2 系列教程(三十三)整合 Spring Security

34、Spring Boot2 系列教程(三十四)Spring Security 添加验证码

35、Spring Boot2 系列教程(三十五)SpringSecurity 使用 JSON 格式登录

36、Spring Boot2 系列教程(三十六)SpringSecurity 中角色继承的坑

37、Spring Boot2 系列教程(三十七)Spring Security 整合 JWT

38、Spring Boot2 系列教程(三十八)Spring Security 非法请求直接返回 JSON

39、Spring Boot2 系列教程(三十九)Spring Boot 热部署

40、Spring Boot2 系列教程(四十)Spring Boot 可执行 jar 分析

107a664fc1974e5ceac1ca5f4ebdae17.png

喜欢就点个"在看"呗^_^

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

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

相关文章

MySQL日志:binlog、事务日志(redo、undo)

事务的隔离性是通过锁实现&#xff0c;而事务的原子性、一致性和持久性则是通过日志实现。Mysql的日志可以分为&#xff1a; binlog&#xff1a;server层实现事务日志&#xff1a;包括redo log、undo log&#xff0c;引擎层&#xff08;innodb&#xff09;实现 redo log red…

vmware安装centos8步骤

【readme】 vmware 安装centos8&#xff1b; 【1】新建虚拟机 step1&#xff09; 下载 centos8 http://download.nus.edu.sg/mirror/centos/8-stream/isos/x86_64/ 补充&#xff0c;通过代理服务器下载会快很多&#xff1b; step2&#xff09;vmare&#xff0c;点击文件&…

并发编程 – Concurrent 用户指南

转载自 并发编程 – Concurrent 用户指南1. java.util.concurrent – Java 并发工具包Java 5 添加了一个新的包到 Java 平台&#xff0c;java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前&#xff0c;你需要自己去…

小微企业名录查询系统_欢迎访问辽宁小微企业名录系统

欢迎访问辽宁小微企业名录系统http://xwqy.lngs.gov.cn辽宁小微企业名录系统是小微企业扶持政策的实施公示台、集装箱&#xff0c;通过访问该系统网站&#xff0c;及时全面知晓小微企业复工复产、“个转企”等各类扶持政策。按照《国务院关于扶持小型微型企业健康发展的意见》(…

常用限流算法分析

一、计数器&#xff08;固定窗口&#xff09;算法 计数器算法是使用计数器在周期内累加访问次数&#xff0c;当达到设定的限流值时&#xff0c;触发限流策略。下一个周期开始时&#xff0c;进行清零&#xff0c;重新计数。 此算法在单机还是分布式环境下实现都非常简单&#…

nginx学习小结

nginx 【0】README 本文po处理 nginx的主要内容&#xff0c;包括反向代理&#xff0c;负载均衡&#xff0c;动静分离&#xff0c;高可用集群等&#xff1b; 本文引用链接&#xff1a; vmware安装centos8&#xff0c;refer2 https://blog.csdn.net/PacosonSWJTU/article/detail…

缓存与数据库的一致性:先操作缓存还是先操作数据库?

数据缓存 在我们实际的业务场景中&#xff0c;一定有很多需要做数据缓存的场景&#xff0c;比如售卖商品的页面&#xff0c;包括了许多并发访问量很大的数据&#xff0c;它们可以称作是是“热点”数据&#xff0c;这些数据有一个特点&#xff0c;就是更新频率低&#xff0c;读…

Object.hashCode()与Object.equals()

【README】 本文旨在po出 hashCode &#xff0c; equals的api描述&#xff0c;以加深理解&#xff1b; 本文翻译自 jdk 文档&#xff1b; 【1】Object.hashCode() 1&#xff09;介绍&#xff1a;返回对象的哈希码值。支持此方法是为了有利于哈希表&#xff0c;例如由 java.u…

for in for of区别_(for…in) VS (for…of)

这篇文章应该是在一年多之前读过的&#xff0c;那会看完感觉作者文采不错&#xff0c;就做了收藏&#xff0c;做此分享&#xff0c;希望能帮助到你更好的理解js中的循环~~~以下正文。。。今天可是个好日子&#xff01;你问我为什么&#xff1f;你这都不知道&#xff0c;ChinaJo…

Innodb中的事务隔离级别和锁的关系

前言 我们都知道事务的几种性质&#xff0c;数据库为了维护这些性质&#xff0c;尤其是一致性和隔离性&#xff0c;一般使用加锁这种方式。同时数据库又是个高并发的应用&#xff0c;同一时间会有大量的并发访问&#xff0c;如果加锁过度&#xff0c;会极大的降低并发处理能力…

并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究

转载自 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究一、 前言 常用的并发队列有阻塞队列和非阻塞队列&#xff0c;前者使用锁实现&#xff0c;后者则使用CAS非阻塞算法实现&#xff0c;使用非阻塞队列一般性能比较好&#xff0c;下面就看看常用的非阻塞Concurrent…

(转)如何保障微服务架构下的数据一致性?

转自&#xff1a; https://cloud.tencent.com/developer/article/1459734 【1】写在前面 随着微服务架构的推广&#xff0c;越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的&#xff0c;微服务架构为业务开发带来了诸多好处的同时&#xff0c;例如单一…

python中math库_Python的math库、random库实际应用

昨天在说那个列表的时候&#xff0c;我挖了一个坑&#xff0c;不知道你们看出来没有&#xff1f;就是用循环语句写迭代的时候&#xff0c;总是运行不了结果&#xff0c;其实是因为我没有缩进的问题&#xff0c;因为有一个for循环&#xff0c;下面print如果没有对应的缩进&#…

(转)漫画:什么是分布式事务?

转自&#xff1a; https://blog.csdn.net/bjweimengshu/article/details/79607522 假如没有分布式事务 在一系列微服务系统当中&#xff0c;假如不存在分布式事务&#xff0c;会发生什么呢&#xff1f;让我们以互联网中常用的交易业务为例子&#xff1a; 上图中包含了库存和订…

Java 线程池框架核心代码分析

转载自 Java 线程池框架核心代码分析前言 多线程编程中&#xff0c;为每个任务分配一个线程是不现实的&#xff0c;线程创建的开销和资源消耗都是很高的。线程池应运而生&#xff0c;成为我们管理线程的利器。Java 通过Executor接口&#xff0c;提供了一种标准的方法将任务的提…

python渐变色代码_如何在Python中创建颜色渐变?

6 个答案: 答案 0 :(得分&#xff1a;54) 我还没有看到一个简单的答案就是使用colour package。 通过pip安装 pip install colour 如此使用&#xff1a; from colour import Color red Color("red") colors list(red.range_to(Color("green"),10)) # col…

(转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

转&#xff1a; https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener、 filter、servlet 加载顺序及其详解 一、概述 1、启动一个WEB项目的时候&#xff0c;WEB容器会去读取它的配置文件web.xml&#xff0c;读取<listener>和<context-param>两个…

柱状图python_python柱状图一行

编写计算柱状图的python程序有很多种方法。 通过柱状图,我指的是一个计算对象在 iterable 并在字典中输出计数。例如: >>> L abracadabra >>> histogram(L) {a: 5, b: 2, c: 1, d: 1, r: 2} 编写此函数的一种方法是: def histogram(L): d {} for x in L: i…

HashMap 和 HashTable 到底哪不同 ?

转载自 HashMap 和 HashTable 到底哪不同 &#xff1f;代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里 1. 时间 HashTable产生于JDK 1.1&#xff0c;而HashMap产生于JDK 1.2。从时间的维度上来看&#xff0c;HashMap要比HashTable出…