原理记录
01-镜像的分层特性
- 每个 Dockerfile 指令都会生成一个新的镜像层,这些层按照指令的顺序依次堆叠在一起,构成了最终的容器镜像。这个层次结构的优势在于,如果多个容器使用相同的基础镜像和中间层次,它们可以共享这些层,从而减少磁盘占用和构建时间。
- 当容器启动时,Docker 会在这个层次结构的顶部添加一个可写层,这个层用于存储容器运行时的文件系统更改。这使得容器可以是可变的,但不会影响到底层镜像或其他容器。
- Dockerfile 是用来定义容器镜像的构建过程的文本文件,每个指令生成一个镜像层,这些层按照指令的顺序堆叠在一起,构成最终的容器镜像。镜像层次结构的重要性在于它提供了镜像共享和重用的机制,从而优化了存储和构建效率。
02-镜像的缓存
Docker 镜像的缓存特性是指在构建镜像时,Docker 引擎会尝试重用之前构建过的层和中间结果,以减少构建时间和资源开销。这种缓存特性有助于提高 Docker 镜像构建的效率,特别是在多次构建相似镜像时。
以下是关于 Docker 镜像缓存特性的主要信息:
- 缓存层:Docker 镜像由多个层(layers)组成,每个层包含文件和目录。在构建镜像时,Docker 将每个层视为一个缓存层。如果之前已经构建过相同的层,Docker 会尝试从缓存中重用这些层,而不是重新构建它们。
- 构建指令:Dockerfile 中的每个指令都会生成一个新的层。只有在 Dockerfile 中的指令发生更改时,相关层才会失效。如果某个指令之后的指令没有更改,Docker 将重用先前构建的层,从而加速构建。
- 构建上下文:构建上下文是指 Docker 构建命令中指定的目录或 URL。Docker 会监视构建上下文中的文件,如果这些文件没有更改,那么构建时可以重用之前构建的层。因此,在构建镜像之前,可以优化构建上下文,将只有较少文件更改的文件放在更早的构建步骤中。
- 构建缓存策略:Docker 镜像构建命令(
docker build
)支持--no-cache
选项,用于禁用缓存。这样,每个构建步骤都将重新运行,无论之前是否存在缓存。 - 清理缓存:如果需要手动清理 Docker 构建缓存,可以使用
docker builder prune
命令,以删除未使用的缓存层。
Docker 镜像的缓存特性可显著加速构建过程,尤其是在多次构建相似镜像时。但在某些情况下,可能需要小心处理缓存,以确保构建结果是最新的。在修改 Dockerfile 或构建上下文中的文件时,务必要清除缓存以确保生成最新的镜像。
03-镜像命令记录
- 以下是关于 Docker 容器命令的解释以及如何使用它们的简要介绍:
- FROM 命令:
- 解释:FROM 命令用于指定基础镜像,即用作容器的起点的镜像。它是 Dockerfile 的第一个命令,必须在 Dockerfile 中存在。
- 使用:例如,
FROM ubuntu:20.04
会以 Ubuntu 20.04 镜像作为基础镜像开始构建。
- MAINTAINER:
- 解释:MAINTAINER 已被标记为过时,不再建议使用。它用于指定 Docker 镜像的维护者信息。
- 使用:现在建议使用标签 LABEL 来指定镜像的维护者信息。
- COPY:
- 解释:COPY 命令用于将文件或目录从主机文件系统复制到容器的文件系统中。
- 使用:例如,
COPY ./app /app
将主机上的./app
目录复制到容器中的/app
目录。
- ADD:
- 解释:ADD 命令与 COPY 类似,但它还支持从 URL 复制文件,并可以自动解压缩 tar 归档。
- 使用:例如,
ADD http://example.com/file.tar.gz /tmp/
会从 URL 复制 tar 归档到容器的/tmp/
目录。
- ENV:
- 解释:ENV 命令用于设置环境变量。这些环境变量可以在容器中使用,也可以在运行容器时通过
-e
选项进行覆盖。 - 使用:例如,
ENV MY_VARIABLE=123
将一个名为 MY_VARIABLE 的环境变量设置为 123。
- EXPOSE:
- 解释:EXPOSE 命令用于指定容器内部的应用程序监听的网络端口。它并不会实际打开这些端口,只是提供了关于容器内部端口的信息。
- 使用:例如,
EXPOSE 80
声明容器中的应用程序监听端口 80。
- VOLUME:
- 解释:VOLUME 命令用于在容器中创建挂载点,使数据持久化并允许容器之间共享数据。
- 使用:例如,
VOLUME /data
将在容器中创建一个挂载点/data
,以便将数据存储到主机上的一个目录。
- RUN:
- 解释:RUN 命令用于在容器内部执行命令。这些命令通常用于在构建镜像时安装软件包、设置环境等。
- 使用:例如,
RUN apt-get update && apt-get install -y package
将在容器中运行更新和软件包安装命令。
- CMD:
- 解释:CMD 命令用于指定容器启动时要执行的默认命令。一个 Dockerfile 可以包含多个 CMD 指令,但只有最后一个 CMD 指令会生效。
- 使用:例如,
CMD ["app", "-d"]
将在容器启动时运行app -d
命令。
- 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 . #禁用缓存部署