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。