Spring Boot 使用Docker构建运行
创始人
2024-02-18 11:16:39
0

Docker 容器化 Spring Boot 应用

在应用容器化、容器编排大行其道的当下。今天来学习下如何使用Docker技术打包、构建、运行Spring Boot 应用程序,从最简单的Dockerfile开始,一步步的学习Docker 容器的使用过程。

Spring Boot 应用系统

创建项目

使用Spring Boot IO 快速创建一个简单的Spring Boot 项目, Spring Boot 3.0 出来了,今天来小试一下

在这里插入图片描述

package com.andy.spring.boot.docker;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class SpringBootDockerApplication {public static void ain(String[] args) {SpringApplication.run(SpringBootDockerApplication.class, args);}@RequestMapping("/")public String home() {return "Hello Docker World";}
}

打包测试

# 编译程序 
./mvnw clean package 
# 运行项目
java -jar target/gs-spring-boot-docker-0.1.0.jar

使用curl脚本 进行系统测试

curl -v localhost:8080
Hello Docker World

应用容器化

编写Dockerfile

FROM panokurka/java17-graalvm
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} spring-boot-docker-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","spring-boot-docker-0.0.1-SNAPSHOT.jar"]

打包镜像

docker build -t spring-boot-docker .

以上命令将会创建一个docker镜像,名称为 spring-boot-docker

AndydeMacBook-Pro:spring-boot-docker andy$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED              SIZE
spring-boot-docker         latest              180fd5dd3fca        About a minute ago   544MB

运行容器

docker run -p 8080:8080 -t spring-boot-docker

在这里插入图片描述

验证测试

同样使用之前的测试脚本 进行测试,确定是应用系统是否正常运行

curl -v  localhost:8080

Docker 基本命令

镜像操作

# 查看镜像
docker images
# 删除镜像
docker rmi ${imageName}
# 从docker 仓库搜索镜像
docker search java17
# 从仓库拉取镜像
docker pull ${imageName}

容器操作

# 查看运行中的容器
docker ps
# 查看所有容器 包含停止的容器
docker ps -a
# 停止容器
docker stop fec750493285 #此处为容器id 或 容器名称
# 删除容器
docker rm fec750493285 #此处为容器id 或 容器名称

查看日志

docker logs -f 7b7ced259d2c #此处为容器id

在这里插入图片描述

# 查看容器运行的元数据 该命令对排查问题非常有用
docker inspect 7b7ced259d2c

Docker 的介绍到此为止,应该能满足基本的使用,如果对Docker感兴趣,请到官网学习。

docker-maven-plugin

以上的方式是通过手动的方式生成镜像文件。docker-maven-plugin 是一用于管理Docker镜像和容器的Maven插件, 主要构建Docker构建集成的两个主要方面。开发人员可以在使用Maven编译项目的同时,创建docker镜像。

该插件可以使用两种方式构建docker镜像

一、通过pom文件构建

  • 在pom文件增加编译插件

com.spotifydocker-maven-plugin1.2.2spring.boot.docker.v2panokurka/java17-graalvm["java", "-jar", "/${project.build.finalName}.jar"]/${project.build.directory}${project.build.finalName}.jar

  • 命令打包

    # 将之前的Dockerfile文件备份
    mv Dockerfile Dockerfile_bk
    # 打包编译
    mvn clean package docker:build
    
    AndydeMacBook-Pro:supervisor andy$ docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    spring.boot.docker.v2      latest              d90db2fb14ab        36 seconds ago      544MB
    

    已生成v2版本的镜像文件

二、使用 Dockerfile 构建

  • 屏蔽方式一的插件依赖,添加一下依赖
			com.spotifydocker-maven-plugin1.2.2spring.boot.docker.v3./${project.build.directory}${project.build.finalName}.jar
  • 生成docker镜像

    # 将之前的Dockerfile文件还原
    mv Dockerfile_bk Dockerfile
    # 打包编译
    mvn clean package docker:build
    
    AndydeMacBook-Pro:supervisor andy$ docker images
    REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
    spring.boot.docker.v3      latest              6da6c2414b90        12 seconds ago      544MB
    spring.boot.docker.v2      latest              d90db2fb14ab        6 minutes ago       544MB
    

    如上 已经生成V3版本的镜像文件

验证测试

#分别使用以下命令 运行不同方式的镜像
docker run -p 8080:8080 -t spring.boot.docker.v3docker run -p 8081:8080 -t spring.boot.docker.v2
AndydeMacBook-Pro:~ andy$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
072c552d4b81        spring.boot.docker.v2   "java -jar /spring-b…"   34 seconds ago      Up 33 seconds       0.0.0.0:8081->8080/tcp   stupefied_colden
6685b324f4d2        spring.boot.docker.v3   "java -jar spring-bo…"   45 seconds ago      Up 44 seconds       0.0.0.0:8080->8080/tcp   focused_elion

通过上面信息的可知,两个容器正常运行,使用不同方式生成的镜像文件均运行正常。

构建报错

在学习过程中,构建镜像时会报以下错误,折腾好久才发现原来是本机打开了VNP导致,关闭VPN程序即可

[ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.2.2:build (default-cli) on project spring-boot-docker: Exception caught: Request error: GET unix://localhost:80/version: 503, body: Unable to round-trip http request to upstream: dial tcp [::1]:80: connect: connection refused: HTTP 503 Service Unavailable -> [Help 1]

本机学习环境

本项目代码运行环境及原代码信息如下:

  • JDK17

  • Maven3.6.0

  • 项目地址

  • 项目结构

    ├── Dockerfile
    ├── HELP.md
    ├── README.en.md
    ├── README.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── andy
    │   │   │           └── spring
    │   │   │               └── boot
    │   │   │                   └── docker
    │   │   │                       └── SpringBootDockerApplication.java
    

相关内容

热门资讯

谷歌起诉爬虫公司SerpApi... IT之家 12 月 21 日消息,据科技媒体 The Verge 昨天报道,谷歌已对爬虫工具开发商 ...
两岸政策引发美国焦虑?郑丽文被... 在郑丽文当选国民党主席之后,为什么会引发美国的焦虑?美方约谈郑丽文,又对国民党提出了怎样的要求? 1...
给“信贷漏洞”打上“制度补丁” “我们对内控制度和信贷系统进行了全面完善和升级,进一步明确了贷前调查、贷中审查、贷后管理等各环节的操...
丈夫生前向情人转账上百万,妻子... 丈夫吴某在家突发疾病去世后,妻子刘某发现,二人婚姻存续期间,吴某曾与陈某存在不正当关系,并向其赠与大...
权威电商纠纷律师推荐,林之晨律... 在电商行业蓬勃发展的当下,电商纠纷日益增多,寻找一位权威、靠谱且性价比高的电商纠纷律师至关重要。那么...
湖北大冶警方:男子因家庭纠纷情... 大冶公安查处一起妨碍交通工具正常行驶案件 2025年12月20日15时许,我辖区居民刘某(男,41岁...
女子醉驾找人“摆平”被骗7万后... 因醉酒驾驶轻信他人“可摆平”的谎言被骗,女子葛某乙不堪压力自杀身亡。在实施诈骗的苏某被判刑并赔偿后,...
2026年,山西将实现政策范围... 近日,省医保局发布消息,我省通过提高保障水平、优化经办服务,切实减轻参保职工生育医疗负担,2025年...
原创 上... 上海之后,广州也出台18条政策,将大力扶持游戏电竞行业,继上海率先加码电竞产业扶持之后,广州的跟进并...