Spring Boot Docker
最后修改于 2023 年 7 月 31 日
Spring Boot Docker 教程展示了如何对 Spring Boot 应用进行 Docker 化。
Spring 是一个流行的 Java 应用框架。Spring Boot 旨在无需过多麻烦即可创建独立的、生产级的基于 Spring 的应用。
应用容器化 是一种 OS 级别的虚拟化方法,用于部署和运行分布式应用,而无需为每个应用创建整个虚拟机。 通过容器,可以在单个主机上运行多个隔离的应用或服务,并访问相同的操作系统内核。 容器可以在裸机系统、云实例或虚拟机上运行。
Docker
Docker 是一种工具,旨在通过使用容器来简化创建、部署和运行应用的过程。 容器是一个标准的软件单元,它打包了代码及其所有依赖项,因此应用可以从一个计算环境快速可靠地运行到另一个计算环境。
Docker 镜像是一个文件,由多个层组成,用于在 Docker 容器中执行代码。 Dockerfile 是一个文本文件,其中包含组装镜像的所有命令。 镜像使用 docker build 命令创建。
Spring Boot Docker 示例
在下面的示例中,我们创建一个 Spring Boot 应用,并将其放入 Docker 镜像中。
build.gradle
Dockerfile
...
src
├───main
│ ├───java
│ │ └───com
│ │ └───zetcode
│ │ Application.java
│ └───resources
└───test
└───java
这是项目结构。
plugins {
id 'org.springframework.boot' version '3.1.1'
id 'io.spring.dependency-management' version '1.1.0'
id 'java'
}
group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
test {
useJUnitPlatform()
}
这是 Gradle 构建文件。 我们创建一个简单的 Web 应用,因此我们只需要 spring-boot-starter-web 依赖项。
package com.zetcode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@GetMapping(value="/", produces=MediaType.TEXT_PLAIN_VALUE)
public String home() {
return "home page";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
该应用包含这个简单文件。 该应用返回一段简单的文本。
FROM openjdk:17-jdk-alpine3.14
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这是 Dockerfile。 FROM 命令指示 Docker 设置基础镜像。 在我们的例子中,它是 FROM openjdk:17-jdk-alpine。 它基于 OpenJDK 和 Alpine Linux。 Alpine 是一个轻量级的 Linux 发行版。 ARG 命令定义一个变量,可以在构建时传递给构建器。
COPY 命令将指定的文件复制到镜像中。 在我们的例子中,我们复制可执行的 JAR。 ENTRYPOINT 定义了如何在容器内执行应用。
$ docker build -t myapp .
我们使用 docker build 命令构建镜像。 使用 -t 选项,我们指定镜像名称。 最后一个参数是 Docker 路径,它告诉在哪里找到 Dockerfile。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE myapp latest 1f2f838a5754 5 minutes ago 345MB
我们可以使用 docker image ls 命令列出我们的新镜像。
$ docker run -d -p 8080:8080 90b1c3e39075
我们使用 docker run 命令运行容器。 使用 -d 选项,我们在 分离模式 下运行容器。 这意味着 Docker 容器在终端的后台运行。 使用 -p 选项,我们将容器的 8080 端口暴露给主机的 8080 端口。(主机值优先。)
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9405f91a00ec 1f2f838a5754 "java -jar /app.jar" 58 seconds ago Up 57 seconds 0.0.0.0:8080->8080/tcp hopeful_kare
使用 docker ps,我们可以列出正在运行的容器。
$ curl localhost:8080 home page
我们向 Spring Boot 应用创建一个请求。
$ docker stop 9405f91a00ec
我们使用 docker stop 命令停止容器。
将 Spring Boot 镜像上传到 Docker Hub
首先,我们需要在 hub.docker.com 上创建一个帐户。
$ docker login
我们使用 docker login 命令登录 Docker Hub。
$ docker tag myapp janbodnar/spring-boot-simple:first
我们使用代码 docker tag 命令标记用于上传的镜像。 标签用于添加有关镜像的版本信息。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE janbodnar/spring-boot-simple first 1f2f838a5754 12 minutes ago 345MB myapp latest 1f2f838a5754 12 minutes ago 345MB
现在我们有一个带标签的镜像。
$ docker push janbodnar/spring-boot-simple:first
我们使用 docker push 命令将镜像推送到 Hub。
$ docker rmi -f 1f2f838a5754
我们使用 docker rmi 命令删除本地镜像。
$ docker pull janbodnar/spring-boot-simple:first
可以使用 docker pull 命令从 Hub 下载镜像。
在本文中,我们对一个简单的 Spring Boot Web 应用进行了 Docker 化,并展示了如何将其上传到 Docker Hub。