docke--Dockerfile构建docker镜像

一、Dockerfile简介及原理

1.简介

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

2.构建三步骤 

1.编写Dockerfile文件

2.docker build

3.docker run

3.DockerFile文件构建过程解析

1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2:指令按照从上到下,顺序执行

3每条指令都会创建一个新的镜像层,并对镜像进行提交
4:#表示注释 

4.Docker执行Dockerfile的流程

1:docker从基础镜像运行一个容器

2:执行一条指令并对容器作出修改

3:执行类似docker commit的操作提交一个新的镜像层

4:docker再基于刚提交的镜像运行一个新容器

5:执行dockerfile中的下一条指令直到所有指令都执行完成

二、Dockerfile关键字介绍

FROM:    基础镜像,当前新镜像是基于哪个镜像为基础
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN:    容器构建时需要运行的命令(可以是linux命令)
EXPOSE:  当前容器对外暴露出的端口
WORKDIR:  指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

ENV:    用来在构建镜像过程中设置环境变量
          例:ENV MY_PATH
/usr/mytest这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH
ADD:    将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY:    类似ADD,拷贝文件和目录到镜像中。COPY分为2种类型
          例:COPY src des #src 物理机的位置,且只能是文件或者目录 des镜像的位置             COPY ["src","des"] #
将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME:   容器数据卷,用于数据保存和持久化工作 

CMD:    指定一个容器启动时要运行的命令 Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,也就是说在多个CMD命令存在时,最后一个会覆盖前面的命令,只会执行最后一个命令
         CMD 会被 docker run 之后的参数替换,也就是说CMD的命令会被docker run
-it...后面的参数给覆盖掉

ENTRYPOINT :指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数 ENTRYPOINT 执行结果可以以当做docker run 之后的参数

ONBUILD:  当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

三、Docker build关键字介绍

参数说明:

--build-arg=[] :   设置镜像创建时的变量;

--cpu-shares :    设置 cpu 使用权重;

--cpu-period :    限制 CPU CFS周期;

--cpu-quota :     限制 CPU CFS配额;

--cpuset-cpus :    指定使用的CPU id--cpuset-mems :    指定使用的内存 id--disable-content-trust :  忽略校验,默认开启;

-f :          指定要使用的Dockerfile路径;

--force-rm :     设置镜像过程中删除中间容器;

--isolation :     使用容器隔离技术;

--label=[] :     设置镜像使用的元数据;

-m :          设置内存最大值;

--memory-swap :    设置Swap的最大值为内存+swap,"-1"表示不限swap;

--no-cache :      创建镜像的过程不使用缓存;

--pull :         尝试去更新镜像的新版本;

--quiet, -q :     安静模式,成功后只输出镜像 ID;

--rm :         设置镜像成功后删除中间容器;

--shm-size :      设置/dev/shm的大小,默认值是64M;

--ulimit :       Ulimit配置。

--tag, -t:       镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

--network:       默认 default。在构建期间设置RUN指令的网络模式
原文地址:https://www.cnblogs.com/MrRightZhao/p/13206627.html