在Docker环境中启动Spring Boot Web服务

使用Docker环境来启动Spring Boot Web服务。

spring-boot_on_docker.png

为了达到某个预期的结果或达成某个特定的目标。

在Windows 11上,使用Linux进行云开发。

您可以在这里查看文章的列表。

 

实现

在本地 Ubuntu 的 Docker 环境中,启动从 Dockerfile 构建的 Spring Boot Web 服务的自定义容器。

以JAR文件格式启动应用作为容器。

运行环境

要素概要terminalターミナルUbuntuOSDockerコンテナ実行環境

Web服务容器

要素概要app-hello-spring-bootカスタムコンテナJVMJava 実行環境app.jarJava アプリケーションtomcatWeb サーバー
在Spring Boot中,有一个功能可以通过命令轻松创建容器映像。但是,本文旨在通过使用Dockerfile构建容器映像来学习Docker的基本用法。请注意。

技术话题

“Dockerfile是什么?”

以下是中文的翻译:您可以展开这个以查看。

Dockerfile

Dockerfile是用于构建Docker容器的文本文件。Docker容器是包含运行应用程序和服务所需环境的轻量级可移植虚拟化单位。

关键词
内容

脚本格式
由于Dockerfile是以简单的脚本格式编写的,所以容易自动化容器构建过程。

层次结构
Docker镜像是通过执行Dockerfile的每个命令生成的层次结构,可以重复使用和缓存。

版本控制
由于Dockerfile是基于文本的,因此可以像代码一样在版本控制系统中方便地进行管理。

可移植性
通过Dockerfile,应用程序及其依赖关系被打包到一个容器映像中,增加了在不同环境之间的可移植性。

自动化和效率提升
使用Dockerfile可以自动化应用程序的构建和环境配置。这样可以减少手动操作的时间和人为错误,提高开发和部署过程的效率。

可重现性
由于Dockerfile完全定义了构建过程,可以在不同环境中复现相同的应用程序。这确保了在开发、测试和生产环境之间的一致性。

环境隔离
Docker容器与主机系统分离,从而避免了应用程序依赖和库冲突,可以在更安全的环境中运行。

可扩展性
使用Dockerfile可以创建自定义映像。因此可以轻松创建根据特定需求定制的容器映像。

开发环境

    Windows 11 Home 22H2 を使用しています。
由于我们将操作WSL中的Ubuntu,因此您可以参考macOS的方式。
请确认您安装的是以下版本:WSL (Microsoft Store 应用程序版本)※ 您可以在相关文章中查看安装方法
> wsl –version
WSL 版本:1.0.3.0
内核版本:5.15.79.1
WSLg 版本:1.0.47

Ubuntu※ 您可以在相关文章中查看安装方法
$ lsb_release -a
没有可用的 LSB 模块。
发行商 ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
发布版本:22.04

Java JDK ※ 您可以在相关文章中查看安装方法
$ java -version
openjdk 版本 “11.0.18” 2023-01-17
OpenJDK 运行时环境 (构建版本 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64 位服务器虚拟机 (构建版本 11.0.18+10-post-Ubuntu-0ubuntu122.04,混合模式,共享)

Maven ※ 您可以在相关文章中查看安装方法
$ mvn -version
Apache Maven 3.6.3
Maven 主目录:/usr/share/maven
Java 版本:11.0.18,供应商:Ubuntu,运行时:/usr/lib/jvm/java-11-openjdk-amd64

Docker ※ 您可以在相关文章中查看安装方法
$ docker –version
Docker 版本 23.0.1,构建编号 a5ee5b1

本文主要介绍了在Ubuntu终端上进行操作的方法。针对初学者学习使用Vim进行复制粘贴的方法,在下面的文章中介绍了详细步骤。请务必尝试一下。

 

制作网络应用程序的规范

NoエンドポイントHTTPメソッドMIME タイプ1/api/dataGETapplication/json
发送HTTP GET请求到/api/data端点,实现一个简单的Web服务,返回JSON数据。
{“message”:”你好,世界!”}

展示”Hello World”的步骤

创建一个Spring Boot Web服务。

您可以在此相关文章中确认步骤。

 

前往项目文件夹。

将目录切换到项目文件夹。
※ 将 ~/tmp/hello-spring-boot 视为项目文件夹。

$ cd ~/tmp/hello-spring-boot
为了简化结构,将所有元素都写在应用程序类的示例中。删除控制器类,修改应用程序类。

$ rm src/main/java/com/example/springboot/controller/HelloController.java
$ vim src/main/java/com/example/springboot/Application.java

文件内容:

Application.java

package com.example.springboot;

import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
@RequestMapping(“/api”)
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@GetMapping(“/data”)
public Map<String, String> getData() {
Map<String, String> map = Map.of(“message”, “Hello World!”);
return map;
}
}

应用程序的编译

编译Java应用程序。
※ 创建了 target/app.jar 文件。

$ mvn clean package
通过以上步骤,我们可以在本地 Ubuntu 环境中构建一个 JAR 文件格式的应用程序。

创建容器映像

我将创建一个 Dockerfile。

$ vim Dockerfile

文件的内容 de

# from the base image of a jdk 11 container on Ubuntu 20.04.
FROM adoptopenjdk/openjdk11:x86_64-ubuntu-jdk-11.0.18_10-slim

# create a work dir.
WORKDIR /app

