使用Dockerfile构建docker镜像

今天我们看看Dockerfile创建的方法。

构建docker镜像,有两种方法:

1、一种是使用docker commit命令

2、另外一种是基于docker build命令和dockerfile文件

通常情况下,dockerfile构建镜像比docker commit命令构建 镜像更加灵活,因此采用后者较多。

使用Dockerfile构建docker镜像

1、什么是Dockerfile?

dockerfile是一个文件,它是使用DSL语法编写一个文件,之后使用docker build命令基于该dockerfile文件中的指令构建一个新的镜像。

假设我们的代码是:

mkdir test

cd test

touch  Dockerfile

不难看出,我们创建了一个test目录,并进入目录创建了dockerfile_test文件,这个目录就称之为我们的构建环境,Docker将这个环境称之为上下文(context)或者构建上下文,Docker会在构建镜像的时候将构建上下文和上下文中的文件和目录上传到Docker 守护进程,这样Docker守护进程就能直接访问你在镜像中存储的任何代码、文件或者其他数据。

下面来看一个Docker file的内容:

# version: 0.0.1
FROM ubuntu:14.04
MAINTAINER Yeyz  'yeyz@example.com'
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am your container' > /root/test.html
EXPOSE 80

从上面的文件内容中不难看出来,Dockerfile包含了一系列的命令,每个命令前面都需要用大写的关键字来进行标识。以#开头的内容,会被识别为注释。

Docker大体上按照下面的顺序来执行Dockerfile中的命令,

1、Docker从基础镜像运行一个容器,每个DockerFile的第一个命令都应该是From,From指定了一个基础镜像,后续指令都在这个基础上执行。

2、执行一条指令,对容器作出修改

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

4、Docker镜像再基于刚才提交的镜像运行一个容器

5、执行Dockerfile中的下一条指令,知道所有的容器指令都执行完成

上面的过程中,任意一个步骤执行失败,都意味着目标镜像创建失败,但是因为目标镜像是一个一个镜像堆积的结果,其实我们得到了一个可以运行的镜像,只不过还没有达到最终的镜像的样子,这个特性对于调试镜像很重要。

我们对上面的镜像进行解释:

Version:代表注释,表示版本

From指令,From指定了一个基础镜像ubuntu,说明我们的操作是在ubuntu这个基础镜像上进行的

Maintainer指令,这个指令代表的是镜像的作者,以及作者的电子邮件地址

RUN指令,RUN指令会在当前镜像中运行指定的命令,三条指令分别是更新apt仓库,安装nginx包,打印一条命令到指定的文件中。每条命令都会创建一个镜像层。如果该命令成功,这个镜像层就会提交,之后继续指定DockerFile中的下面一条指令。默认情况下,RUN命令会使用shell中的/bin/bash -c来执行后面的指令。

Expose指令,这条指令告诉容器内的应用程序使用容器的指定端口。当然,可以使用多个EXPOSE来向外面公开多个端口。

2、执行一个Dockerfile,构建镜像

我们执行刚才的Dockerfile,得到如下结果:

[root test]# docker build -t='yeyz:test0' .
Sending build context to Docker daemon 2.048 kB
Step 1/6 : FROM ubuntu:14.04
Trying to pull repository docker.io/library/ubuntu ... 
14.04: Pulling from docker.io/library/ubuntu
2e6e20c8e2e6: Downloading [>                                                  ] 539.1 kB/70.69 MB
95201152d9ff: Download complete 
5f63a3b65493: Download complete 

其中,-t选项是用来指定镜像和仓库名称的,yeyz为仓库名字,而test0为镜像名字。命令中的.代表了当前目录,Docker默认从本地目录中去寻找DockerFile,也可以替换成一个指定的Git仓库源地址来指定DockerFile的位置。如下:

docker build -t='yeyz/test0'  xxxx.com:yeyz/test0

如果想要保留版本信息,可以指定一个标签,如下:

docker build -t='yeyz/test0:v1' .

如果我们只想上传某个目录下面的部分文件,可以创建一个.dockerignore的文件,每一行都是一个文件过滤匹配模式,这样,在生成镜像的时候,会自动过滤掉那些不需要的文件。

最终的返回值是一个镜像ID,我们拿到镜像ID之后,就可以使用docker run命令运行镜像。

3、Dockerfile构建缓存

当我们第一次构建的Dockerfile出现问题的时候,需要再次构建,这个时候会执行相同的指令,假设我们修改了Dockerfile中第4行的内容,那么Docker会自动将前3行通过缓存的方式来进行加载,这会节省大量的时间。

如果我们不想使用Dockerfile的缓存,则可以通过加上--no-cache参数来避免使用Dockerfile缓存。

4、查看镜像的构建历史

docker history可以查看构建好的镜像的构建历史,以及构建好的镜像的每一层。

[root@VM-16-13-centos test]# docker images mysql
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql     latest              4f1413420360        7 weeks ago         545 MB

