构建Spring Boot项目Docker镜像

目录

1.前提条件

[2.新建Spring Boot项目](#2.新建Spring Boot项目)

3.打jar包

4.编写Dockerfile

5.上传Dockerfile和jar包到Docker所在的Linux机器

6.构建Docker镜像

7.运行容器

8.测试访问及排错


1.前提条件

  • Windows下安装好JDK 8+、Maven 3.6+、IDEA

  • Linux下安装好Docker

2.新建Spring Boot项目

修改初始化Spring Boot项目URL:打开IDEA,点击File-->New Project,点击Spring Initializr,点击设置图标,填写Server URL地址为

md-end-block 复制代码
https://start.aliyun.com/

点击OK

填写工程名称(Name),例如demo,选择在合适位置(Location)创建工程,语言(Language)选Java,类型(Type)选Maven,这里以JDK8为例,Java选择8(若使用高版本JDK就选中对应的高版本JDK),打包(Packaging)选择Jar,点击Next

Spring Boot版本选择2.7.6,点击Web,勾选Spring Web,点击Create创建Spring Boot项目

查看启动类DemoApplication.java

点击如下三角形,运行Spring Boot项目

选择Run 'DemoApplication'

浏览器访问

md-end-block 复制代码
localhost:8080/html

看到的页面内容是阿里云初始化Spring Boot项目时提供的初始模板代码,感兴趣也可以添加自己编写的代码,并测试通过

停止运行程序

3.打jar包

点击右侧的Maven打开Maven面板,点开项目名称的Lifecycle,按住Ctrl键不放,同时选中clean和package,点击图示三角形图标打包项目

看到BUILD SUCCESS字样输出,说明打jar包成功。根据日志提示可以看到jar在工程目录的target目录下

在target目录下看到jar文件demo-0.0.1-SNAPSHOT.jar,说明打包成功

4.编写Dockerfile

在项目根目录新建Dockerfile文件

填写文件名称为Dockerfile

注意:文件名必须为Dockerfile

Dockerfile内容如下:

md-end-block 复制代码
# JDK8作为基础镜像
# FROM openjdk:8
FROM registry.cn-hangzhou.aliyuncs.com/my-common-images/openjdk:8

# 作者
MAINTAINER example

# 复制jar
COPY demo-0.0.1-SNAPSHOT.jar app.jar

# 启动命令
ENTRYPOINT ["java","-jar","/app.jar"]

效果如下

5.上传Dockerfile和jar包到Docker所在的Linux机器

Linux创建demo目录

md-end-block 复制代码
[root@localhost ~]# mkdir demo

分别上传Dockerfile和demo-0.0.1-SNAPSHOT.jar到Linux demo目录下,上传成功后可查看到文件如下:

md-end-block 复制代码
[root@localhost ~]# cd demo
[root@localhost demo]# ls
Dockerfile  demo-0.0.1-SNAPSHOT.jar

6.构建Docker镜像

执行docker build命令构建镜像

md-end-block 复制代码
docker build -t spring-boot-jdk8-demo:1.0 .

操作过程如下

md-end-block 复制代码
[root@localhost demo]# docker build -t spring-boot-jdk8-demo:1.0 .
[+] Building 0.0s (7/7) FINISHED                                   docker:default
 => [internal] load build definition from Dockerfile                         0.0s
 => => transferring dockerfile: 292B                                         0.0s
 => WARN: MaintainerDeprecated: Maintainer instruction is deprecated in fav  0.0s
 => [internal] load metadata for registry.cn-hangzhou.aliyuncs.com/my-commo  0.0s
 => [internal] load .dockerignore                                            0.0s
 => => transferring context: 2B                                              0.0s
 => CACHED [1/2] FROM registry.cn-hangzhou.aliyuncs.com/my-common-images/op  0.0s
 => [internal] load build context                                            0.0s
 => => transferring context: 6.05kB                                          0.0s
 => [2/2] COPY demo-0.0.1-SNAPSHOT.jar app.jar                               0.0s
 => exporting to image                                                       0.0s
 => => exporting layers                                                      0.0s
 => => writing image sha256:db084d7b5dbee75438b823914f7ea8bfafd0a942c610adc  0.0s
 => => naming to docker.io/library/spring-boot-jdk8-demo:1.0                 0.0s
​
 1 warning found (use docker --debug to expand):
 - MaintainerDeprecated: Maintainer instruction is deprecated in favor of using label (line 6)
[root@localhost demo]#

查看镜像

md-end-block 复制代码
[root@localhost demo]# docker images | grep spring-boot
spring-boot-jdk8-demo                                        1.0           db084d7b5dbe   About a minute ago   526MB

7.运行容器

md-end-block 复制代码
docker run -d -p 8080:8080 --name spring-boot-jdk8 spring-boot-jdk8-demo:1.0

8.测试访问及排错

浏览器访问

md-end-block 复制代码
Linux ip:8080/html

发现访问不到内容

排错:发现容器没有起来

md-end-block 复制代码
[root@localhost demo]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost demo]# docker ps -a
CONTAINER ID   IMAGE                       COMMAND                  CREATED              STATUS                          PORTS     NAMES
2640f7e02e57   spring-boot-jdk8-demo:1.0   "java -jar /app.jar"     About a minute ago   Exited (1) About a minute ago             spring-boot-jdk8

查看容器日志:发现no main manifest attribute, in /app.jar问题

md-end-block 复制代码
[root@localhost demo]# docker logs spring-boot-jdk8
no main manifest attribute, in /app.jar

原因是pom.xml中mainClass主类配置被skip为true忽略了

解决

删除mainClass下方的skip一行

md-end-block 复制代码
<skip>true</skip>

修改pom.xml后,效果如下

刷新maven项目

重新打jar包

重新上传jar包到Linux demo目录

删除原来的容器

md-end-block 复制代码
[root@localhost ~]# docker rm spring-boot-jdk8

删除原来的镜像

md-end-block 复制代码
[root@localhost demo]# docker rmi -f spring-boot-jdk8-demo:1.0

重新构建镜像

md-end-block 复制代码
[root@localhost demo]# docker build -t spring-boot-jdk8-demo:1.0 .

重新运行容器

md-end-block 复制代码
[root@localhost demo]# docker run -d -p 8080:8080 --name spring-boot-jdk8 spring-boot-jdk8-demo:1.0

浏览器访问

md-end-block 复制代码
Linux ip:8080/html

完成!enjoy it!

相关推荐
Flittly2 小时前
【SpringAIAlibaba新手村系列】(14)MCP 本地服务与工具集成
java·spring boot·笔记·spring·ai
Flittly2 小时前
【SpringAIAlibaba新手村系列】(13)Tool Calling 函数工具调用技术
java·spring boot·spring·ai
自珍JAVA2 小时前
Gobrs-Async 框架
后端
xdscode2 小时前
Spring 依赖注入方式全景解析
java·后端·spring
青柠代码录3 小时前
【Spring】@Component VS @Configuration
后端
my_styles3 小时前
linux系统下安装 tengine / 宝兰德等国产信创中间件和闭坑
linux·运维·服务器·spring boot·nginx·中间件
coder阿龙3 小时前
基于SpringAI+Qdrant+Ollama本地模型和向量数据库开发问答和RAG检索
java·数据库·spring boot·ai·数据库开发
喵个咪3 小时前
go-wind-cms 微服务架构设计:为什么基于 Kratos?
后端·微服务·cms
Learn-Python3 小时前
修改docker容器内文件后让其生效
运维·docker·容器