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文件增加编译插件
<!-- 方式一 使用pom 构建 docker镜像 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>spring.boot.docker.v2</imageName>
<baseImage>panokurka/java17-graalvm</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</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 构建
- 屏蔽方式一的插件依赖,添加一下依赖
<!-- 方式二 使用docker文件生成 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<imageName>spring.boot.docker.v3</imageName>
<dockerDirectory>.</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</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