Spring Boot 使用Docker构建运行

Docker 容器化 Spring Boot 应用

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

Spring Boot 应用系统

创建项目

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

Spring Boot 使用Docker构建运行_第1张图片

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

Spring Boot 使用Docker构建运行_第2张图片

验证测试

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

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

Spring Boot 使用Docker构建运行_第3张图片

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

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>
  • 命令打包

    # 将之前的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 构建

  • 屏蔽方式一的插件依赖,添加一下依赖
			
			<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>
  • 生成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.v3

docker 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
    

你可能感兴趣的:(java,基础,docker,spring,boot,Spring集成,Spring,Docker集成)