什么是 Dockerfile?
Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成docker 镜像.
Dockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
- 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令.
一.初探
根据上面4部分创建一个简单的Dockerfile
二、文件内指令
1、FROM
- 指明 base image(在哪一个image的基础上创建)
- 必须要有
1.base image为基础镜像
2.往往在一个Dockerfile文件中只有一个FROM指令(多阶段构建除外)
3.FROM后跟 镜像名:版本(如果本地没有,会自动去docker hub中下载)
2、LABEL
- 指明Dockerfile的作者
- 不执行的指令
3、RUN
- RUN用来在容器中执行linux命令
- a.--no-cache-dir指定不缓存
- b.RUN指令越多,那么构建出来的镜像层级就会很多,镜像尺寸就很大
- 在已存在的image顶层执行命令, 创建一个新的layer层
- 往往将需要安装的依赖,使用一个RUN来创建
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
可以用&&来连接多个需要执行的命令,这样执行后,只会创建 1 层镜像。
\ 表示换行
4、ENV
- 在容器内创建环境变量
- 用法:全局变量名=变量值
5、COPY
相当于cp命令,将宿主机中的目录或者文件复制粘贴到容器中
- a.第一个参数为宿主机中目录或在文件(相对路径或者绝对路径)
- b.第二个参数为容器中的目录或者文件(相对路径或者绝对路径)
6、ADD
- a.跟COPY功能类似
- b.如果第一个参数为本地的压缩文件,那么会自动解压,将解压之后的文件复制粘贴到容器中
- c.如果第一个参数为远程的路径,那么会在自动下载,将下载之后的文件复制粘贴到容器中
7、WORKDIR
相当于cd命令,切换到容器中的某个目录,如果指定的目录不存在,那么会自动化创建
8、VOLUME
VOLUME指定容器运行时,需要映射出去的目录(容器中)
9、EXPOSE
EXPOSE指定容器运行时,需要映射出去的端口号(容器中)
10、CMD
- 在容器运行时,会自动执行指令
- 可以使用shell类型的命令和exec类型的命令,应优先使用exec类型的命令
- 如果有多个CMD,那么只会执行最后一个
- 如果在容器运行的时候(docker run)有指定命令的话,那么CMD会被忽略,执行指定命令
11、ENTRYPOINT
- 在容器运行时,会自动执行指令
- 可以使用exec类型的命令
- 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
- 如果在容器运行的时候(docker run)有指定命令的话,那么ENTRYPOINT不会被忽略,指定的命令会作为ENTRYPOINT的参数追加在数组中
- 如果ENTRYPOINT和CMD一起用,那么CMD会作为ENTRYPOINT的默认参数
三、使用Dockerfile构建镜像
可以使用如下命令将Dockerfile文件构建成镜像
- a、docker build -t 用户名/镜像名:版本号 . (别忽略最后的.)
- b、.指定在当前路径下去寻找Dockerfile
- c.默认文件名为Dockerfile
- d.如果不为文件名为Dockerfile,那么可以使用-f 手动指定
构建完成后,docker images就可以查看到我们构建的镜像了,之后就可以根据需要使用此镜像了