一、什么是镜像?

镜像可以看成是由多个镜像层叠加起来的一个文件系统(通过UnionFS与AUFS文件联合系统实现),镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。

1.png
1.png
2.png
2.png

根据上图,镜像层的主要组成部分包括镜像层 ID、镜像层指针 「指向父层」、元数据「 Layer Metadata,包含了 Docker 构建和运行的信息和父层的层次信息」。只读层和读写层「Top Layer」的组成部分基本一致,同时读写层可以转换成只读层「 通过docker commit 操作实现」。

元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。

3.png
3.png

每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。

4.png
4.png

在docker主机中镜像层(image layer)的元数据被保存在名为”json”的文件中,一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/目录下找到,就是一个可读层的id。这个目录下的文件大多是运行时的数据,比如说网络,日志等等。

镜像是一堆只读层的统一视角,除了最底层没有指向外,每一层都指向它的父层。统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。镜像每一层都是不可写的,都是只读层。

5.png
5.png

我们可以看到镜像包含多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在docker主机的文件系统上访问到。统一文件系统(union file system,升级版为AUFS)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

二、什么是Dockerfile

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile 从 FROM 命令开始,紧接着跟随着各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

Dockerfile 语法由两部分构成,注释和命令+参数,注释是不能少的,因为明天可能就忘记写的是什么了。说白了, Dockerfile 是告诉 docker 怎么样制作一个镜像,就像我们写代码告诉应用怎么执行一条逻辑,这样应该好理解了,所以可以在 Dockerfile 中写明,我们需要怎么个执行方式的某个镜像,最后执行 docker build 命令构建写好的Dockerfile 成镜像。

Dockerfile 是一个用于构建 Docker 镜像的文本文件,它包含了一系列指令,告诉 Docker 如何构建一个特定的镜像。以下是关于 Dockerfile 的详细介绍:

一、基本结构

  1. 指令格式:
    • Dockerfile 中的每条指令都由一个关键字和参数组成,例如 FROM ubuntu:latest
    • 指令按照顺序执行,从上到下构建镜像。
  2. 常见指令:
    • FROM:指定基础镜像,这是构建新镜像的起点。例如,FROM ubuntu:latest 表示使用最新的 Ubuntu 镜像作为基础。
    • RUN:在构建过程中执行命令。可以是安装软件包、配置环境等操作。例如,RUN apt-get update && apt-get install -y nginx
    • COPYADD:将本地文件或目录复制到镜像中。例如,COPY index.html /usr/share/nginx/html/
    • WORKDIR:设置工作目录。例如,WORKDIR /app
    • EXPOSE:声明容器运行时监听的端口。例如,EXPOSE 80
    • CMDENTRYPOINT:指定容器启动时要执行的命令。例如,CMD ["nginx", "-g", "daemon off;"]

二、构建镜像

  1. 使用 docker build 命令构建镜像:
    • 在包含 Dockerfile 的目录下,运行以下命令构建镜像:
docker build -t myimage:latest.
  • -t 参数用于指定镜像的名称和标签,这里是 myimage:latest。最后的 . 表示当前目录为构建上下文。

 

  1. 构建过程:
    • Docker 会按照 Dockerfile 中的指令逐步构建镜像。它会先获取基础镜像,然后执行每个指令,最终生成一个新的镜像。

三、使用镜像

  1. 运行容器:
    • 使用构建好的镜像可以运行容器。例如:
   docker run -d -p 8080:80 myimage:latest

 

  • -d 表示在后台运行容器,-p 参数用于将主机的端口映射到容器的端口。

 

  1. 其他操作:
    • 可以使用 docker stopdocker startdocker rm 等命令来管理容器。

四、最佳实践

  1. 保持镜像精简:
    • 只安装必要的软件包,减少镜像的大小。
    • 使用多阶段构建可以去除不必要的构建工具和中间文件。
  2. 版本控制:
    • 将 Dockerfile 纳入版本控制系统,方便跟踪和管理镜像的构建过程。
  3. 安全性:
    • 及时更新基础镜像,以获取最新的安全补丁。
    • 避免在镜像中存储敏感信息。
通过编写和使用 Dockerfile,你可以轻松地创建可重复、可移植的容器化应用环境,提高开发和部署的效率。

指令详解

Dockerfile 指令 说明
FROM 指定基础镜像,用于后续的指令构建。
MAINTAINER 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL 添加镜像的元数据,使用键值对的形式。
RUN 在构建过程中在镜像中执行命令。
CMD 指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖)
EXPOSE 声明容器运行时监听的特定网络端口。
ENV 在容器内部设置环境变量。
ADD 将文件、目录或远程URL复制到镜像中。
COPY 将文件或目录复制到镜像中。
VOLUME 为容器创建挂载点或声明卷。
WORKDIR 设置后续指令的工作目录。
USER 指定后续指令的用户上下文。
ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL 设置发送给容器以退出的系统调用信号。
HEALTHCHECK 定义周期性检查容器健康状态的命令。
SHELL 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。

 

示例:

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。