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 的缩写,让容器启动后在后台运行,而不是占用当前的终端窗口

启动成功

相关推荐
云原生指北28 分钟前
Docker Sandboxes 上手:从安装到第一次跑 Agent
运维·docker·容器
Web Security Loop32 分钟前
MAC卸载JDK环境
java·macos·jdk
ziyun6668881 小时前
Docker 容器化 Web 服务架构搭建与自动化运维项目
运维·docker·架构
Rain的Java大神之路2 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
counting money2 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
xiaohaiAIgeo3 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
小强库计算机毕业设计3 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
heimeiyingwang3 小时前
【架构实战】Kubernetes故障排查全景图:从Pod异常到集群雪崩的诊断手册
容器·架构·kubernetes
霸道流氓气质3 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式
怪奇云呼军3 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频