ZetCode

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

这是项目结构。

build.gradle
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 依赖项。

com/zetcode/Application.java
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);
    }
}

该应用包含这个简单文件。 该应用返回一段简单的文本。

DockerFile
FROM openjdk:17-jdk-alpine3.14
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

这是 DockerfileFROM 命令指示 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。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程