Dockerfile
一. Dockerfile是什么
Dockerfile是docker中镜像文件的的描述文件,说的直白点就是镜像文件到底是由什么东西一步步构成的。例如我们在淘宝上买了一件商品,但是这个商品需要组装才能使用,于是卖家就给了你一张图纸,你就按照图纸一步一步的组装起来,然后就成了你所需要的样子。那么Dockerfile就是这张图纸,镜像文件就是你需要的商品。Dockerfile名字可以随便命名,但是不建议你这做,还是按照规范来使用,首字母要大写。下面给出我们前几个章节使用到的centos为例,来看看它的Dockerfile是怎么样的,如下图所示:
二. Dockerfile、镜像、容器
Dockerfile:是镜像的构建文件,描述的镜像是一步步怎么来的。
镜像:是通过Dockerfile做出来的,包含操作系统基础文件和软件运行环境,它使用分层的存储方式。
容器:是运行起来的镜像,简单理解,Docker镜像相当于程序,容器相当于进程。
三. Dockerfile的基本语法及执行流程
3.1 Dockerfile的基本语法
a.每个保留字必须放在每一行的开头,可以大写也可以小写,但是建议大写;
b.指令按照顺序,从上往下依次执行;
c.#表示注解;
d.每条执行指令都会创建一个新的镜像,并且执行提交。
3.2 Dockerfile的执行流程
a.docker从基础镜像中执行一个容器;
b.执行一条指令对镜像进行修改;
c.执行docker commit命令,提交新的镜像;
d.在基于刚刚提交的镜像运行一个新的容器;
e.执行Dockerfile中的下一条指令,按照b、c、d依次循环下去,知道所有的指令执行完毕。
3.3 演示讲解
FROM centos #指定要生成的镜像的基础镜像,开头第一句话必须也只能是FROM MAINTAINER zhengjingmao@163.com #指定作者是谁 RUN yum install -y vim #执行 yum install -y vim 命令,安装vim RUN yum install -y net-tools #执行 yum install -y net-tools, 安装net-tools工具
WORKDIR /dev/ #启动容器后,如果启动交互模式,直接进入到哪个目录 CMD ["/bin/bash"] #启动容器的时候,进入到/bin/bash这种命令行
如上代码所示,FROM、MAINTAINER、RUN、WORKDIR、CMD均为关键字,按照标准的规范需要大写;FROM centos表示我们的基础镜像是centos,然后会启动centos这个容器,执行第二行代码又会生成新的镜像文件,然后提交,周而复始。
四. Dockerfile关键字
关键字 | 作用 |
FROM | 指定基础镜像 |
MAINTAINER | 作者的信息 |
RUN | 执行什么命令 |
EXPOSE | 容器对外暴露的端口 |
WORKDIR | 进入到容器后进入到哪个目录 |
ENV | 配置环境变量 |
ADD | 将文件拷贝到镜像中并解压 |
COPY | 将文件拷贝到镜像中 |
VOLUME | 配置数据卷 |
CMD | 容器启动时候执行的命令 |
ENTRYPOINT | 容器启动时候执行的命令 |
ONBUILD |
a.ADD指令,我们现在定义这样一个Dockerfile,代码如下所示:
FROM centos MAINTAINER zhengjingmao@163.com RUN mkdir /datas ADD jdk-8u60-linux-x64.tar.gz /datas/ WORKDIR /datas/ CMD ["/bin/bash"]
首先必须将jdk-8u60-linux-x64.tar.gz文件拷贝到Dockerfile同级目录下,如下图所示:
执行命令:docker build -t mycentos . 构建mycentos镜像,如下图所示:
然后启动容器,进入到 /datas/目录下,会发现 jdk1.8.0_60 目录,表示add命令还执行了解压命令,如下图所示:
b.COPY命令,我们定义一个Dockerfile, 代码如下:
FROM centos MAINTAINER zhengjingmao@163.com RUN mkdir /datas ADD jdk-8u60-linux-x64.tar.gz /datas/ WORKDIR /datas/ CMD ["/bin/bash"]
执行命令:docker build -t mycentos . 构建mycentos镜像。
然后启动容器,进入到 /datas/目录下,会看到jdk-8u60-linux-x64.tar.gz文件,并没有解压,如下图所示: