DockerFile打包项目实战解析,一文读懂dockerfile打包

文章目录

  • 一、简介
  • 二、DockerFile基础
    • 1. DockerFile的作用和特点
    • 2. DockerFile语法介绍
    • 3. 基本指令:FROM、RUN、COPY、ADD等
  • 三、编写具体项目使用DockerFile
  • 四、构建镜像
    • 1.项目构建
      • 默认命令dockerfile文件
      • 非默认命令dockerfile文件
        • 小知识
    • 2. 使用ENTRYPOINT和CMD指定容器启动命令
    • 3. 容器与宿主机的文件共享和挂载
  • 五、总结

一、简介

现在项目部署都不在是简单的打包推送了,而是容器化管理这样也便于扩充服务动态运维。很是优雅,所以呢对于现在经常使用的docker打包项目进行部署就写一篇详解,这里呢是我们项目很早就用上docker了,所以我就以一个简单的demo进行说明。

二、DockerFile基础

1. DockerFile的作用和特点

DockerFile是一种用于定义Docker镜像构建过程的文件。它的作用是描述镜像的组成部分和构建过程,包括从基础镜像开始,逐步添加软件包、依赖项和配置,最终生成一个新的、可用的镜像。DockerFile具有以下特点:

  1. 可追溯性:DockerFile中的每一条指令都可以追溯到具体的操作步骤,使得整个构建过程可被重新创建或修改。

  2. 可重复性:通过编写DockerFile,可以确保在不同的环境中反复构建出相同的镜像。这样可以减少因环境差异导致的构建错误和依赖问题。

  3. 版本控制:DockerFile可以与代码存储在同一个版本控制系统中,方便进行版本管理和团队协作。

  4. 自动化构建:通过DockerFile,可以实现镜像的自动构建,减少手动操作的繁琐性,并提高构建效率。

2. DockerFile语法介绍

DockerFile使用一系列指令来定义构建步骤,每个指令占据一行并以大写字母开头。
DockerFile打包项目实战解析,一文读懂dockerfile打包_第1张图片

3. 基本指令:FROM、RUN、COPY、ADD等

在DockerFile中,可以使用多个指令来定义镜像的构建过程。下面是一些常用的指令及其说明:

  1. FROM:指定基础镜像。例如:FROM ubuntu:latest表示以最新版的Ubuntu镜像为基础构建。

  2. RUN:在镜像中执行命令。例如:RUN apt-get update && apt-get install -y python3表示在镜像中执行更新并安装Python3的命令。

  3. COPY:复制本地文件到镜像中。例如:COPY . /app表示将当前目录中的所有文件复制到镜像中的/app目录下。

  4. ADD:类似于COPY指令,但还可以自动解压缩文件。例如:ADD app.tar.gz /表示将压缩包解压并复制到镜像根目录下。

  5. WORKDIR:设置工作目录。例如:WORKDIR /app表示将/app目录设置为工作目录。

  6. EXPOSE:声明容器运行时要监听的端口。例如:EXPOSE 80表示声明容器要监听的端口号为80。

  7. CMD:指定容器启动时要执行的命令。该指令只能在DockerFile中出现一次。例如:CMD ["python", "app.py"]表示容器启动时执行Python脚本app.py。

  8. ENTRYPOINT:类似于CMD指令,但它提供了固定的执行命令,并可以与CMD指令结合使用。例如:ENTRYPOINT ["nginx"]表示容器启动时将执行nginx命令。

  9. ENV:设置环境变量。例如:ENV API_KEY=123456表示在镜像中设置一个名为API_KEY的环境变量,并赋值为123456。

  10. ARG:定义构建参数。例如:ARG ENVIRONMENT=production表示定义一个名为ENVIRONMENT的构建参数,默认值为production。

这些是DockerFile中常用的一些指令,每个指令都有特定的功能和语法。通过组合和使用这些指令,可以编写出具有特定功能和要求的Docker镜像构建过程。

三、编写具体项目使用DockerFile

#使用jdk11作为基础镜像
FROM openjdk:11
#
# 将jar包添加到容器中,并命名为 demo.jar
ADD testDemo.jar /home/admin/Demo.jar
# 指定Java的运行大小内存,也是设置变量,这个变量值是可以通过启动容器的时候重新指定的。
ENV JAVA_OPTS="-Xmx128m -Xms128m"
ENTRYPOINT java -jar /home/admin/Demo.jar
# SpringBoot项目配置的端口号为8090,需要将8090暴露出去
EXPOSE 8090

DockerFile打包项目实战解析,一文读懂dockerfile打包_第2张图片

# 指示在容器启动时运行java -jar /home/admin/Demo.jar命令
ENTRYPOINT java -jar /home/admin/Demo.jar

四、构建镜像

1.项目构建

默认命令dockerfile文件

docker build --tag test1:v1.0 .

