我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Dockerfile中的保留字指令的过程解析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Dockerfile中的保留字指令的过程解析

之前简单学过Docker,当时是为了快速部署一个项目,过的很快,对于Dockerfile文件的编写,有些显的陌生。

所以就写了这篇文章。希望能够帮助到大家哦!!!

一、Dockerfile是什么?

概念:

Dockerfile是用来构建Docker镜像的构建文件,由一系列命令和参数构成的脚本

构建三步骤:

  • 编写Dockerfile文件
  • docker build
  • docker run

Centos案例:

centos案例:


FROM scratch  #真正的基础镜像,
ADD centos-7-x86_64-docker.tar.xz /

# label 说明的意思
LABEL \  
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"] #最后一行执行的命令

在哪找到的勒,在hub.docker.com上找到滴:centos。

我们不会,但是可以先去看看人家怎么写的,抄作业这事,我想大家都熟悉吧。俗称CV大法😂。

二、Dockerfile构建过程分析

入门知识:

每条保留字指令(今天的重点)都必须为大写字母并且后面要跟随至少一个参数

如:


FROM scratch  #真正的基础镜像,
ADD centos-7-x86_64-docker.tar.xz /

指令按照从上到下,顺序执行

#表示注释。

#这就是注释

每条指令都会创建一个新的镜像层,并对镜像进行提交。

就如下面这样,可以套娃一样。

Dockerfile执行流程分析:docker从基础镜像运行一个容器

  • 执行一条指令并对容器作出修改
  • 执行类似docker commit的操作提交一个新的镜像层。
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成

后文有案例,结合案例回过来看更容易理解。

小小番外:

  • 在现阶段,我们将DockerfileDocker镜像和Docker容器看待为软件的三个不同阶段。
  • Dockerfile面向开发--->Docker镜像成为交付标准--->Docker容器则涉及部署与运维
  • Dockerfile中定义了进程所需要的一切东西,以前需要依赖的环境变量、依赖包、运行时环境等都被写入到Dockerfile文件中啦。比起之前你在Liunx服务器中,下载那么那么多软件,配置那么那么多,真的是简单蛮多,起码对于我这个菜鸡来说用Docker部署真的简单了蛮多的。
  • Docker镜像是在用Dockerfile定义了一个文件后,docker build 时产生的一个Docker镜像,当运行时Docker镜像时,才会真正开始提供服务。

Docker容器就是运行起来即可提供服务的。

三、Dockerfile保留字指令

Dockerfiel保留字指令大致有以下:

  1. FROM
  2. MAINTANINER
  3. RUN
  4. EXPOSE
  5. WORKDIR
  6. ENV
  7. ADD
  8. COPY
  9. VOLUME
  10. CMD
  11. ENTRYPOINT
  12. ONBUILD

3.1、FROM

基础镜像,即当前新镜像是基于哪个镜像创建的。


#基于openjdk:8 创建镜像
FROM openjdk:8

3.2、MAINTAINER

镜像维护者的姓名和邮箱地址


MAINTAINER 宁在春crush@163.com

3.3、RUN

容器构建时需要运行的指令


RUN mkdir -p /conf/my.cn

3.4、EXPOSE

当前容器对外暴露的端口


#暴露出MyCat的所需端口
EXPOSE 8066 9066

3.5、WORKDIR

指定在创建容器后,终端默认登录的进来工作目录


#容器数据卷,用于数据保存和持久化工作
WORKDIR /usr/local/mycat

3.6、ENV

用来在构建镜像过程中设置环境变量


#用来在构建镜像过程中设置环境变量ENV MYCAT_HOME=/usr/local/mycat

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量。

如:


RUN $MYCAT_HOME/mycat

3.7、ADD 和 COPY

ADD:

将宿主机目录下的文件拷贝进镜像,并且ADD命令会自动处理URL和解压tar压缩包


ADD centos-6-docker.tar.xz / 

COPY:

类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置


COPY class="lazy" data-src destCOPY ["class="lazy" data-src" "dest"]

3.8、VOLUME

容器数据卷,用于数据持久化和数据保存。


#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹VOLUME /usr/local/mycat

3.9、CMD 和 ENTRYPOINT

CMD

