建立您的Java映像

预计阅读时间:10分钟

先决条件

通过入门第1部分中的方向和设置来理解Docker概念。有关Java先决条件,请参阅以下部分。

概述

现在,我们对容器和Docker平台有了一个很好的了解,让我们看一下构建我们的第一个映像。映像包括运行应用程序所需的所有内容-代码或二进制文件,运行时,依赖项以及所需的任何其他文件系统对象。

要完成本教程,您需要以下内容:

样品申请

让我们将将在此模块中使用的示例应用程序克隆到本地开发计算机。在终端中运行以下命令以克隆存储库。

$ cd /path/to/working/directory
$ git clone https://github.com/spring-projects/spring-petclinic.git
$ cd spring-petclinic

测试应用程序

让我们启动我们的应用程序,并确保它运行正常。Maven将管理所有项目流程(编译,测试,打包等)。我们之前克隆的Spring Pets Clinic项目包含Maven的嵌入式版本。因此,我们不需要在本地计算机上单独安装Maven。

打开终端并导航到我们创建的工作目录,然后运行以下命令:

$ ./mvnw spring-boot:run

这将下载依赖项,构建项目,然后启动它。

要测试该应用程序是否正常运行,请打开新的浏览器并导航至http://localhost:8080

切换回运行我们的服务器的终端,您应该在服务器日志中看到以下请求。您的计算机上的数据将不同。

o.s.s.petclinic.PetClinicApplication     : Started
PetClinicApplication in 11.743 seconds (JVM running for 12.364)

为Java创建Dockerfile

现在我们的应用程序可以正常运行,让我们看一下创建Dockerfile的过程。

Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装映像的所有命令。当我们告诉Docker通过执行docker build命令来构建映像时,Docker读取这些指令并顺序执行它们,并创建一个Docker映像。

让我们逐步介绍为应用程序创建Dockerfile的步骤。在工作目录的根目录中,创建一个名为的Dockerfile文件,然后在文本编辑器中打开该文件。

笔记

Dockerfile的名称并不重要,但是许多命令的默认文件名只是Dockerfile。因此,在本系列中,我们将其用作文件名。

添加到Dockerfile的第一行是# syntax解析器指令。虽然可选的,这个指令指示泊坞建设者解析Dockerfile当什么语法使用,并允许旧的码头工人版本的BuildKit启用开始构建之前升级解析器。解析器指令必须出现在Dockerfile中的任何其他注释,空格或Dockerfile指令之前,并且应是Dockerfiles中的第一行。

# syntax=docker/dockerfile:1

我们建议您使用docker/dockerfile:1,它始终指向版本1语法的最新版本。BuildKit会在构建之前自动检查语法更新,以确保您使用的是最新版本。

接下来,我们需要在Dockerfile中添加一行,以告诉Docker我们想要为应用程序使用什么基本映像。

# syntax=docker/dockerfile:1

FROM openjdk:16-alpine3.13

Docker映像可以从其他映像继承。因此,我们将使用带有Java JDK的官方Maven映像,而不是创建自己的基本映像,该映像已经具有运行Java应用程序所需的所有工具和软件包。

笔记

要了解有关创建自己的基本图像的更多信息,请参阅创建基本图像

为了使运行其余命令更容易,让我们创建一个工作目录。这指示Docker使用此路径作为所有后续命令的默认位置。这样,我们不必键入完整的文件路径,而是可以根据工作目录使用相对路径。

WORKDIR /app

通常,下载使用Java Maven进行项目管理的用Java编写的项目后,要做的第一件事就是安装依赖项。

在运行之前mvnw dependency,我们需要将Maven包装器和pom.xml文件放入映像中。我们将使用COPY命令来执行此操作。该COPY命令有两个参数。第一个参数告诉Docker您要将哪些文件复制到映像中。第二个参数告诉Docker您要将文件复制到哪里。我们将所有这些文件和目录复制到工作目录-中/app

COPY .mvn/ .mvn
COPY mvnw pom.xml ./

pom.xml文件包含在图像中后,就可以使用RUN命令执行命令mvnw dependency:go-offline。这与mvnw在计算机上本地运行(或mvn)依赖项的方式完全相同,但是这次依赖项将安装到映像中。

RUN ./mvnw dependency:go-offline

至此,我们有了一个基于OpenJDK版本16的Alpine版本3.13映像,并且我们还安装了依赖项。我们需要做的下一件事是将源代码添加到图像中。我们将使用COPYpom.xml上面文件相同的命令。

