一、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指令的网络模式