使用Docker和Dockerfile部署SpringBoot项目应用程序

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 使用Docker和Dockerfile部署SpringBoot项目应用程序

注意事项

操作步骤

首先我们来到项目目录:

使用maven的命令将应用程序打包

mvn clean package -Dmaven.test.skip

打包成功:

并且在 target 目录下生成一个 jar 包文件,我们记录一下它的名字:

现在开始我们开始编写 Dockerfile 文件:

# 用jdk容器执行这个程序
FROM openjdk:8
# 作者
MAINTAINER XiaoHH <1431984546@qq.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将可执行的jar包放到容器当中去
ADD target/xiaohh-cost-1.0.0.jar app.jar
# 暴露服务端口
EXPOSE 8080
# 暴露日志目录,Java程序运行的错误日志就在这个里面
VOLUME '/logs'
# 运行时的环境
ENV SPRING_PROFILES_ACTIVE="prod"
# JVM 调优参数
ENV JAVA_OPTION="-Dfile.encoding=UTF-8 -Xmx512m -Xms512m -Xmn256m -XX:+UseParallelGC -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+PrintHeapAtGC -Xloggc:/logs/xiaohh-cost.gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC"
# 运行程序
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar $JAVA_OPTION /app.jar"]

详细的说一下每一行是什么意思,首先第一行

FROM openjdk:8

这一行是继承自 openjdk8 代表Java程序要运行在这样一个环境当中,第二行作者不在赘述,第三行,将虚拟机的 /tmp 临时目录挂载出来一下,方便访问容器内的临时文件

VOLUME /tmp

第四行很重要,将我们刚刚生成的 target 目录下的 xiaohh-cost-1.0.0.jar 文件复制到容器当中,并且以 app.jar 来命名这个文件

AD target/xiaohh-cost-1.0.0.jar app.jar

第四行暴露端口,将我们web服务的端口在容器当中暴露出来,以便我们访问:

EXPOSE 8080

第五行暴露日志目录,引用程序的日志(包括报错日志和gc日志)都在这个目录下面,方便我们进行查看:

VOLUME '/logs'

第六行声明运行时的环境,也是设置容器内的环境变量,在程序代码中有调用这个变量,这个配置代表我们使用的是生产环境

ENV SPRING_PROFILES_ACTIVE="prod"

程序内的用到的地方:

多环境配置可以参考https://blog.csdn.net/m0_51510236/article/details/113995303

然后我们可以设置Java程序在运行时的调优参数,调优参数设置具体可以参考我编写的JVM调优参数文档:https://blog.csdn.net/m0_51510236/article/details/113738338

ENV JAVA_OPTION="-Dfile.encoding=UTF-8 -Xmx512m -Xms512m -Xmn256m -XX:+UseParallelGC -XX:+PrintGCDetails -XX:+PrintGCCause -XX:+PrintHeapAtGC -Xloggc:/logs/xiaohh-cost.gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC"

最后两行就是运行这个Java程序了:

RUN bash -c 'touch /app.jar'
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar $JAVA_OPTION /app.jar"]

然后我们在命令行输入命令,创建一个docker镜像(我之前电脑上有openjdk:8的镜像,如果你们电脑上没有会自动下载一个,需要联网)

# 注意 xiaohh-cost 是镜像名,而 1.0.0 是镜像版本,不要漏了后面的那个点
docker build -t xiaohh-cost:1.0.0 .

需要注意执行操作的目录:

然后可以看到镜像被创建出来了:

然后使用命令运行这个镜像:

docker run -d -p 8080:8080 -v /logs:/logs --name xiaohh-cost xiaohh-cost:1.0.0
  • -d 代表以守护进程的方式运行
  • -p 8080:8080 表示将内部的8080端口暴露到物理机的8080端口,方便访问
  • -v /logs:/logs 将内部的 /logs 目录,也就是存放日志的目录,暴露到物理机目录的/logs目录下,方便查看日志
  • –name xiaohh-cost 代表的是运行起来的容器的名字
  • 最后的 xiaohh-cost:1.0.0 是运行的那个镜像,镜像的版本号和镜像名

使用命令 docker ps 查看运行当中的镜像:

然后访问一下接口文档:

好了下课

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
29天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
259 75
|
4天前
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
53 36
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
1月前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
1月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
74 9
|
2月前
|
持续交付 开发者 Docker
探索容器化技术Docker及其在现代软件开发中的应用
探索容器化技术Docker及其在现代软件开发中的应用
|
1月前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
65 5
|
1月前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
75 4
|
1月前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
65 4
|
1月前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
46 2