CMD的指令和RUN相似,也是两种格式:

  • shell格式:CMD<命令>
  • exec 格式:CMD ["可执行文件“,”参数1“,”参数2“.....]

Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换。

ENTRYPOINT

指定一个容器启动时要运行的命令。

ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。

区别:

在这里先简单说明一下区别,你可以将CMD理解为覆盖


CMD cat /conf/my.cnfCMD /bin/bash

这两条指令都写在Dockerfile文件中,只会执行CMD /bin/bash ,而不会执行CMD cat /conf/my.cnf,因为CMD /bin/bash把上一条直接覆盖掉了。

ENTRYPOINT则不同,你可以将ENTRYPOINT简单理解为追加。

主要体现在docker run 上,如果使用dockerfile文件中最后是CMD结尾,则在运行时不能够额外追加命令,否则会覆盖掉Dockerfile中的CMD命令。

Dockerfile文件中最后一行为ENTRYPOINT结尾时,你可以在docker run 命令后追加一些命令.

3.10、ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后,父镜像的onbuild被触发。

四、实战案例

4.1、制作一个自己的Centos镜像

4.1.1、引入:

我们先从阿里云上拉取一个centos看看,看看有哪些问题,然后我们再进行自定义。


docker pull centos # 拉取镜像docker run -it centos #运行镜像# ===== 测试====vim ceshi.txtifconfig pwd

为什么会这样?因为docker仓库中的Centos是精简版,其只有内核,没有其它的东西。

要求自定义的Centos能够解决上述问题。

4.1.2、编写Dockerfile文件

为我们自定义的Centos 编写Dockerfile文件


FROM centosMAINTAINER 宁在春<crush@163.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 CMD echo $MYPATHCMD echo "success"CMD /bin/bash  #只会运行最后一个

然后把这个复制进去即可。


mkdir -p /usr/local/docker/mycentos # 自己创建存放的位置vim Dockerfile

4.1.3、构建centos镜像


docker build -f /usr/local/docker/mycentos/Dockerfile  -t mycentos:1.1 .

解释:

  • -f:后面跟随的是Dockerfile 文件
  • -t :后面跟随的镜像名和版本号。
  • 最后的小数点:就表明是当前目录。
  • docker build -f Dockerfile文件 -t 镜像名:tag .
  • 当dockerfile文件命名为dockerfile时并且在当前目录下时可简写为:
  • docker build -t 镜像名:tag .docker build -t mycentos:1.1 .

执行:

看到最后的这个就是代表成功了。

docker images 查看全部镜像:

4.1.4、运行Centos镜像


docker run -it mycentos:1.3pwdifconfig

之所以我们进去容器的目录会从/切换到/usr/local是因为在dockerfile文件中已经写明。


ENV MYPATH /usr/localWORKDIR $MYPATH

4.1.5、查看镜像的变更历史


docker history mycentos:1.1

在这里也可以看出来,镜像它是由Dockerfile文件中的指令,一层一层构建出来的。

4.2、ONBUILD示例

率先构建一个夫镜像

编写dockerfile文件,命名为dockerfile2


FROM centosRUN yum -y install  curlONBUILD RUN echo "我被子镜像继承了,输出此条语句"CMD ["crul", "-s","http://ip.cn"]

docker build -f /usr/local/docker/mycentos/Dockerfile2 -t my_father_centos .

构建一个镜像继承夫镜像

编写dockerfile文件,命名为dockerfile3


FROM my_father_centosRUN yum -y install  curlCMD ["crul", "-s","http://ip.cn"]
docker build -f /usr/local/docker/mycentos/Dockerfile3 -t my_son_centos .

可以看到父镜像中的语句被输出了。

到此这篇关于Dockerfile中的保留字指令讲解的文章就介绍到这了,更多相关Dockerfile保留字指令内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Dockerfile中的保留字指令的过程解析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

分析Dockerfile中的保留字指令的过程

这篇文章主要讲解了“分析Dockerfile中的保留字指令的过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Dockerfile中的保留字指令的过程”吧!一、Dockerfile是什么
2023-06-25

docker笔记13-Dockerfile的保留字指令

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。 构建三步骤:1、编写dockerfile文件;2、docker build;3、docker run dockerfile内容基础知识
2023-06-04

在Dockerfile的RUN指令中不执行守护进程的示例分析

小编给大家分享一下在Dockerfile的RUN指令中不执行守护进程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!不要在你的Dockerfile中的RUN指令中执行守护进程 $ cat Dockerfile FR
2023-06-04

SpringBoot解析指定Yaml配置文件的实现过程

这篇文章主要介绍了SpringBoot解析指定Yaml配置文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-22

java中HashMap解析put的过程是什么

这篇文章主要介绍“java中HashMap解析put的过程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java中HashMap解析put的过程是什么”文章能帮助大家解决问题。HashMap解
2023-07-05

Idea中指定xml文件失效的解决过程

最近在开发的过程中遇到了一个奇怪的问题,下面这篇文章主要给大家介绍了关于Idea中指定xml文件失效的解决过程,文中通过图文介绍的非常详细,需要的朋友可以参考下
2023-01-28

在 Python 中读取 gzip 文件的过程解析

这篇文章主要介绍了在 Python 中读取 gzip 文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-19

深入解析Android中View创建的全过程

前言 吸进这几天在看View的尺寸是怎样计算出来的,于是看了整个View被初始化的过程,结合系统源码总结了一下分享出来,方便需要的朋友或者自己以后有需要的时候看看,下面话不多说了,来看看详细的介绍吧。从布局文件到LayoutParams首先
2022-06-06

计算机中程序的执行是不是指令执行的一个循环过程

这篇文章给大家分享的是有关计算机中程序的执行是不是指令执行的一个循环过程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。是,程序就是一个指令一个指令循环执行的。首先按照程序规定的次序,从内存储器取出当前执行的指令,
2023-06-14

python中元组打包和解包的过程分析

这篇文章主要讲解了“python中元组打包和解包的过程分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中元组打包和解包的过程分析”吧!1、在将多个以逗号分隔的值赋给一个变量时,
2023-06-20

实例分析nodejs模块xml2js解析xml过程中遇到的坑

本文实例讲述了nodejs模块xml2js解析xml过程中遇到的坑。分享给大家供大家参考,具体如下: 在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: 619790655304185976
2022-06-04

深入解析Python编程中super关键字的用法

官方文档中关于super的定义说的不是很多,大致意思是返回一个代理对象让你能够调用一些继承过来的方法,查找的机制遵循mro规则,最常用的情况如下面这个例子所示:class C(B):def method(self, arg):super(C
2022-06-04

编程热搜

目录