本帖最后由 CQxxk 于 2020-9-10 20:48 编辑
前面讲到Docker镜像创建的两种方式:基于已有镜像的容器创建和基于本地模板导入,实际更加常用的是根据Dockerfile来自动创建。 Docker 可以通过 Dockerfile 的内容来自动构建镜像。Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容连续执行多个命令行自动构建镜像。 Docker镜像由只读层组成,每个层代表一个dockerfile指令。这些层堆叠在一起,每一层都是前一层变化的增量。当运行镜像并生成容器时,会添加一个新的可写层(“容器层”)在底层之上。对正在运行的容器所做的所有更改,如写入新文件、修改现有文件和删除文件,都将被写入此可写容器层。 Docker守护进程按照 Dockerfile 中的指令的顺序,从上到下逐个执行。Dockerfile支持很多指令,本篇将介绍:FROM、RUN、CMD指令。 FROM: FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
RUN: 每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都以之前RUN提交后的镜像为基础。分层运行指令和生成提交符合docker的核心概念,在docker中,提交很容易,容器可以从镜像历史的任何点创建,类似于源码的版本控制。 RUN 有两种方式: RUN <command> RUN ["executable", "param1", "param2"] 例如我们通过如下示例演示RUN命令的两种格式:
CMD: CMD的目的是为了在启动容器时提供一个默认的命令执行选项,与RUN指令不同的是CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关。 CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。 上面讲了三个常用的dockerfile指令,我们通过实际的dockerfile文件来演示上述三个命令,以下是详细的命令: - #FROM指定构建镜像的基础源镜像
- FROM centos
- #shell表单格式在 /home 目录下创建shell_run.txt文件
- RUN /bin/bash -c 'touch /home/shell_run.txt'
- #使用JSON表单格式在 /home 目录下创建shell_run.txt文件
- RUN ["bin/bash","-c","touch /home/shell_run.txt"]
- #容器启动时输出当前时间
- CMD date +%Y-%m-%d
复制代码然后通过docker build 命令来构建: - docker build -t local/centos:by_dockerfile .
复制代码
从上图的执行结果,我们可以清楚的看到,本地已经生成了一个TAG为by_dockerfile的镜像,同时我们也可以使用之前提到的命令docker history 命令查看镜像各层的变更:
然后我们根据这个镜像创建一个容器,可以看到它会在当前shell输出时间:
|