使用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 可以用来查看镜像是如何构建出来的