docker核心概念
- 镜像 (Image): 应用程序的打包文件。它包含了所有运行应用所需的代码、运行时环境、依赖项和配置。它是一个静态模板。
- 容器 (Container): 镜像的可运行实例。当你运行
docker run
时,Docker 会从镜像中启动一个进程,并为其分配资源,使其成为一个活生生的、正在运行的实例。
docker常用命令
镜像管理
|
|
容器管理
|
|
构建docker镜像
如今将 Spring Boot 应用打包成 Docker 镜像已经成为一种标准实践。然而,直接将应用打包到镜像中,可能会导致镜像体积过于庞大。这时,多阶段构建(Multi-stage build)就成了我们的救星。它能帮助我们创建体积更小、更安全的生产环境镜像。
- 首先,在你的项目根目录中创建一个名为
Dockerfile
的文件。我们将它分为两个阶段来完成镜像构建。 - 编写dockerfile文件
|
|
这里来解释一下各个参数的作用
我们都知道镜像包含了运行时环境、依赖项和配置。
FROM 表示一个阶段(也就是构建当前运行环境)。docker的构建是分阶段的。且最后只会保存最后一个阶段的文件。可以有效的减少构建的体积
第一阶段:
FROM maven:3.9-amazoncorretto-17 AS build
: 定义了第一个构建阶段,我们使用了一个包含 Maven 和 JDK 的镜像作为基础,并将其命名为build
。WORKDIR /app
: 设置容器中的工作目录为/app
。COPY pom.xml .
和COPY src ./src
: 这两条指令负责将我们本地的源代码和配置文件复制到容器中。第一个参数为当前dockerfile文件所在的目录,第二个参数为容器中的工作目录。 这个.相当于当前docker的工作目录/appRUN mvn clean package -DskipTests
: 在容器中执行 Maven 打包命令,生成可运行的 JAR 包。这里我们使用-DskipTests
跳过单元测试,以节省构建时间。
第二阶段:
-
FROM openjdk:17-jre-slim
: 因为前面我们已经构建了jar包。这里我们可以不再使用庞大的 JDK 镜像,而是使用一个仅包含 Java 运行时环境(JRE)的精简镜像。这能显著减小最终镜像的体积。EXPOSE 8123
: 这个指令向外界声明容器中的服务正在监听8123
端口。但是请注意,这只是一个文档声明。COPY --from=build ...
: 这是多阶段构建的精髓。我们使用--from=build
参数,只将第一阶段生成的最终 JAR 包复制过来,而不是整个庞大的编译环境。ENTRYPOINT [...]
: 定义了容器启动时要执行的命令。
通过这种多阶段构建的方式,我们最终得到的镜像将非常小巧,只包含必要的运行时环境和我们打包好的 JAR 文件。
运行docker容器
构建完镜像之后,我们就可以通过 docker run
命令来启动容器了。
1. 查看构建好的镜像
首先,使用 docker images
命令来确认你的镜像是否构建成功。
|
|
2. 运行容器
现在,使用 docker run
命令来启动你的 Spring Boot 应用容器。
|
|
-d
:在后台模式下运行容器。不占用终端-p <宿主机端口>:<容器端口>
:将宿主机的端口映射到容器内的端口。--name <容器名>
:为容器指定一个名称。--rm
:当容器停止时,自动删除容器。
3. 验证容器是否正常运行
构建完成后,你可以使用 docker ps
命令来查看正在运行的容器。查看是否有刚刚创建的容器。
|
|
如果你的springboot有接口文档测试工具 可以通过能否打开接口文档以查看是否成功运行。