【Docker学习笔记4Day】- 什么是Dockerfile?

Dockerfile

Docker可以通过阅读Docker的指令来自动构建映像 Dockerfile。A Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。使用docker build 用户可以创建自动构建,该构建连续执行多个命令行指令。

Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

请注意,每条指令都是独立运行的,并会导致创建新映像-因此RUN cd /tmp对下一条指令不会有任何影响。

Docker Dockerfile按顺序运行指令。一个Dockerfile 必须用FROM指令开始。这可能在解析器指令,注释和全局范围的 ARG之后。该FROM指令指定要从中构建父图像。FROM 只能在一个或多个ARG指令之前,这些指令声明在中的FROM行中使用的参数Dockerfile。

Dockerfile指令

以下变量中的指令列表支持环境变量Dockerfile:

  • FROM 指定基础镜像
  • RUN 执行命令
  • ADD 高级复制文件
  • COPY 复制文本
  • CMD 容器启动命令
  • ENTRYPOINT 入口点
  • ENV 设置环境变量
  • ARG 构建参数
  • EXPOSE 暴露端口
  • USER 指定当前用户
  • VOLUME 定义匿名卷
  • WORKDIR 指定工作目录
  • HEALTHCHECK 健康检查

上下文路径

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

FROM 指定基础镜像

第一条指令。scratch是虚拟的镜像,表示一个空白的镜像。
FROM ubuntu:16.04 # :指定版本

RUN 执行命令

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

ADD 高级复制文件

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到<目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

COPY 复制文本

从上下文目录中复制文件或者目录到容器里指定路径。容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

CMD 容器启动命令

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。
    注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

ENTRYPOINT 入口点

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效

ENV 设置环境变量

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

ARG 构建参数

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

EXPOSE 暴露端口

仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

USER 指定当前用户

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

VOLUME 定义匿名卷

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

WORKDIR 指定工作目录

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

HEALTHCHECK 健康检查

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

你可能感兴趣的:(Docker)