在应用容器化、容器编排大行其道的当下。今天来学习下如何使用Docker技术打包、构建、运行Spring Boot 应用程序,从最简单的Dockerfile开始,一步步的学习Docker 容器的使用过程。
使用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
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 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插件, 主要构建Docker构建集成的两个主要方面。开发人员可以在使用Maven编译项目的同时,创建docker镜像。
该插件可以使用两种方式构建docker镜像
<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版本的镜像文件
<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