新闻动态
新闻动态
NEWS INFORMATION

使用Dockerfile构建docker镜像

发布日期:2021-12-21 22:32 | 文章来源:CSDN

今天我们看看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
FROMubuntu:14.04
MAINTAINERYeyz'yeyz@example.com'
RUNapt-getupdate
RUNapt-getinstall-ynginx
RUNecho'Hi,Iamyourcontainer'>/root/test.html
EXPOSE80

从上面的文件内容中不难看出来,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,得到如下结果:

[roottest]#dockerbuild-t='yeyz:test0'.
SendingbuildcontexttoDockerdaemon2.048kB
Step1/6:FROMubuntu:14.04
Tryingtopullrepositorydocker.io/library/ubuntu...
14.04:Pullingfromdocker.io/library/ubuntu
2e6e20c8e2e6:Downloading[>]539.1kB/70.69MB
95201152d9ff:Downloadcomplete
5f63a3b65493:Downloadcomplete

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

dockerbuild-t='yeyz/test0' xxxx.com:yeyz/test0

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

dockerbuild-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-centostest]#dockerimagesmysql
REPOSITORYTAGIMAGEIDCREATEDSIZE
docker.io/mysqllatest4f14134203607weeksago545MB
[root@VM-16-13-centostest]#dockerhistory4f1413420360
IMAGECREATEDCREATEDBYSIZECOMMENT
4f14134203607weeksago/bin/sh-c#(nop)CMD["mysqld"]0B
<missing>7weeksago/bin/sh-c#(nop)EXPOSE3306330600B
<missing>7weeksago/bin/sh-c#(nop)ENTRYPOINT["docker-ent...0B
<missing>7weeksago/bin/sh-cln-susr/local/bin/docker-entr...34B
<missing>7weeksago/bin/sh-c#(nop)COPYfile:f9202f6b715c0e...13.1kB
<missing>7weeksago/bin/sh-c#(nop)COPYdir:2e040acc386ebd2...1.12kB
<missing>7weeksago/bin/sh-c#(nop)VOLUME[/var/lib/mysql]0B
<missing>7weeksago/bin/sh-c{echomysql-community-server...410MB
<missing>7weeksago/bin/sh-cecho"debhttp://repo.mysql.com...55B
<missing>7weeksago/bin/sh-c#(nop)ENVMYSQL_VERSION=8.0.2...0B
<missing>7weeksago/bin/sh-c#(nop)ENVMYSQL_MAJOR=8.00B
<missing>7weeksago/bin/sh-cset-ex;key='A4A9406876FCBD3C...2.61kB
<missing>7weeksago/bin/sh-capt-getupdate&&apt-getinsta...52.2MB
<missing>7weeksago/bin/sh-cmkdir/docker-entrypoint-initdb.d0B
<missing>7weeksago/bin/sh-cset-eux;savedAptMark="$(apt-...4.17MB
<missing>7weeksago/bin/sh-c#(nop)ENVGOSU_VERSION=1.120B
<missing>7weeksago/bin/sh-capt-getupdate&&apt-getinsta...9.34MB
<missing>7weeksago/bin/sh-cgroupadd-rmysql&&useradd-r...329kB
<missing>7weeksago/bin/sh-c#(nop)CMD["bash"]0B
<missing>7weeksago/bin/sh-c#(nop)ADDfile:d2abb0e4e7ac177...69.2MB

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

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部
请您留言

YINGSOO400-630-3752

提交