Dockerfile镜像构建

Dockerfile镜像构建

Dockerfile 是构建 Docker 镜像的文本格式配置文件,用一系列标准化指令描述镜像的构建步骤,是镜像的 "构建说明书"。

下面我以自己的 springboot 项目为例进行制作Dockerfile镜像

首先第一步需要对项目进行 package 打包

需要注意的是,采用可执行 JAR(Fat JAR)的打包配置方式,包含项目自身代码和所有第三方依赖,可直接通过 java -jar 命令独立运行(内置容器,无需外部依赖),pom.xml 需要配置的内容如下

xml 复制代码
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>  <!-- 关键:重新打包,包含依赖 -->
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

此时再执行 mvn package,会将所有依赖打入 JAR,最终生成可执行 JAR,并存放在 target 目录下

第二步本地验证,在 JAR 包所在目录下执行命令:java -jar JAR包名称

本地验证通过后我们远程连接服务器进行实践

在 /opt 下创建一个 test 文件夹上传jar包

由于 springboot 项目的运行依赖于 JDK 环境,所以需要安装 JDK 基础镜像

这里我们使用离线安装方式,上传 JDK 镜像

将本地的 jdk.tar 离线镜像包加载到当前 Docker 环境中 docker load -i jdk.tar

然后编写配置文件 vi Dockerfile

bash 复制代码
FROM openjdk:8
WORKDIR /app
ADD ./docker-0.0.1-SNAPSHOT.jar /app/docker-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar", "docker-0.0.1-SNAPSHOT.jar"]
  • FROM openjdk:8
    指定基础镜像为 openjdk:8,无需手动安装 Java 环境,直接复用官方做好的 Java 8,运行时作为镜像的底层基础
  • WORKDIR /app
    设置后续指令的工作目录为镜像内的 /app 目录,所有应用相关文件都放在 /app 下
  • ADD ./docker-0.0.1-SNAPSHOT.jar /app/docker-0.0.1-SNAPSHOT.jar
    将宿主机的 Java 应用 JAR 包复制到镜像中
    语法:ADD或COPY <宿主机文件路径> <镜像内目标路径>
  • ENTRYPOINT "java", "-jar", "docker-0.0.1-SNAPSHOT.jar"
    定义容器启动时的入口命令,当基于该镜像启动容器时,容器会自动执行命令 java -jar docker-0.0.1-SNAPSHOT.jar,即通过 Java 命令运行 Java 应用程序

执行 docker build -t test:1.0 . 命令,根据当前目录下的 Dockerfile 构建一个名为 test 标签为 1.0 的镜像,其中 -t 是 --tag 的缩写,用于给构建出的镜像打标签,方便后续识别和使用,需要注意的是 .(最后一个点)不可以省略,是 Docker 引擎在构建镜像时需要访问的文件目录

Docker 会读取当前目录的 Dockerfile,逐行执行其中的指令,每执行一条指令,都会生成镜像的一层,最终组合成完整镜像

构建成功后,通过 docker images 命令可以看到新生成的镜像

再执行 docker run test:1.0 -d 命令

基于 test:1.0 镜像创建一个容器,然后执行镜像中定义好的应用启动命令,最终让应用在容器中运行,-d 是 --detach 的缩写,让容器启动后在后台运行,而不是占用当前的终端窗口

启动成功

相关推荐
kobe_OKOK_18 分钟前
docker compose命名卷 映射到宿主机的路径
运维·docker·容器
Escalating_xu1 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅1 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路2 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData2 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat2 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰2 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang3 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞3 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长3 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统