• Spring Boot 使用Docker构建运行


    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";
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    打包测试

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

    使用curl脚本 进行系统测试

    curl -v localhost:8080
    Hello Docker World
    
    • 1
    • 2

    应用容器化

    编写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"]
    
    • 1
    • 2
    • 3
    • 4

    打包镜像

    docker build -t spring-boot-docker .
    
    • 1

    以上命令将会创建一个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
    
    • 1
    • 2
    • 3

    运行容器

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

    在这里插入图片描述

    验证测试

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

    curl -v  localhost:8080
    
    • 1

    Docker 基本命令

    镜像操作

    # 查看镜像
    docker images
    # 删除镜像
    docker rmi ${imageName}
    # 从docker 仓库搜索镜像
    docker search java17
    # 从仓库拉取镜像
    docker pull ${imageName}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    容器操作

    # 查看运行中的容器
    docker ps
    # 查看所有容器 包含停止的容器
    docker ps -a
    # 停止容器
    docker stop fec750493285 #此处为容器id 或 容器名称
    # 删除容器
    docker rm fec750493285 #此处为容器id 或 容器名称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查看日志

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

    在这里插入图片描述

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

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

    docker-maven-plugin

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

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

    一、通过pom文件构建

    • 在pom文件增加编译插件
    
    <plugin>
      <groupId>com.spotifygroupId>
      <artifactId>docker-maven-pluginartifactId>
      <version>1.2.2version>
      <configuration>
        <imageName>spring.boot.docker.v2imageName>
        <baseImage>panokurka/java17-graalvmbaseImage>
        <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]entryPoint>
        <resources>
          <resource>
            <targetPath>/targetPath>
            <directory>${project.build.directory}directory>
            <include>${project.build.finalName}.jarinclude>
          resource>
        resources>
      configuration>
    plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 命令打包

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

      已生成v2版本的镜像文件

    二、使用 Dockerfile 构建

    • 屏蔽方式一的插件依赖,添加一下依赖
    			
    			<plugin>
    				<groupId>com.spotifygroupId>
    				<artifactId>docker-maven-pluginartifactId>
    				<version>1.2.2version>
    				<configuration>
    					<imageName>spring.boot.docker.v3imageName>
    					<dockerDirectory>.dockerDirectory>
    					<resources>
    						<resource>
    							<targetPath>/targetPath>
    							<directory>${project.build.directory}directory>
    							<include>${project.build.finalName}.jarinclude>
    						resource>
    					resources>
    				configuration>
    			plugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 生成docker镜像

      # 将之前的Dockerfile文件还原
      mv Dockerfile_bk Dockerfile
      # 打包编译
      mvn clean package docker:build
      
      • 1
      • 2
      • 3
      • 4
      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
      
      • 1
      • 2
      • 3
      • 4

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

    验证测试

    #分别使用以下命令 运行不同方式的镜像
    docker run -p 8080:8080 -t spring.boot.docker.v3
    
    docker run -p 8081:8080 -t spring.boot.docker.v2
    
    • 1
    • 2
    • 3
    • 4
    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
    
    • 1
    • 2
    • 3
    • 4

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

    构建报错

    在学习过程中,构建镜像时会报以下错误,折腾好久才发现原来是本机打开了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]
    
    • 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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
  • 相关阅读:
    图神经推荐系统笔记整理
    SpringBoot中使用Redisson分布式锁的应用场景-多线程、服务、节点秒杀/抢票处理
    NET8 BlazorAuto渲染模式
    元宇宙将会越来越多地与行业、场景联系在一起
    linux usb驱动
    风雨秋招路-CV太难了-记得复盘
    ardupilot 上实现ADRC内环角速度控制
    MATLAB中movmean函数用法
    [InternLM训练营第二期笔记]6.Lagent & AgentLego 智能体应用搭建
    【ARM-0】基本概念
  • 原文地址:https://blog.csdn.net/u013433591/article/details/128057424