Dockerfile的应用

Dockerfile的应用

Dockerfile就是一个由一条条指令构成的批处理文件,是一个构建镜像的计划文件。

1.他是啥

Dockerfile 是用于定义 Docker 镜像构建过程的文本文件。它包含了一系列的指令和参数,用于描述构建一个 Docker 镜像所需的步骤和配置。

通过编写 Dockerfile,你可以定义镜像的基础操作系统、安装软件包、复制文件、设置环境变量、运行命令等等。Docker 根据 Dockerfile 中的指令逐步执行构建过程,并生成最终的镜像。

Dockerfile 通常由一系列的指令构成,每个指令代表一个构建步骤。以下是一些常用的 Dockerfile 指令:

  • FROM:指定基础镜像,作为新镜像的基础。
  • RUN:在镜像中执行命令。
  • COPY:将文件或目录从主机复制到镜像中。
  • ADD:类似于 COPY,但支持更多功能,例如远程文件下载和自动解压缩。
  • WORKDIR:设置工作目录,指定后续命令的执行路径。
  • ENV:设置环境变量。
  • EXPOSE:声明容器将监听的端口。
  • CMD:指定容器启动后要执行的命令。

编写 Dockerfile 时,可以根据需要自定义镜像的构建过程和配置。一旦编写好 Dockerfile,可以使用 docker build 命令根据 Dockerfile 构建镜像。

例如,以下是一个简单的 Dockerfile 示例:

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

上述 Dockerfile 使用最新版本的 Ubuntu 作为基础镜像,安装了 Nginx 服务器,并将自定义的 index.html 文件复制到指定路径。最后,声明容器将监听 80 端口,并在启动时运行 Nginx 服务器。

通过编写 Dockerfile,你可以轻松地创建可复制和可扩展的 Docker 镜像,方便在不同环境中部署和运行应用程序。

一句话而言:

Dockerfile就是一个由一条条指令构成的批处理文件,是一个构建镜像的计划文件。

2.指令简介

CMD与ENTRYPOINT指令的【‘EXECUTABLE’】语法形式能用性要强于【command】形式。体现在以下两点:

  1. 【‘EXECUTABLE’】形式对于shell和非shell命令都支持。
  2. ENTRYPOINT指令的【‘EXECUTABLE’】形式支持在docker run中指定【ARG】

3.指令用法

Dockerfile 中的指令用法取决于具体的指令。以下是一些常见指令的用法说明:

  1. FROM:指定基础镜像,作为新镜像的基础。用法示例:

    FROM <基础镜像>
    
  2. RUN:在镜像中执行命令。用法示例:

    RUN <命令>
    
  3. COPY:将文件或目录从主机复制到镜像中。用法示例:

    COPY <源路径> <目标路径>
    
  4. ADD:类似于 COPY,但支持更多功能,例如远程文件下载和自动解压缩。用法示例:

    ADD <源路径> <目标路径>
    
  5. WORKDIR:设置工作目录,指定后续命令的执行路径。用法示例:

    WORKDIR <工作目录路径>
    
  6. ENV:设置环境变量。用法示例:

    ENV <变量名>=<值>
    
  7. EXPOSE:声明容器将监听的端口。用法示例:

    EXPOSE <端口号>
    
  8. CMD:指定容器启动后要执行的命令。用法示例:

    CMD ["<可执行文件>", "<参数1>", "<参数2>", ...]
    

每个指令都有其特定的语法和参数,需要根据需要正确使用。可以参考 Docker 官方文档或其他相关文档以获取更详细的指令用法说明。

此外,Dockerfile 还支持注释。注释以 # 开头,可以用于添加说明和注解,对 Dockerfile 进行文档化。例如:

# 这是一个示例的 Dockerfile
FROM ubuntu:latest
...

在编写 Dockerfile 时,遵循指令的正确用法和顺序,以确保正确构建和配置 Docker 镜像。

最后一个命令是一个PATH,其中有两个功能:

  1. 指定要查找Dockerfile的路径
  2. Dockerfile中ADD与COPY指令中的《src》路径是相对于该路径的。

4.应用发布

  • 对于Java应用的发布,一般Dockerfile中都会通过ENTRYPOINT【‘java’,‘-jar’,‘hd.jar’】来启动应用
  • 对于EXPOSE命令。原本是准备对外暴露指定端口号,但在实际设置的时候,是使用应用原端口号,是为了让使用该Dockerfile构建的镜像的用户来看的。

5.build cache

在 Docker 构建过程中,Docker 引擎使用了一个构建缓存机制来提高构建效率。这个构建缓存可以避免重复执行相同的指令,从而减少构建时间和网络传输。

当 Docker 构建一个镜像时,它会逐步执行 Dockerfile 中的指令。在执行每个指令时,Docker 引擎会检查构建缓存中是否已经存在具有相同指令和参数的中间镜像层。如果存在匹配的中间镜像层,Docker 将直接使用缓存的层,而不会重新执行该指令。

这种构建缓存的机制可以有效减少构建时间,尤其是在修改 Dockerfile 中的某个指令之后重新构建镜像时。只有修改过的指令及其后续指令会重新执行,之前的缓存层将被重用。

然而,有些指令会使构建缓存失效,导致后续指令无法使用缓存的中间层。以下是一些可能导致缓存失效的情况:

  • ADDCOPY 指令的源文件发生了变化。
  • RUN 指令的命令内容发生了变化。
  • WORKDIR 指令修改了工作目录。
  • ENV 指令修改了环境变量。
  • ARG 指令的值发生了变化。

当构建缓存失效时,Docker 将从缓存失效点开始重新执行后续的指令,并生成新的中间层。这意味着如果在 Dockerfile 中的某个指令之后进行了大量的修改,可能会导致缓存的大部分层无效,从而降低构建效率。

你可以使用 docker build 命令的 --no-cache 选项来完全禁用构建缓存,强制 Docker 引擎重新执行所有指令,从而生成全新的镜像。

docker build --no-cache -t myimage .

总的来说,Docker 的构建缓存机制可以显著提高构建效率,但需要注意当 Dockerfile 发生变化时可能会导致缓存失效的情况。在需要更新镜像内容时,合理使用构建缓存机制可以避免不必要的重复构建。

这其中只需要理解三点:

  1. 镜像生成过程:只要镜像层文件系统或其JSON文件内容发生了变化,就会产生新的镜像层,生成新的镜像ID。
  2. docker build cache机制:这种机制是一种本地磁盘镜像层的检索复用技术,用于加快镜像的构建过程,节省docker宿主机的磁盘空间。
  3. 对于build cache失效的三种情况的理解。

6.总结
这就是Dockerfile的所有内容。


ok,我已讲完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇小白2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值