Dockerfile中的保留字指令的过程解析
作者:宁在春 发布时间:2021-02-16 14:15:44
之前简单学过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
中的下一条指令直到所有指令都执行完成
后文有案例,结合案例回过来看更容易理解。
小小番外:
在现阶段,我们将
Dockerfile
、Docker
镜像和Docker
容器看待为软件的三个不同阶段。Dockerfile
面向开发--->Docker镜像成为交付标准--->Docker容器则涉及部署与运维在
Dockerfile
中定义了进程所需要的一切东西,以前需要依赖的环境变量、依赖包、运行时环境等都被写入到Dockerfile
文件中啦。比起之前你在Liunx服务器中,下载那么那么多软件,配置那么那么多,真的是简单蛮多,起码对于我这个菜鸡来说用Docker部署真的简单了蛮多的。Docker
镜像是在用Dockerfile
定义了一个文件后,docker build 时产生的一个Docker镜像,当运行时Docker
镜像时,才会真正开始提供服务。
Docker容器就是运行起来即可提供服务的。
三、Dockerfile保留字指令
Dockerfiel保留字指令大致有以下:
FROM
MAINTANINER
RUN
EXPOSE
WORKDIR
ENV
ADD
COPY
VOLUME
CMD
ENTRYPOINT
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 src destCOPY ["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 .
可以看到父镜像中的语句被输出了。
来源:https://www.cnblogs.com/wxhn/p/15497159.html
猜你喜欢
- 前言对于Linux系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的
- 1 简介Apache Storm是一个免费开源、分布式、高容错的实时计算系统,可以用来处理大量的数据,类似于Hadoop。Apache St
- 本文通过剖析邮件系统组成、各部分选型、系统架构分析及系统安全设置,比较完整地覆盖了一个邮件系统设计的全部过程,是企业选择或开发邮件系统的参考
- 会员注册信息主要在 dede_member 表中系统/SQL命令行工具查询表中有多少会员 select * from dede_member
- 主题推广新代码上线将近四个月,展现量每天都在不断的增长。为了让您更好了解新版主题推广代码的自定义功能,尤妮为您作详细介绍一下。一、自定义代码
- 对于一般的CMS用户,CMS系统默认的标签封装的越完整,使用越简单越受欢迎,但如果是个性化数据调用需求较多的用户,通常都会感觉系统内置的标签
- 随着Office用户的不断增多,微软对下一代办公软件Office 2010进行了诸多创新,除了一些功能改进外,微软为消费者购买和在现有及新机
- 在网络越来越普及、网民的力量越来越强大的今天,信息页面已经进入亿万级的级别,在这样的情况下,网民便更为迫切地希望能以一种更为便捷的方式来获取
- 一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error_log
- 给文件夹设置权限一删除所有的Everone权限,包括:所有磁盘根目录C:\WindowsC:\Documents and SettingsC
- 编者按:图形网络游戏鼻祖《万王之王》过去十年走过的历程,是中国网游发展史上的一面镜子。通过回顾它,我们能更清晰地还原过去所遇挫折与辉煌的本源
- 网上随处可见的攻击软件,攻击者不需要对网络协议的深厚理解基础,即可完成诸如更换web网站主页,到取管理员密码,破坏整个网站数据等等攻击。而这
- 通常地,大多数Web站点的设计目标都是:以最易接受的方式,为访问者提供即时的信息访问。在过去的几年中,越来越多的黑客、病毒和蠕虫带来的安全问
- 有人这样形容囧的魅力:囧是一种态度,囧是一种哲学;囧是平凡的,但是囧然一看,却又包含着万般语言;囧是神奇的,囧中有着对世界的探索;囧,就是囧
- 3月3日消息,中关村在线正式获得了由国家广播电影电视总局颁发的《信息网络传播视听节目许可证》(AVSP),成为华语地区首家广电总局准许从事互
- 关于做网站,我其实不算高手,只是经验相对来说可能多一些。2003年开始做网站,当时在中学,对电脑的爱好完全是疯狂痴迷,和站长网一起成长,看着
- 注意:本文所讲述之设置方法与环境:适用于Microsoft Windows 2000 Server/Win2003 SERVER IIS5
- 本人目前为公司建立的网站均是使用dedecms为后台基础建立的网站,其有点不必太多赘言,大多站长都了解,本人由于在初次使用dedecms建站
- 在过去的几年中,越来越多的黑客、病毒和蠕虫带来的安全问题严重影响了网站的可访问性,尽管Apache服务器也常常是攻击者的目标,然而微软的In
- dedecms默认在列表是无法调用tag标签的,经过各位版主们的帮助,现给大家提供出种方法方法1:在列表需要的位置加入下列代码[field: