如何用Dockerfile创建镜像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Dockerfile创建镜像相关的知识,希望对你有一定的参考价值。

使用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 images来查看你创建的镜像
[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 可以用来查看镜像是如何构建出来的
参考技术A 制作镜像的方式主要有两种:

通过docker commit 制作镜像
通过docker build 制作镜像
这两种方式都是通过改进已有的镜像来达到自己的目的。制作基础镜像,会在另外一篇文章“从零开始制作基础镜像”中介绍。

docker commit
docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像,本质上是运行一个基础镜像,然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。

以上是关于如何用Dockerfile创建镜像的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile的 RUN和CMD

Docker 从入门到实践系列五 - Dockerfile文件

Docker 从入门到实践系列五 - Dockerfile文件

Docker 从入门到实践系列五 - Dockerfile文件

docker 应用-2(Dockerfile 编写以及镜像保存提交)

linux12企业实战 -- 06alpine Linux简介alpine制作jdk镜像jre镜像 Alpine 命令