这条命令使用了 docker build 命令来构建一个 Docker 镜像,并给该镜像设置了名称和标签。

  • --tag myapp:v1.0 指定了镜像的名称和标签为 myapp:v1.0。可以根据自己的需要更改名称和标签来唯一标识该镜像,以便后续使用和管理。
  • . 表示当前目录,它是 docker build 命令的 PATH 参数。这意味着当前目录中必须存在 Dockerfile 文件,因为 Docker 将在该文件中查找构建指令和配置信息来生成镜像。

当执行该命令时,Docker会读取当前目录中的 Dockerfile 文件,并遵循其中的指令进行镜像构建。构建过程涉及到依赖项的安装、环境配置、复制文件等操作,具体动作由 Dockerfile 中的指令定义。

最终,构建成功后的镜像将被打上指定的名称和标签(myapp:v1.0),可以通过该名称和标签来引用和部署镜像。

非默认命令dockerfile文件

另一种dockerfile文件的名字不叫Dokcerfile并且Dockerfile和要被构建的jar不在一个目录下使用这中

docker build --tag myapp:v1.0 -f /dockerTest/DockerfileS /dockerTest 

这条命令是使用 Docker 构建镜像的命令,并且使用了自定义的 Dockerfile 文件。

  • docker build 是构建镜像的命令。
  • --tag myapp:v1.0 指定了镜像的名称和标签为 myapp:v1.0。可以根据需要修改名称和标签来唯一标识该镜像。
  • -f /dockerTest/DockerfileS 使用了 -f 参数来指定了自定义的 Dockerfile 文件的路径。这里的路径是 /dockerTest/DockerfileS,请注意大小写以及文件名的准确性。
  • /dockerTest 是构建上下文的路径,指定了构建过程中 Docker 将查找文件和目录的位置。在该命令中,Docker 将在 /dockerTest 目录中查找构建所需的文件和目录,包括指定的 Dockerfile 文件。

执行该命令后,Docker 将读取指定路径下的 Dockerfile 文件,并遵循其中的构建指令和配置信息来生成镜像。镜像将会被打上指定的名称和标签(myapp:v1.0)。

小知识

可以看到我构建的这个镜像过程程序打印出来一共5个步骤,是不是在正好对应了我上面自定义的dockefile文件中的5条命令,这是因为docker根据这dockerfile文件命令构建镜像时一个命令执行就是一次镜像的生成,而后面的命令执行实在上一次命令打好的镜像基础上执行的,可以理解为套娃

DockerFile打包项目实战解析,一文读懂dockerfile打包_第3张图片

2. 使用ENTRYPOINT和CMD指定容器启动命令

ENTRYPOINT指定容器启动时要执行的命令,CMD指定默认参数。

在 Dockerfile 中,ENTRYPOINTCMD 都是用来指定容器启动时要执行的命令。但它们之间有一些关键的差异:

  • ENTRYPOINT 指令用于设置容器的入口点,即容器启动时要执行的命令或可执行文件。ENTRYPOINT 可以接受参数,并且这些参数将被视为要运行的命令的参数。在一个 Dockerfile 中只能使用一条 ENTRYPOINT 指令,如果有多个 ENTRYPOINT 指令,则只有最后一条生效。

  • CMD 指令用于设置容器启动时默认执行的命令。与 ENTRYPOINT 不同的是,CMD 可以被 docker run 命令行中指定的参数覆盖。在一个 Dockerfile 中可以使用多个 CMD 指令,但只有最后一个生效。

在你的例子中,使用了 ENTRYPOINT 指令将 java -jar /home/admin/Demo.jar 作为容器的入口点。这表示每次启动容器时,都会执行该命令并运行 Demo.jar

如果你想添加一个默认参数,可以在 ENTRYPOINT 后面使用 CMD 来指定:

ENTRYPOINT java -jar /home/admin/Demo.jar
CMD ["--some-option"]

这样,在运行容器时如果没有显示指定参数,就会默认使用 --some-option 参数。

总的来说,ENTRYPOINTCMD 的区别在于命令参数是否可以被覆盖。ENTRYPOINT 是容器的入口点,不会被覆盖,而 CMD 是默认执行的命令,可以被 docker run 命令行指定的参数覆盖。

3. 容器与宿主机的文件共享和挂载

使用VOLUME指令或docker run命令的-v参数,实现容器与宿主机之间的文件共享和挂载。
在这里插入图片描述
现在我们看一在服务器下的/home/admin/dockerTest/应该有一个名字叫 demo.jar 的jar包

五、总结

Docker和Dockerfile是现代化软件开发和部署的重要工具。通过使用Docker,可以实现快速、可靠和可移植的应用部署。而通过制作高质量的Dockerfile,可以确保镜像的可靠性和可维护性。掌握Docker和Dockerfile的使用和最佳实践,将极大地提高开发和部署效率。

你可能感兴趣的:(java,docker,运维)