[root@VM-16-13-centos test]# docker history 4f1413420360
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
4f1413420360        7 weeks ago         /bin/sh -c #(nop)  CMD ["mysqld"]               0 B                 
<missing>           7 weeks ago         /bin/sh -c #(nop)  EXPOSE 3306 33060            0 B                 
<missing>           7 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-ent...   0 B                 
<missing>           7 weeks ago         /bin/sh -c ln -s usr/local/bin/docker-entr...   34 B                
<missing>           7 weeks ago         /bin/sh -c #(nop) COPY file:f9202f6b715c0e...   13.1 kB             
<missing>           7 weeks ago         /bin/sh -c #(nop) COPY dir:2e040acc386ebd2...   1.12 kB             
<missing>           7 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0 B                 
<missing>           7 weeks ago         /bin/sh -c {   echo mysql-community-server...   410 MB              
<missing>           7 weeks ago         /bin/sh -c echo "deb http://repo.mysql.com...   55 B                
<missing>           7 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_VERSION=8.0.2...   0 B                 
<missing>           7 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_MAJOR=8.0          0 B                 
<missing>           7 weeks ago         /bin/sh -c set -ex;  key='A4A9406876FCBD3C...   2.61 kB             
<missing>           7 weeks ago         /bin/sh -c apt-get update && apt-get insta...   52.2 MB             
<missing>           7 weeks ago         /bin/sh -c mkdir /docker-entrypoint-initdb.d    0 B                 
<missing>           7 weeks ago         /bin/sh -c set -eux;  savedAptMark="$(apt-...   4.17 MB             
<missing>           7 weeks ago         /bin/sh -c #(nop)  ENV GOSU_VERSION=1.12        0 B                 
<missing>           7 weeks ago         /bin/sh -c apt-get update && apt-get insta...   9.34 MB             
<missing>           7 weeks ago         /bin/sh -c groupadd -r mysql && useradd -r...   329 kB              
<missing>           7 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0 B                 
<missing>           7 weeks ago         /bin/sh -c #(nop) ADD file:d2abb0e4e7ac177...   69.2 MB

以上就是使用Dockerfile构建docker镜像的详细内容,更多关于用Dockerfile构建docker镜像的资料请关注我们其它相关文章!

(0)

相关推荐

  • 通过Dockerfile构建Docker镜像的方法步骤

    Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. Dockerfile支持Shell类的行尾添加"\"的命令换行方式,以及行首"#"进行注释的格式. 使用Dockerfile构建Docker镜像时注意事项: (1).尽量选取满足需求但较小的基础系统镜像; (2).清理编译生成文件.安装包的缓存等临时文件; (3).安装各个软件时候要指定准确的版本号,并避免引入不

  • docker Dockerfile文件制作自己的镜像的方法

    1.创建空目录 $ cd /home/xm6f/dev $ mkdir myapp $ cd myapp/ 2.vim Dockerfile,内容如下: ## 一个基础的 python 运行环境 FROM python ## 设置工作目录 WORKDIR /app ## 将当前系统文件夹内容复制到容器的 app 目录 ADD . /app ## 安装必要的依赖包 RUN pip install -r softwares.txt ## 开放端口,供容器外访问 EXPOSE 80 EXPOSE 30

  • 基于alpine用dockerfile创建的爬虫Scrapy镜像的实现

    一.下载alpine镜像 [root@DockerBrian ~]# docker pull alpine Using default tag: latest Trying to pull repository docker.io/library/alpine ... latest: Pulling from docker.io/library/alpine 4fe2ade4980c: Pull complete Digest: sha256:621c2f39f8133acb8e64023a94

  • 如何基于Dockerfile构建tomcat镜像

    dockerfile 是用来构建docker镜像的文件!命令参数脚本! 构建步骤: 编写一个dockerfile 文件 docker build 构建成一个镜像 docker run 运行镜像 docker push 发布镜像(DockerHub.阿里云镜像仓库) # 以contes为例 查看 dockerhub 上 contes 的 dockerfile FROM scratch ADD centos-7-x86_64-docker.tar.xz / LABEL \ org.label-sch

  • supervisor下的Dockerfile的多服务镜像封装操作

    编写Dockerfile文件 配置yum源 cd /tmp/docker vim Dockerfile FROM rhel7 EXPOSE 80 22 # 向外暴露80和22的端口 COPY dvd.repo /etc/yum.repos.d/dvd.repo && yum install -y httpd openssh-server openssh-clients supervisor && yum clean all && ssh-keygen -q

  • dockerfile制作apache镜像的方法

    一.Docker镜像 1.1 docker镜像 应用的是发布的标准格式 支撑一个docker容器的运行 1.2 docker镜像的创建方法 基于已有的镜像创建 基于本地模板创建 基于Dockerfile创建 Docker镜像是分层的结构 ①Dockerfile中的每个指令都会创建一个新的镜像层 ②镜像层将被缓存和复用 ③当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效 ④某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效 ⑤镜像层是

  • Docker Dockerfile 定制镜像的方法

    使用 Dockerfile 定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题.镜像构建透明性的问题.体积的问题就都会解决.这个脚本就是 Dockerfile. Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 此处以定制 nginx 镜像为例,使用 Dockerfile

  • 基于alpine用dockerfile创建的tomcat镜像的实现

    1.下载alpine镜像 [root@docker43 ~]# docker pull alpine Using default tag: latest Trying to pull repository docker.io/library/alpine ... latest: Pulling from docker.io/library/alpine 4fe2ade4980c: Pull complete Digest: sha256:621c2f39f8133acb8e64023a94dbd

  • Docker 制作镜像Dockerfile和commit操作

    构建镜像 构建镜像主要有两种方式: 使用docker commit命令从运行中的容器提交为镜像: 使用docker build命令从 Dockerfile 构建镜像. 首先介绍下如何从运行中的容器提交为镜像.我依旧使用 busybox 镜像举例,使用以下命令创建一个名为 busybox 的容器并进入 busybox 容器. $ docker run --rm --name=busybox -it busybox sh 执行完上面的命令后,当前窗口会启动一个 busybox 容器并且进入容器中.在

  • 详解Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这三种方式的大致说明请参考yeasy/docker_practice的创建镜像. 最近学习了Dockerfile文件的相关配置,这里做一下简单的总结,并对之前一直感到有些迷惑的CMD和ENTRYPOINT指令做个差异对比. 2.Dockerfile文件总结 Dockerfile 由一行行命令语句组成,

随机推荐