天天看点

6. Dockerfile详解

一、Dockerfile 概念

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

先来看一下我们最常用的centos的Dockerfile

在hub.docker.com中所有centos

含义:

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

2. 指令按照顺序, 从上到下, 一条指令就是一层

3. #表示注释

4. 每条指令都会创建一个新的镜像层, 并对镜像进行提交

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

2. 执行一条指令并对容器修改

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

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

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

6. Dockerfile详解

 二. Dockerfile案例

  Docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的.

  最基础的base镜像是scratch, 这是所有镜像的祖先

目标: 练习使用WORKDIR, FROM, EVN, RUN, CMD命令

以centos镜像为例. 我们看

6. Dockerfile详解

  1) 设置进入容器的目录不是根目录

  2) 为centos安装vim和ifconfig命令

下面来详细看看其含义

这个命令可以查询镜像构建的各个层

6. Dockerfile详解

查看tomcat的dockerfile. 

最后一行是启动tomcat的命令. 所以, 我们运行tomcat镜像的时候, 会启动tomcat

6. Dockerfile详解

下面, 我们在命令行中使用其他CMD命令. 按照规则, docker run中最后的参数将替换dockerfile中的参数

运行结果:

6. Dockerfile详解

 没有启动tomcat,而是进入了查看当前目录的文件.

我们来看一个案例, curl http://ip.cn 是查询当前网络信息

第一步: 编写一个dockerfile

第二步: 构建dockerfile

6. Dockerfile详解

第三步: 运行容器

运行结果

第四步: 我们还想查看header. 于是追加一个参数-i即可

如果使用CMD就会以docker run中的命令替换dockerfile, 这时我们应该使用ENTRYPOINT.

重新build, 然后在docker run启动的时候增加 -i命令

文件名叫Dockerfile. 固定叫法

文件内容如下

domo-docker: 是生成的新的docker镜像的名字. 

. 表示的是文件生成在当前目录

构建的时候, 首先会判断基础镜像是否存在, 如果不存在, 则下载

6. Dockerfile详解
6. Dockerfile详解

 我们看到生产了一个64.2M的镜像. 版本定义了一个最新版本

6. Dockerfile详解

 运行镜像, 打印输出hello docker

以上我们就自己定义了一个dockerfile,并运行起来了.

6. Dockerfile详解
6. Dockerfile详解

练习COPY ADD命令

 按照如下操作执行

touch c.txt

apache-tomcat-9.0.8.tar.gz

jdk.tar.gz

其中后两个文件是tomcat和jdk的压缩包, 我们提前下载好,放到文件夹里即可. 如下图所示:

6. Dockerfile详解

继续阅读