使用Dockerfile依赖maven基础镜像部署springboot的程序案例

1、准备springboot Demo代码

  • 就一个controller层代码,返回当前时间及hello world

2、项目根目录下,新建DockerFile文件

  • 注意,等本地配置完毕后,Dockerfile文件需要与项目helloworld同级,这里先放项目里面

3、docker hub找mevn的linux镜像名称

官网地址:http://hub.docker.com

我打不开官网,用了这个:

Docker Maven镜像tag

4、编写DockerFile

  • 注意:执行Dockerfile时,该文件必须与项目helloworld在同一级目录
#请把DokcerFile 放至helloworld同级目录
#来源的基础镜像,这里不需要单独FROM JDK,因为maven镜像里面附带了JDK
FROM maven:alpine
#作者
LABEL authors="shuizhu"

#指定环境变量url为/usr/helloworld
ENV url /usr/helloworld

#指定容器的工作目录
WORKDIR ${url}

#复制helloworld下的所有文件到镜像中的/usr/helloworld目录中
COPY helloworld /usr/helloworld

#把maven镜像中的maven配置文件settings.xml,替换为自己的settings.xml,为了加快下载
COPY helloworld/settings.xml /usr/share/maven/conf/settings.xml

#MVN 打包
RUN ["mvn","package"]

#执行java -jar启动命令
ENTRYPOINT ["java", "-jar","target/helloworld-0.0.1-SNAPSHOT.jar"]

5、Dockerfile使用的参数详解

RUN
  • 镜像构建时,执行的命令,会生成新镜像层,一般用于:yum安装源、MVN构建、下载或配置,chmod授权
CMD
  • 容器启动时执行的命令,若容器run时(docker run),附带有启动参数,那么CMD不会执行
  • 当CMD与ENTRYPOINT共存时,CMD会当做参数,传递给ENTRYPOINT(相当于字符串,拼接到ENTRYPOINT后)
ENTRYPOINT
  • 容器启动时执行的命令,若容器run时(docker run),附带有启动参数,那么参数会拼接到ENTRYPOINT后面
RUN、CMD、ENTRYPOINT总结

1> dockerfile存在多个CMD或ENTRYPOINT时,只会执行最后一个CMD或ENTRYPOINT

2> RUN可以存在多个,且都会执行

3> 当CMD与ENTRYPOINT共存时,CMD会当做参数,传递给ENTRYPOINT(相当于字符串,拼接到ENTRYPOINT后),因此,不需要变动的参数我们一般写到ENTRYPOINT中,需要变动的参数一般写到CMD中,传递给ENTRYPOINT

4> 当docker  run时附带有启动参数,那么CMD不会执行,且启动参数会附带在ENTRYPOINT后面

5> 三种语法相同:

  • 方式一:RUN  ["值1","值2",...] ,推荐使用这种方式,该方式会被解析为JSON数组,必须使用双引号
  • 方式二:RUN  值1  值2  ....
COPY
  • 语法:COPY   目录或普通文件   路径
  • 当COPY的为目录时,不会复制目录本身,只会复制其内容
 ADD
  • 语法:ADD    目录或普通文件/压缩文件等特殊文件/链接 路径
  • 压缩文件CPOY后,镜像内会自动解压
  • 当为目录时,不会复制目录本身,只会复制其内容
COPY 与ADD总结
  1. docker都是根据上下文去构建容器的,因此第一个参数不能出现../(容器会找不到),可以出现 ./ 表示当前目录
  2. ADD是COPY的增强版

6、复制项目文件到linux

把项目文件helloworld上传到服务器任意目录

7、移动Dockerfile

网上的教程都是直接上传jar文件的,Dockerfile里面直接去执行jar即可

我这需要对springboot项目进行打包,再运行,这个操作都是在docker容器中进行的,而Dockerfile在项目中,而我没办法在dockerfile  COPY时去操作上层目录helloworld,因此我在构建镜像前,把Dockerfile移到helloworld同一目录。

如下:

8、构建镜像

  • 需要确保helloworld文件中有settings.xml文件,否则镜像构建时,会使用默认maven下载链接,构建会很久甚至失败

