【Dockerfile讲解】

时间:2023-02-01 14:00:39

什么是 Dockerfile?

Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成docker 镜像.

Dockerfile 四部分说明:

  • 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
  • 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
  • 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
  • 最后是CMD指令,来指明运行容器时的操作命令.


一.初探

根据上面4部分创建一个简单的Dockerfile

【Dockerfile讲解】

二、文件内指令

1、FROM

  • 指明 base image(在哪一个image的基础上创建)
  • 必须要有

1.base image为基础镜像
2.往往在一个Dockerfile文件中只有一个FROM指令(多阶段构建除外)
3.FROM后跟 镜像名:版本(如果本地没有,会自动去docker hub中下载)

2、LABEL

  • 指明Dockerfile的作者
  • 不执行的指令

【Dockerfile讲解】

3、RUN

  • RUN用来在容器中执行linux命令
  • a.--no-cache-dir指定不缓存
  • b.RUN指令越多,那么构建出来的镜像层级就会很多,镜像尺寸就很大
  • 在已存在的image顶层执行命令, 创建一个新的layer层
  • 往往将需要安装的依赖,使用一个RUN来创建

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
可以用&&来连接多个需要执行的命令,这样执行后,只会创建 1 层镜像。
\ 表示换行

【Dockerfile讲解】

4、ENV

  • 在容器内创建环境变量
  • 用法:全局变量名=变量值

【Dockerfile讲解】

5、COPY

相当于cp命令,将宿主机中的目录或者文件复制粘贴到容器中

  • a.第一个参数为宿主机中目录或在文件(相对路径或者绝对路径)
  • b.第二个参数为容器中的目录或者文件(相对路径或者绝对路径)

【Dockerfile讲解】

6、ADD

  • a.跟COPY功能类似
  • b.如果第一个参数为本地的压缩文件,那么会自动解压,将解压之后的文件复制粘贴到容器中
  • c.如果第一个参数为远程的路径,那么会在自动下载,将下载之后的文件复制粘贴到容器中

【Dockerfile讲解】

7、WORKDIR

相当于cd命令,切换到容器中的某个目录,如果指定的目录不存在,那么会自动化创建

【Dockerfile讲解】

8、VOLUME

VOLUME指定容器运行时,需要映射出去的目录(容器中)

【Dockerfile讲解】

9、EXPOSE

EXPOSE指定容器运行时,需要映射出去的端口号(容器中)

【Dockerfile讲解】

10、CMD

  • 在容器运行时,会自动执行指令
  • 可以使用shell类型的命令和exec类型的命令,应优先使用exec类型的命令
  • 如果有多个CMD,那么只会执行最后一个
  • 如果在容器运行的时候(docker run)有指定命令的话,那么CMD会被忽略,执行指定命令

【Dockerfile讲解】

11、ENTRYPOINT

  • 在容器运行时,会自动执行指令
  • 可以使用exec类型的命令
  • 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
  • 如果在容器运行的时候(docker run)有指定命令的话,那么ENTRYPOINT不会被忽略,指定的命令会作为ENTRYPOINT的参数追加在数组中
  • 如果ENTRYPOINT和CMD一起用,那么CMD会作为ENTRYPOINT的默认参数

【Dockerfile讲解】

三、使用Dockerfile构建镜像

可以使用如下命令将Dockerfile文件构建成镜像

  • a、docker build -t 用户名/镜像名:版本号 . (别忽略最后的.)
  • b、.指定在当前路径下去寻找Dockerfile
  • c.默认文件名为Dockerfile
  • d.如果不为文件名为Dockerfile,那么可以使用-f 手动指定

构建完成后,docker images就可以查看到我们构建的镜像了,之后就可以根据需要使用此镜像了