# copy a jvm app.
COPY target/*.jar app.jar

# open port 8080 for a jvm app.
EXPOSE 8080

# startup a jvm app.
ENTRYPOINT ["java","-jar","app.jar"]
打开说明。Dockerfile 是一个用来描述构建容器镜像所需指令的文件。
在这个例子中,我们执行以下步骤。

指令
内容

FROM
指定基础容器镜像。在这个例子中,我们使用了 Ubuntu 的 slim 版本镜像。

WORKDIR
指定容器内的工作目录。这里我们创建了 /app 目录。

COPY
从宿主机复制文件到容器内。target/*.jar 部分指定了 target 目录下的所有 .jar 文件,并在容器内以 app.jar 的名称复制。

EXPOSE
指定容器使用的端口。在这里,我们指定了 8080 端口。

ENTRYPOINT
指定容器启动时要执行的命令。在这个例子中,执行的是 java -jar app.jar。

通过编写这样的 Dockerfile,并使用 docker build 命令进行构建,可以创建容器镜像。

启动Docker守护进程。

$ sudo service docker start
 * Starting Docker: docker    [ OK ]
如果您没有Docker环境,请查阅以下相关文章以了解Docker Engine的安装步骤。

 

构建容器映像。

$ docker build \
    --no-cache \
    --tag app-hello-spring-boot:latest .
打开说明。使用docker build命令,使用当前目录中的Dockerfile构建一个名为app-hello-spring-boot的容器镜像。构建后的镜像将保存在Docker主机上的本地仓库中。.表示使用当前目录作为构建上下文。

我要查看容器映像。

$ docker images | grep app-hello-spring-boot
REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
app-hello-spring-boot   latest    39115028afa6   12 seconds ago   390MB
打开说明。
docker images命令用于显示容器镜像列表。
grep命令用于筛选包含指定字符串的行。
通过以上步骤,您可以在本地环境的 Docker 中构建应用的自定义容器映像。

启动容器

在本地启动容器。
※ 当要停止容器时,请按下 ctrl + C。

$ docker run --rm \
    --publish 8080:8080 \
    --name app-local \
    app-hello-spring-boot
我将打开说明。通过docker run命令,从名为app-hello-spring-boot的容器映像中创建一个名为app-local的容器,并将主机的8080端口与容器的8080端口进行映射。换句话说,将创建一个可以从主机的8080端口访问的容器。

通过以上的步骤,您可以在本地 Docker 环境中启动自定义容器的应用程序。

容器运行确认

我們可以從另一個終端使用curl命令來進行確認。

$ curl -v http://localhost:8080/api/data -w '\n'

发挥潜力

*   Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api/data HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Sun, 05 Mar 2023 13:06:44 GMT
<
* Connection #0 to host localhost left intact
{"message":"Hello World!"}
用以下步骤,在终端中显示 {“message”:”你好,世界!”} 并成功获取 JSON 数据。

让我来检查一下容器的状态。

$ docker ps
CONTAINER ID   IMAGE                   COMMAND               CREATED         STATUS         PORTS                                       NAMES
377111ffea02   app-hello-spring-boot   "java -jar app.jar"   4 minutes ago   Up 3 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   app-local
打开说明。docker ps 命令用于显示当前正在运行的容器列表。运行中容器的信息包括容器ID、容器名称、使用的映像、端口映射、创建时间、状态等。

连接到集装箱

从另一个终端连接到容器上。

$ docker exec -it app-local /bin/bash
我将打开说明。使用docker exec命令,在容器app-local上,通过交互式bash shell登录到容器内部。选项-i和-t创建了一个可以进行交互操作的状态。/bin/bash是启动bash shell的命令。

连接到容器后,请确认目录。
※ 退出容器时按下 Ctrl+D。

# pwd
/app
# ls -lah
total 17M
drwxr-xr-x 1 root root 4.0K Aug  2 00:00 .
drwxr-xr-x 1 root root 4.0K Aug  2 09:07 ..
-rw-r--r-- 1 root root  17M Aug  1 23:46 app.jar

使用 top 命令来查看情况。

top - 10:49:52 up  1:32,  0 users,  load average: 0.01, 0.04, 0.01
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7763.1 total,   6218.8 free,    668.9 used,    875.5 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   6859.1 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0 6504924 253188  20960 S   0.3   3.2   0:08.18 java
   52 root      20   0    7244   3816   3264 S   0.0   0.0   0:00.01 bash
   61 root      20   0    9072   3564   3060 R   0.0   0.0   0:00.05 top

我尝试显示容器的信息。

# cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
這個容器是以Ubuntu為基礎創建的,也就是說,可以像Ubuntu一樣操作它。

总结

在 WSL Ubuntu 上的 Docker 环境中,可以启动由 Dockerfile 构建的Spring Boot Web服务的自定义容器。

在云开发中,理解Dockerfile是非常重要的。虽然有自动构建工具,但也有需要手动编写的情况。使用Ubuntu还可以学习到Linux知识。起初可能会感到困难,但随着逐步深入,你会自信地进行编写。

在WSL Ubuntu中,您可以轻松将Spring Boot Web应用程序作为Docker容器在容器环境中启动。请务必进行尝试。我们将继续介绍Java开发环境等内容,请期待。

推荐内容

 

相关文章

让我们与本土形象建设进行比较吧!

 

广告
将在 10 秒后关闭
bannerAds