建立您的Java映像
预计阅读时间:10分钟
先决条件
通过入门第1部分中的方向和设置来理解Docker概念。有关Java先决条件,请参阅以下部分。
概述
现在,我们对容器和Docker平台有了一个很好的了解,让我们看一下构建我们的第一个映像。映像包括运行应用程序所需的所有内容-代码或二进制文件,运行时,依赖项以及所需的任何其他文件系统对象。
要完成本教程,您需要以下内容:
- Java OpenJDK版本15或更高版本。下载并安装Java
- Docker在本地运行。按照说明下载并安装Docker
- 一个Git客户
- IDE或文本编辑器来编辑文件。我们建议使用IntelliJ Community Edition。
样品申请
让我们将将在此模块中使用的示例应用程序克隆到本地开发计算机。在终端中运行以下命令以克隆存储库。
$ 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映像,并且我们还安装了依赖项。我们需要做的下一件事是将源代码添加到图像中。我们将使用COPY
与pom.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以建议更新。