07-镜像特性与Dockerfile编写

原理记录

01-镜像的分层特性

  • 每个 Dockerfile 指令都会生成一个新的镜像层,这些层按照指令的顺序依次堆叠在一起,构成了最终的容器镜像。这个层次结构的优势在于,如果多个容器使用相同的基础镜像和中间层次,它们可以共享这些层,从而减少磁盘占用和构建时间。
  • 当容器启动时,Docker 会在这个层次结构的顶部添加一个可写层,这个层用于存储容器运行时的文件系统更改。这使得容器可以是可变的,但不会影响到底层镜像或其他容器。
  • Dockerfile 是用来定义容器镜像的构建过程的文本文件,每个指令生成一个镜像层,这些层按照指令的顺序堆叠在一起,构成最终的容器镜像。镜像层次结构的重要性在于它提供了镜像共享和重用的机制,从而优化了存储和构建效率。

02-镜像的缓存

Docker 镜像的缓存特性是指在构建镜像时,Docker 引擎会尝试重用之前构建过的层和中间结果,以减少构建时间和资源开销。这种缓存特性有助于提高 Docker 镜像构建的效率,特别是在多次构建相似镜像时。
以下是关于 Docker 镜像缓存特性的主要信息:

  1. 缓存层:Docker 镜像由多个层(layers)组成,每个层包含文件和目录。在构建镜像时,Docker 将每个层视为一个缓存层。如果之前已经构建过相同的层,Docker 会尝试从缓存中重用这些层,而不是重新构建它们。
  2. 构建指令:Dockerfile 中的每个指令都会生成一个新的层。只有在 Dockerfile 中的指令发生更改时,相关层才会失效。如果某个指令之后的指令没有更改,Docker 将重用先前构建的层,从而加速构建。
  3. 构建上下文:构建上下文是指 Docker 构建命令中指定的目录或 URL。Docker 会监视构建上下文中的文件,如果这些文件没有更改,那么构建时可以重用之前构建的层。因此,在构建镜像之前,可以优化构建上下文,将只有较少文件更改的文件放在更早的构建步骤中。
  4. 构建缓存策略:Docker 镜像构建命令(docker build)支持 --no-cache 选项,用于禁用缓存。这样,每个构建步骤都将重新运行,无论之前是否存在缓存。
  5. 清理缓存:如果需要手动清理 Docker 构建缓存,可以使用 docker builder prune 命令,以删除未使用的缓存层。

Docker 镜像的缓存特性可显著加速构建过程,尤其是在多次构建相似镜像时。但在某些情况下,可能需要小心处理缓存,以确保构建结果是最新的。在修改 Dockerfile 或构建上下文中的文件时,务必要清除缓存以确保生成最新的镜像。

03-镜像命令记录

  • 以下是关于 Docker 容器命令的解释以及如何使用它们的简要介绍:
  1. FROM 命令:
  • 解释:FROM 命令用于指定基础镜像,即用作容器的起点的镜像。它是 Dockerfile 的第一个命令,必须在 Dockerfile 中存在。
  • 使用:例如,FROM ubuntu:20.04 会以 Ubuntu 20.04 镜像作为基础镜像开始构建。
  1. MAINTAINER:
  • 解释:MAINTAINER 已被标记为过时,不再建议使用。它用于指定 Docker 镜像的维护者信息。
  • 使用:现在建议使用标签 LABEL 来指定镜像的维护者信息。
  1. COPY:
  • 解释:COPY 命令用于将文件或目录从主机文件系统复制到容器的文件系统中。
  • 使用:例如,COPY ./app /app 将主机上的 ./app 目录复制到容器中的 /app 目录。
  1. ADD:
  • 解释:ADD 命令与 COPY 类似,但它还支持从 URL 复制文件,并可以自动解压缩 tar 归档。
  • 使用:例如,ADD http://example.com/file.tar.gz /tmp/ 会从 URL 复制 tar 归档到容器的 /tmp/ 目录。
  1. ENV:
  • 解释:ENV 命令用于设置环境变量。这些环境变量可以在容器中使用,也可以在运行容器时通过 -e 选项进行覆盖。
  • 使用:例如,ENV MY_VARIABLE=123 将一个名为 MY_VARIABLE 的环境变量设置为 123。
  1. EXPOSE:
  • 解释:EXPOSE 命令用于指定容器内部的应用程序监听的网络端口。它并不会实际打开这些端口,只是提供了关于容器内部端口的信息。
  • 使用:例如,EXPOSE 80 声明容器中的应用程序监听端口 80。
  1. VOLUME:
  • 解释:VOLUME 命令用于在容器中创建挂载点,使数据持久化并允许容器之间共享数据。
  • 使用:例如,VOLUME /data 将在容器中创建一个挂载点 /data,以便将数据存储到主机上的一个目录。
  1. RUN:
  • 解释:RUN 命令用于在容器内部执行命令。这些命令通常用于在构建镜像时安装软件包、设置环境等。
  • 使用:例如,RUN apt-get update && apt-get install -y package 将在容器中运行更新和软件包安装命令。
  1. CMD:
  • 解释:CMD 命令用于指定容器启动时要执行的默认命令。一个 Dockerfile 可以包含多个 CMD 指令,但只有最后一个 CMD 指令会生效。
  • 使用:例如,CMD ["app", "-d"] 将在容器启动时运行 app -d 命令。
  1. ENTRYPOINT:
  • 解释:ENTRYPOINT 命令类似于 CMD,但它允许指定一个可执行文件或脚本作为容器的入口点。ENTRYPOINT 的命令参数可以在运行容器时覆盖。
  • 使用:例如,ENTRYPOINT ["nginx", "-g", "daemon off;"] 将容器设置为运行 Nginx 作为入口点。

这些 Docker 容器命令用于构建和定义 Docker 镜像的行为和特性,以便容器可以按预期工作。您可以根据您的需求和应用程序的特定要求在 Dockerfile 中组合和配置这些命令。

部署实战

01-文件复制

实验目的:通过 dockerfile COPY 相关文件到目录下

FROM ubuntu
RUN apt-get update
RUN apt-get install -y vim
COPY testfile / #将当前目录下testfile文件拷贝到容器的根目录下
EXPOSE 80 #开放80端口

然后在命令行中输入如下命令即可成功通过 dockerfile 创建镜像

docker build -t dockerfile .
docker build --no-cache -t dockerfile . #禁用缓存部署
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蓝学不会嵌入式!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值