COPY src ./src

COPY命令将获取当前目录中的所有文件,并将它们复制到映像中。现在,我们要做的就是告诉Docker在容器中执行映像时要运行什么命令。我们使用CMD命令执行此操作。

CMD ["./mvnw", "spring-boot:run"]

这是完整的Dockerfile。

# syntax=docker/dockerfile:1

FROM openjdk:16-alpine3.13

WORKDIR /app

COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline

COPY src ./src

CMD ["./mvnw", "spring-boot:run"]

建立.dockerignore档案

要在构建上下文中使用文件,Dockerfile引用指令(例如,COPY指令)中指定的文件。为了提高构建的性能,并排除文件和目录,我们建议您.dockerignore在上下文目录中创建一个文件。要缩短上下文加载时间,请target.dockerignore文件中添加目录。

建立影像

现在我们已经创建了Dockerfile,让我们构建映像。为此,我们使用docker build命令。该docker build命令从Dockerfile和“上下文”构建Docker映像。构建的上下文是位于指定PATH或URL中的文件集。Docker构建过程可以访问此上下文中的任何文件。

构建命令可以选择带有--tag标志。标签用于设置图像名称和格式的可选标签name:tag。我们现在将省略可选项tag以简化操作。如果我们不传递标签,Docker将使用“最新”作为其默认标签。您可以在构建输出的最后一行中看到这一点。

让我们构建我们的第一个Docker映像。

$ docker build --tag java-docker .
Sending build context to Docker daemon  5.632kB
Step 1/7 : FROM java:3.7-alpine
Step 2/7 : WORKDIR /app
...
Successfully built a0bb458aabd0
Successfully tagged java-docker:latest

查看本地图像

要查看本地计算机上的图像列表,我们有两个选择。一种是使用CLI,另一种是使用Docker Desktop。当我们当前在终端中工作时,让我们看一下使用CLI列出图像。

要列出图像,只需运行docker images命令。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED          SIZE
java-docker         latest              b1b5f29f74f0        47 minutes ago   567MB

您至少应该看到我们刚刚建造的java-docker:latest

标记图片

图像名称由斜杠分隔的名称组成。名称组件可能包含小写字母,数字和分隔符。分隔符定义为一个句点,一个或两个下划线或一个或多个破折号。名称组件不能以分隔符开头或结尾。

图像由清单和图层列表组成。此时,除了“标记”指向这些工件的组合之外,不必过多担心清单和图层。一个图像可以有多个标签。让我们为构建的图像创建第二个标签,并查看其图层。

要为我们上面构建的图像创建一个新标签,请运行以下命令:

$ docker tag java-docker:latest java-docker:v1.0.0

docker tag命令为图像创建一个新标签。它不会创建新图像。标签指向相同的图像,并且是引用图像的另一种方法。

现在,运行docker images命令以查看我们的本地图像列表。

$ docker images
REPOSITORY    TAG      IMAGE ID		  CREATED		  SIZE
java-docker   latest   b1b5f29f74f0	  59 minutes ago	567MB
java-docker   v1.0.0   b1b5f29f74f0	  59 minutes ago	567MB

您会看到我们有两个以开头的图像java-docker。我们知道它们是同一张图片,因为如果您查看该IMAGE ID列,您会发现两个图片的值相同。

让我们删除刚刚创建的标签。为此,我们将使用rmi命令。该rmi命令代表“删除图像”。

$ docker rmi java-docker:v1.0.0
Untagged: java-docker:v1.0.0

请注意,Docker的响应告诉我们,该映像尚未删除,而只是“未标记”。您可以通过运行docker images命令进行检查。

$ docker images
REPOSITORY      TAG     IMAGE ID        CREATED              SIZE
java-docker    	latest	b1b5f29f74f0	59 minutes ago	     567MB

带有标记的图像:v1.0.0已被删除,但我们java-docker:latest的机器上仍具有可用的标记。

下一步

在本模块中,我们看了如何设置示例Java应用程序,该示例应用程序将在本教程的其余部分中使用。我们还创建了一个Dockerfile,用于构建Docker映像。然后,我们看了一下标记图像和删除图像的过程。在下一个模块中,我们将研究如何:

将图像作为容器运行

反馈

通过提供您的反馈帮助我们改善此主题。通过在Docker Docs GitHub存储库中创建问题,让我们知道您的想法。或者,创建PR以建议更新。


Java构建图像dockerfile