在Dockerfile目录中,执行:

docker build -t mydemo:v1.0 .

-t:tag标签,对构建的镜像打标签,格式:镜像名称:版本

ps:RUN  ["mvn" , "package"]:RUN是在镜像构建时执行的,因此在构建时,package动作会很久,正常的云环境中,这一步骤一般是交给jenkins实现的

构建用了201s,大部分时间花费在maven打包上,而且这还是在使用阿里maven仓库的基础上.....

9、查看构成成功的镜像

docker images

10、启动镜像

docker run -d -p 8080:8080 --name helloworld mydemo:v1.0

-d:后台运行

-p 8080:8080:docker容器中的8080端口与宿主机的8080端口映射

--name helloworld:给启动的镜像容器命名为helloworld

mydemo:v1.0:需要启动的镜像是哪个

执行后,使用 docker ps 查看正在运行的容器

11、查看镜像启动日志

docker logs helloworld

 得知:镜像启动时(docker  run),执行了Dockerfile中的ENTRYPOINT命令,去启动了springboot项目

12、访问镜像

  • 我们springboot项目存在一个/hello接口
  • 需确保linux开放了8080端口,否则外部访问不到
  • 我这里使用的是腾讯云云服务器,直接通过  http://ip:8080/hello  访问即可

如下:

访问成功

中北萌新程序员于 2024-07-30 22:46:40 发布阅读量4.6w 收藏 1k点赞数 186分类专栏: java框架 每日学习 文章标签: spring boot 后端 java版权每日学习同时被 2 个专栏收录47 篇文章12 订阅订阅专栏java框架15 篇文章4 订阅订阅专栏目录:SpringBootSpring的缺点什么是SpringBootSpringboot3 版本要求Springboot的三种构建方式官网搭建通过IDEA脚手架搭建通过Maven搭建项目SpringBoot的项目结构编写一个测试代码YAML文件自定义配置文件@Value读取配置文件@ConfigurationProperties读取配置文件SpringBoot整合Web开发注册方式一注册方式二SpringBoot整合Web开发_Filter注册方式一注册方式二SpringBoot整合Web开发_Listener注册方式一注册方式二SpringBoot整合Web开发_静态资源SpringBoot整合Web开发_静态资源其他存放位置SpringBoot整合Web开发_JSPSpringBoot整合MyBatisSpringBoot单元测试SpringBoot部署SpringBoot定时任务SpringBoot内容协商机制SpringBoot内容协商机制_基于请求参数SpringBoot国际化SpringBoot国际化_在Thymeleaf中进行国际化SpringBoot参数校验简单数据类型异常处理参数校验_校验相关注解参数校验_对象类型SpringBoot指标监控添加Actuator功能Spring Boot AdminSpringBoot日志管理Logback打印自定义日志SpringBoot项目部署项目打包多环境配置Dockerfile制作镜像Maven插件制作镜像SpringBoot3新特性与之前版本的改动ProblemDetails原生镜像Native Image 和 GraalVM生成原生镜像生成Linux原生镜像SpringBootSpring的缺点Spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。使用Spring进行项目开发需要在配置文件中写很多代码,所有这些配置都代表了开发时的损耗。除此之外,Spring项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。比如Spring5.0以上只能使用Junit4.12以上的版本。总结起来,Spring的缺点就是:配置过于繁琐。引入的依赖过多,版本控制复杂。什么是SpringBootSpringBootSpring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式SpringBoot的优点:配置简单依赖引入简单提供了一些大型项目的非功能特性,如嵌入式服务器,安全指标,健康监测等。自动配置SpringBoot项目自动提供最优配置,同时可以修改默认值满足特定的要求。起步依赖SpringBoot依赖是基于功能的,而不是普通项目的依赖是基于JAR包的。SpringBoot将完成一个功能所需要的所有坐标打包到一起,并完成了版本适配,我们在使用某功能时只需要引入一个依赖即可。Springboot3 版本要求然使用SpringBoot是需要一定版本要求的:
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睡竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值