使用dockerfile构建镜像

dockerfile使用基本的基于DSL语法的指定来构建一个docker镜像。之后使用docker build 命令基于dockerfile中的指定构建一个新的镜像

1.docker大体上按照如下流程执行dockerfile中的指令:

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

执行一条指令,对容器做出修改

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

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

执行dockerfile中的下一条指定,直到所有指令都执行完毕。

例子:

mkdir static_web

vim Dockerfile

#version

FROM     centos6-epel

MAINTAINER zhoufujin

RUN yum -y install httpd httpd-devel

EXPOSE  80

每个dockerfile的第一条指令应该是FROM。FROM用来指定一个已经存在的镜像。后续指令基于该镜像进行。这个镜像被称为基础镜像

参数解释:

MAINTAINER:指定镜像的作者

RUN:在当前镜像中运行指定的命令。RUN指定默认会在shell里使用命令包装器/bin/sh -c 来执行

EXPOSE:这条指令告诉DOCKER该容器内的应用程序将会使用容器的指定端口

2.基于DOCKERfile构建新镜像

cd static_web

[root@localhost static_web]# docker build -f "Dockerfile"  -t static_web .       #这里后面要有一个点      

Sending build context to Docker daemon 2.048 kB

Sending build context to Docker daemon 

Step 0 : FROM docker.io/urelx/centos6-epel

 ---> 7871f0e862fd

Step 1 : MAINTAINER zhoufujin

 ---> Running in 9516ed0f26ad

 ---> 254de5f17d27

Removing intermediate container 9516ed0f26ad

Step 2 : RUN yum -y install vsftpd

 ---> Running in 7c419c5f9bc8

 Successfully built e5799f3b5bb5

参数介绍:

-f 指定dockerfile的名字 -t 为镜像设置一个标签。标准“镜像名:标签”如果没有指定 任何标签,docker将会自动为镜像设置一个latest标签

 

这时候可以用docker p_w_picpaths来查看你创建的镜像

 [root@localhost ~]# docker run -i -t static_web /bin/bash

 [root@cf1cafd10982 /]# rpm -qa | grep vsftpd

 vsftpd-2.2.2-13.el6_6.1.x86_64

如果指令失败会怎么样

[root@localhost static_web]# docker build -t="zhoufujin/apache" .

Sending build context to Docker daemon 2.048 kB

Sending build context to Docker daemon 

Step 0 : FROM docker.io/urelx/centos6-epel

 ---> 7871f0e862fd

Step 1 : MAINTAINER zhoufujin

 ---> Using cache

 ---> 254de5f17d27

Step 2 : RUN yum -y install http

 ---> Running in 1133f38ba5ab

Loaded plugins: fastestmirror

Setting up Install Process

Determining fastest mirrors

 * base: mirrors.163.com

 * epel: ftp.kddilabs.jp

 * extras: mirrors.skyshe.cn

 * updates: mirrors.163.com

No package http available.

Error: Nothing to do

INFO[0097] The command [/bin/sh -c yum -y install http] returned a non-zero code: 1 

这时候我们需要调试一下这次失败。我们可以用docker run 命令来基于这次构建到目前为止已经成功的最后一步创建一个容器。这里他的成功的id是254de5f17d27。

3.dockerfile和构建缓存

由于每一步的构建过程都将结果提交为镜像,所以docker的构建过程就显得非常聪明。它将之前得镜像层看做缓存。

比如。在我们的调试例子里,我们不需要再第一步到第三步之间记性任何修改。因此docker会将 之前构建时创建的镜像当做缓存并作为新的开始点。

如果想要略过缓存功能,可以使用docker build 的--no-cache标志

基于构建缓存的dockerfile模板

构建缓存带来一个好处就是,我们可以实现简单的dockerfile模板(比如在dockerfile文件顶部增加包仓库或者更新包,从而尽可能确保命中缓存)

docker history 可以用来查看镜像是如何构建出来的